Commit f66c110c by Greg Hartman

Initial work to connect gralloc to egl::Image

Change-Id: Ia11a9520bb6525dc367e0b2956850574b29e4796 Reviewed-on: https://swiftshader-review.googlesource.com/2900Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 46c70930
...@@ -9,6 +9,7 @@ LOCAL_SRC_FILES := \ ...@@ -9,6 +9,7 @@ LOCAL_SRC_FILES := \
Common/CPUID.cpp \ Common/CPUID.cpp \
Common/Configurator.cpp \ Common/Configurator.cpp \
Common/DebugAndroid.cpp \ Common/DebugAndroid.cpp \
Common/GrallocAndroid.cpp \
Common/Half.cpp \ Common/Half.cpp \
Common/Math.cpp \ Common/Math.cpp \
Common/Memory.cpp \ Common/Memory.cpp \
...@@ -65,6 +66,7 @@ LOCAL_SRC_FILES += \ ...@@ -65,6 +66,7 @@ LOCAL_SRC_FILES += \
Shader/VertexShader.cpp \ Shader/VertexShader.cpp \
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
OpenGL/common/AndroidCommon.cpp \
OpenGL/common/NameSpace.cpp \ OpenGL/common/NameSpace.cpp \
OpenGL/common/Object.cpp \ OpenGL/common/Object.cpp \
OpenGL/common/MatrixStack.cpp \ OpenGL/common/MatrixStack.cpp \
......
#include "GrallocAndroid.hpp"
#include <cutils/log.h>
GrallocModule* GrallocModule::getInstance()
{
static GrallocModule instance;
return &instance;
}
GrallocModule::GrallocModule()
{
const hw_module_t* module;
hw_get_module("converting_gralloc", &module);
if (module)
{
m_supportsConversion = true;
ALOGI("Loaded converting gralloc");
}
else
{
m_supportsConversion = false;
ALOGE("Falling back to standard gralloc with reduced format support");
hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
}
if (!module)
{
ALOGE("Failed to load standard gralloc");
}
m_module = reinterpret_cast<const gralloc_module_t*>(module);
}
#ifndef GRALLOC_ANDROID
#define GRALLOC_ANDROID
#include <hardware/gralloc.h>
class GrallocModule
{
public:
static GrallocModule* getInstance();
bool supportsConversion() const { return m_supportsConversion; }
int lock(
buffer_handle_t handle, int usage,
int left, int top, int width, int height, void**vaddr) {
return m_module->lock(m_module, handle, 0, left, top, width, height, vaddr);
}
int unlock(buffer_handle_t handle) {
return m_module->unlock(m_module, handle);
}
private:
GrallocModule();
bool m_supportsConversion;
const gralloc_module_t* m_module;
};
#endif // GRALLOC_ANDROID
#include <system/window.h>
#include "GL/glcorearb.h"
#include "GL/glext.h"
#include "EGL/egl.h"
#define GL_RGB565_OES 0x8D62
#include "AndroidCommon.hpp"
#include "../../Common/DebugAndroid.hpp"
#include "../../Common/GrallocAndroid.hpp"
GLenum getColorFormatFromAndroid(int format)
{
switch(format)
{
case HAL_PIXEL_FORMAT_RGBA_8888:
return GL_RGBA;
case HAL_PIXEL_FORMAT_RGBX_8888:
return GL_RGB;
case HAL_PIXEL_FORMAT_RGB_888:
return GL_RGB;
case HAL_PIXEL_FORMAT_BGRA_8888:
return GL_BGRA_EXT;
case HAL_PIXEL_FORMAT_RGB_565:
#if LATER
if (GrallocModule::getInstance()->supportsConversion()) {
return GL_RGB565_OES;
} else {
UNIMPLEMENTED();
return GL_RGB565_OES;
}
#else
return GL_RGB565_OES;
#endif
case HAL_PIXEL_FORMAT_YV12:
case HAL_PIXEL_FORMAT_Y8:
case HAL_PIXEL_FORMAT_Y16:
case HAL_PIXEL_FORMAT_RAW_SENSOR:
case HAL_PIXEL_FORMAT_BLOB:
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
case HAL_PIXEL_FORMAT_YCbCr_420_888:
default:
UNIMPLEMENTED();
}
return GL_RGBA;
}
// Used internally
GLenum getPixelFormatFromAndroid(int format)
{
switch(format)
{
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_RGB_888:
case HAL_PIXEL_FORMAT_BGRA_8888:
return GL_UNSIGNED_BYTE;
case HAL_PIXEL_FORMAT_RGB_565:
#if LATER
if (GrallocModule::getInstance()->supportsConversion()) {
return GL_UNSIGNED_SHORT_5_6_5;
} else {
UNIMPLEMENTED();
return GL_UNSIGNED_SHORT_5_6_5;
}
#else
return GL_UNSIGNED_SHORT_5_6_5;
#endif
case HAL_PIXEL_FORMAT_YV12:
case HAL_PIXEL_FORMAT_Y8:
case HAL_PIXEL_FORMAT_Y16:
case HAL_PIXEL_FORMAT_RAW_SENSOR:
case HAL_PIXEL_FORMAT_BLOB:
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
case HAL_PIXEL_FORMAT_YCbCr_420_888:
default:
UNIMPLEMENTED();
}
return GL_UNSIGNED_BYTE;
}
// Used in V1 & V2 Context.cpp
GLenum isSupportedAndroidBuffer(GLuint name)
{
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
if(!name)
{
ALOGE("%s called with name==NULL %s:%d", __FUNCTION__, __FILE__, __LINE__);
return EGL_BAD_PARAMETER;
}
if(nativeBuffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
{
ALOGE("%s: failed: bad magic", __FUNCTION__);
return EGL_BAD_PARAMETER;
}
if(nativeBuffer->common.version != sizeof(ANativeWindowBuffer))
{
ALOGE("%s: failed: bad size", __FUNCTION__ );
return EGL_BAD_PARAMETER;
}
switch(nativeBuffer->format)
{
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
return EGL_SUCCESS;
case HAL_PIXEL_FORMAT_RGB_565:
#if LATER
if (GrallocModule::getInstance()->supportsConversion()) {
return EGL_SUCCESS;
} else {
ALOGE("%s: failed: bad format", __FUNCTION__ );
return EGL_BAD_PARAMETER;
}
#else
return EGL_SUCCESS;
#endif
default:
ALOGE("%s: failed: bad format", __FUNCTION__ );
return EGL_BAD_PARAMETER;
}
}
#ifndef ANDROID_COMMON #ifndef ANDROID_COMMON
#define ANDROID_COMMON #define ANDROID_COMMON
static inline GLenum getColorFormatFromAndroid(int format) // Used internally
{ GLenum getColorFormatFromAndroid(int format);
switch(format)
{ // Used internally
case HAL_PIXEL_FORMAT_RGBA_8888: GLenum getPixelFormatFromAndroid(int format);
return GL_RGBA;
case HAL_PIXEL_FORMAT_RGBX_8888: // Used in V1 & V2 Context.cpp
return GL_RGB; GLenum isSupportedAndroidBuffer(GLuint name);
case HAL_PIXEL_FORMAT_RGB_888:
return GL_RGB;
case HAL_PIXEL_FORMAT_BGRA_8888:
return GL_BGRA_EXT;
case HAL_PIXEL_FORMAT_RGB_565:
return GL_RGB565_OES;
case HAL_PIXEL_FORMAT_YV12:
case HAL_PIXEL_FORMAT_Y8:
case HAL_PIXEL_FORMAT_Y16:
case HAL_PIXEL_FORMAT_RAW_SENSOR:
case HAL_PIXEL_FORMAT_BLOB:
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
case HAL_PIXEL_FORMAT_YCbCr_420_888:
default:
UNIMPLEMENTED();
}
return GL_RGBA;
}
static inline GLenum getPixelFormatFromAndroid(int format) // Used in V1 & V2 Context.cpp
template <typename I> I* wrapAndroidNativeWindow(GLuint name)
{ {
switch(format) ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
{ ALOGV("%s: wrapping %p", __FUNCTION__, nativeBuffer);
case HAL_PIXEL_FORMAT_RGBA_8888: nativeBuffer->common.incRef(&nativeBuffer->common);
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_RGB_888: GLenum format = getColorFormatFromAndroid(nativeBuffer->format);
case HAL_PIXEL_FORMAT_BGRA_8888: GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);
return GL_UNSIGNED_BYTE;
case HAL_PIXEL_FORMAT_RGB_565: I *image = new I(0, nativeBuffer->width, nativeBuffer->height, format, type);
return GL_UNSIGNED_SHORT_5_6_5; image->setNativeBuffer(nativeBuffer);
case HAL_PIXEL_FORMAT_YV12: image->markShared();
case HAL_PIXEL_FORMAT_Y8:
case HAL_PIXEL_FORMAT_Y16: return image;
case HAL_PIXEL_FORMAT_RAW_SENSOR:
case HAL_PIXEL_FORMAT_BLOB:
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
case HAL_PIXEL_FORMAT_YCbCr_420_888:
default:
UNIMPLEMENTED();
}
return GL_UNSIGNED_BYTE;
} }
#endif // ANDROID_COMMON #endif // ANDROID_COMMON
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#if defined(__ANDROID__) #if defined(__ANDROID__)
#include <hardware/gralloc.h> #include <hardware/gralloc.h>
#include <system/window.h> #include <system/window.h>
#include "../../Common/GrallocAndroid.hpp"
#endif #endif
#ifdef __ANDROID__ #ifdef __ANDROID__
...@@ -35,7 +36,6 @@ public: ...@@ -35,7 +36,6 @@ public:
#if defined(__ANDROID__) #if defined(__ANDROID__)
nativeBuffer = 0; nativeBuffer = 0;
gralloc = 0;
#endif #endif
} }
...@@ -47,7 +47,6 @@ public: ...@@ -47,7 +47,6 @@ public:
#if defined(__ANDROID__) #if defined(__ANDROID__)
nativeBuffer = 0; nativeBuffer = 0;
gralloc = 0;
#endif #endif
} }
...@@ -185,35 +184,19 @@ protected: ...@@ -185,35 +184,19 @@ protected:
#if defined(__ANDROID__) #if defined(__ANDROID__)
ANativeWindowBuffer *nativeBuffer; ANativeWindowBuffer *nativeBuffer;
gralloc_module_t const *gralloc;
void initGralloc()
{
hw_module_t const *module;
hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
gralloc = reinterpret_cast<gralloc_module_t const*>(module);
}
void* lockNativeBuffer(int usage) void* lockNativeBuffer(int usage)
{ {
if(!gralloc)
{
initGralloc();
}
void *buffer = 0; void *buffer = 0;
gralloc->lock(gralloc, nativeBuffer->handle, usage, 0, 0, nativeBuffer->width, nativeBuffer->height, &buffer); GrallocModule::getInstance()->lock(
nativeBuffer->handle, usage, 0, 0,
nativeBuffer->width, nativeBuffer->height, &buffer);
return buffer; return buffer;
} }
void unlockNativeBuffer() void unlockNativeBuffer()
{ {
if(!gralloc) GrallocModule::getInstance()->unlock(nativeBuffer->handle);
{
initGralloc();
}
gralloc->unlock(gralloc, nativeBuffer->handle);
} }
#endif #endif
}; };
......
...@@ -2639,27 +2639,7 @@ EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint texture ...@@ -2639,27 +2639,7 @@ EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint texture
#if defined(__ANDROID__) #if defined(__ANDROID__)
else if(target == EGL_NATIVE_BUFFER_ANDROID) else if(target == EGL_NATIVE_BUFFER_ANDROID)
{ {
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name); return isSupportedAndroidBuffer(name);
if(nativeBuffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
{
return EGL_BAD_PARAMETER;
}
if(nativeBuffer->common.version != sizeof(ANativeWindowBuffer))
{
return EGL_BAD_PARAMETER;
}
switch(nativeBuffer->format)
{
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_RGB_565:
break;
default:
return EGL_BAD_PARAMETER;
}
} }
#endif #endif
else UNREACHABLE(); else UNREACHABLE();
...@@ -2684,17 +2664,7 @@ egl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textu ...@@ -2684,17 +2664,7 @@ egl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textu
#if defined(__ANDROID__) #if defined(__ANDROID__)
else if(target == EGL_NATIVE_BUFFER_ANDROID) else if(target == EGL_NATIVE_BUFFER_ANDROID)
{ {
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name); return wrapAndroidNativeWindow<es1::Image>(name);
nativeBuffer->common.incRef(&nativeBuffer->common);
GLenum format = getColorFormatFromAndroid(nativeBuffer->format);
GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);
es1::Image *image = new Image(0, nativeBuffer->width, nativeBuffer->height, format, type);
image->setNativeBuffer(nativeBuffer);
image->markShared();
return image;
} }
#endif #endif
else UNREACHABLE(); else UNREACHABLE();
......
...@@ -3967,27 +3967,7 @@ EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint texture ...@@ -3967,27 +3967,7 @@ EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint texture
#if defined(__ANDROID__) #if defined(__ANDROID__)
else if(target == EGL_NATIVE_BUFFER_ANDROID) else if(target == EGL_NATIVE_BUFFER_ANDROID)
{ {
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name); return isSupportedAndroidBuffer(name);
if(nativeBuffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
{
return EGL_BAD_PARAMETER;
}
if(nativeBuffer->common.version != sizeof(ANativeWindowBuffer))
{
return EGL_BAD_PARAMETER;
}
switch(nativeBuffer->format)
{
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_RGB_565:
break;
default:
return EGL_BAD_PARAMETER;
}
} }
#endif #endif
else UNREACHABLE(); else UNREACHABLE();
...@@ -4025,17 +4005,7 @@ egl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textu ...@@ -4025,17 +4005,7 @@ egl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textu
#if defined(__ANDROID__) #if defined(__ANDROID__)
else if(target == EGL_NATIVE_BUFFER_ANDROID) else if(target == EGL_NATIVE_BUFFER_ANDROID)
{ {
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name); return wrapAndroidNativeWindow<es2::Image>(name);
nativeBuffer->common.incRef(&nativeBuffer->common);
GLenum format = getColorFormatFromAndroid(nativeBuffer->format);
GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);
es2::Image *image = new Image(0, nativeBuffer->width, nativeBuffer->height, format, type);
image->setNativeBuffer(nativeBuffer);
image->markShared();
return image;
} }
#endif #endif
else UNREACHABLE(); else UNREACHABLE();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment