Common/CPUID.cpp \
Common/Configurator.cpp \
Common/DebugAndroid.cpp \
+ Common/GrallocAndroid.cpp \
Common/Half.cpp \
Common/Math.cpp \
Common/Memory.cpp \
Shader/VertexShader.cpp \
LOCAL_SRC_FILES += \
+ OpenGL/common/AndroidCommon.cpp \
OpenGL/common/NameSpace.cpp \
OpenGL/common/Object.cpp \
OpenGL/common/MatrixStack.cpp \
--- /dev/null
+#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);
+}
--- /dev/null
+#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
--- /dev/null
+#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
#define ANDROID_COMMON
-static inline 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:
- 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;
-}
+// Used internally
+GLenum getColorFormatFromAndroid(int format);
+
+// Used internally
+GLenum getPixelFormatFromAndroid(int format);
+
+// Used in V1 & V2 Context.cpp
+GLenum isSupportedAndroidBuffer(GLuint name);
-static inline GLenum getPixelFormatFromAndroid(int format)
+// Used in V1 & V2 Context.cpp
+template <typename I> I* wrapAndroidNativeWindow(GLuint name)
{
- 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:
- return GL_UNSIGNED_SHORT_5_6_5;
- 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;
+ ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
+ ALOGV("%s: wrapping %p", __FUNCTION__, nativeBuffer);
+ nativeBuffer->common.incRef(&nativeBuffer->common);
+
+ GLenum format = getColorFormatFromAndroid(nativeBuffer->format);
+ GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);
+
+ I *image = new I(0, nativeBuffer->width, nativeBuffer->height, format, type);
+ image->setNativeBuffer(nativeBuffer);
+ image->markShared();
+
+ return image;
}
+
#endif // ANDROID_COMMON
#if defined(__ANDROID__)\r
#include <hardware/gralloc.h>\r
#include <system/window.h>\r
+#include "../../Common/GrallocAndroid.hpp"\r
#endif\r
\r
#ifdef __ANDROID__\r
\r
#if defined(__ANDROID__)\r
nativeBuffer = 0;\r
- gralloc = 0;\r
#endif\r
}\r
\r
\r
#if defined(__ANDROID__)\r
nativeBuffer = 0;\r
- gralloc = 0;\r
#endif\r
}\r
\r
\r
#if defined(__ANDROID__)\r
ANativeWindowBuffer *nativeBuffer;\r
- gralloc_module_t const *gralloc;\r
-\r
- void initGralloc()\r
- {\r
- hw_module_t const *module;\r
- hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);\r
- gralloc = reinterpret_cast<gralloc_module_t const*>(module);\r
- }\r
\r
void* lockNativeBuffer(int usage)\r
{\r
- if(!gralloc)\r
- {\r
- initGralloc();\r
- }\r
-\r
void *buffer = 0;\r
- gralloc->lock(gralloc, nativeBuffer->handle, usage, 0, 0, nativeBuffer->width, nativeBuffer->height, &buffer);\r
+ GrallocModule::getInstance()->lock(\r
+ nativeBuffer->handle, usage, 0, 0,\r
+ nativeBuffer->width, nativeBuffer->height, &buffer);\r
return buffer;\r
}\r
\r
void unlockNativeBuffer()\r
{\r
- if(!gralloc)\r
- {\r
- initGralloc();\r
- }\r
-\r
- gralloc->unlock(gralloc, nativeBuffer->handle);\r
+ GrallocModule::getInstance()->unlock(nativeBuffer->handle);\r
}\r
#endif\r
};\r
#if defined(__ANDROID__)\r
else if(target == EGL_NATIVE_BUFFER_ANDROID)\r
{\r
- ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);\r
-\r
- if(nativeBuffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)\r
- {\r
- return EGL_BAD_PARAMETER;\r
- }\r
-\r
- if(nativeBuffer->common.version != sizeof(ANativeWindowBuffer))\r
- {\r
- return EGL_BAD_PARAMETER;\r
- }\r
-\r
- switch(nativeBuffer->format)\r
- {\r
- case HAL_PIXEL_FORMAT_RGBA_8888:\r
- case HAL_PIXEL_FORMAT_RGBX_8888:\r
- case HAL_PIXEL_FORMAT_RGB_565:\r
- break;\r
- default:\r
- return EGL_BAD_PARAMETER;\r
- }\r
+ return isSupportedAndroidBuffer(name);\r
}\r
#endif\r
else UNREACHABLE();\r
#if defined(__ANDROID__)\r
else if(target == EGL_NATIVE_BUFFER_ANDROID)\r
{\r
- ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);\r
- nativeBuffer->common.incRef(&nativeBuffer->common);\r
-\r
- GLenum format = getColorFormatFromAndroid(nativeBuffer->format);\r
- GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);\r
-\r
- es1::Image *image = new Image(0, nativeBuffer->width, nativeBuffer->height, format, type);\r
- image->setNativeBuffer(nativeBuffer);\r
- image->markShared();\r
-\r
- return image;\r
+ return wrapAndroidNativeWindow<es1::Image>(name);\r
}\r
#endif\r
else UNREACHABLE();\r
#if defined(__ANDROID__)\r
else if(target == EGL_NATIVE_BUFFER_ANDROID)\r
{\r
- ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);\r
- \r
- if(nativeBuffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)\r
- {\r
- return EGL_BAD_PARAMETER;\r
- }\r
-\r
- if(nativeBuffer->common.version != sizeof(ANativeWindowBuffer))\r
- {\r
- return EGL_BAD_PARAMETER;\r
- }\r
-\r
- switch(nativeBuffer->format)\r
- {\r
- case HAL_PIXEL_FORMAT_RGBA_8888:\r
- case HAL_PIXEL_FORMAT_RGBX_8888:\r
- case HAL_PIXEL_FORMAT_RGB_565:\r
- break;\r
- default:\r
- return EGL_BAD_PARAMETER;\r
- }\r
+ return isSupportedAndroidBuffer(name);\r
}\r
#endif\r
else UNREACHABLE();\r
#if defined(__ANDROID__)\r
else if(target == EGL_NATIVE_BUFFER_ANDROID)\r
{\r
- ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);\r
- nativeBuffer->common.incRef(&nativeBuffer->common);\r
-\r
- GLenum format = getColorFormatFromAndroid(nativeBuffer->format);\r
- GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);\r
-\r
- es2::Image *image = new Image(0, nativeBuffer->width, nativeBuffer->height, format, type);\r
- image->setNativeBuffer(nativeBuffer);\r
- image->markShared();\r
-\r
- return image;\r
+ return wrapAndroidNativeWindow<es2::Image>(name);\r
}\r
#endif\r
else UNREACHABLE();\r