OSDN Git Service

Initial work to connect gralloc to egl::Image
authorGreg Hartman <ghartman@google.com>
Sat, 18 Apr 2015 00:29:14 +0000 (17:29 -0700)
committerGreg Hartman <ghartman@google.com>
Sat, 25 Apr 2015 00:14:43 +0000 (00:14 +0000)
Change-Id: Ia11a9520bb6525dc367e0b2956850574b29e4796
Reviewed-on: https://swiftshader-review.googlesource.com/2900
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/Android.mk
src/Common/GrallocAndroid.cpp [new file with mode: 0644]
src/Common/GrallocAndroid.hpp [new file with mode: 0644]
src/OpenGL/common/AndroidCommon.cpp [new file with mode: 0644]
src/OpenGL/common/AndroidCommon.hpp
src/OpenGL/libEGL/Image.hpp
src/OpenGL/libGLES_CM/Context.cpp
src/OpenGL/libGLESv2/Context.cpp

index f31a1db..dbf2932 100644 (file)
@@ -9,6 +9,7 @@ LOCAL_SRC_FILES := \
        Common/CPUID.cpp \
        Common/Configurator.cpp \
        Common/DebugAndroid.cpp \
+       Common/GrallocAndroid.cpp \
        Common/Half.cpp \
        Common/Math.cpp \
        Common/Memory.cpp \
@@ -65,6 +66,7 @@ LOCAL_SRC_FILES += \
        Shader/VertexShader.cpp \
 
 LOCAL_SRC_FILES += \
+       OpenGL/common/AndroidCommon.cpp \
        OpenGL/common/NameSpace.cpp \
        OpenGL/common/Object.cpp \
        OpenGL/common/MatrixStack.cpp \
diff --git a/src/Common/GrallocAndroid.cpp b/src/Common/GrallocAndroid.cpp
new file mode 100644 (file)
index 0000000..307a16f
--- /dev/null
@@ -0,0 +1,31 @@
+#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);
+}
diff --git a/src/Common/GrallocAndroid.hpp b/src/Common/GrallocAndroid.hpp
new file mode 100644 (file)
index 0000000..4714d36
--- /dev/null
@@ -0,0 +1,27 @@
+#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
diff --git a/src/OpenGL/common/AndroidCommon.cpp b/src/OpenGL/common/AndroidCommon.cpp
new file mode 100644 (file)
index 0000000..3177141
--- /dev/null
@@ -0,0 +1,125 @@
+#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;
+    }
+}
index c0b831a..0d5f890 100644 (file)
@@ -1,54 +1,30 @@
 #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
index 0b48442..f96402c 100644 (file)
@@ -6,6 +6,7 @@
 #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
@@ -35,7 +36,6 @@ public:
 \r
                #if defined(__ANDROID__)\r
                        nativeBuffer = 0;\r
-                       gralloc = 0;\r
                #endif\r
        }\r
 \r
@@ -47,7 +47,6 @@ public:
 \r
                #if defined(__ANDROID__)\r
                        nativeBuffer = 0;\r
-                       gralloc = 0;\r
                #endif\r
        }\r
 \r
@@ -185,35 +184,19 @@ protected:
 \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
index d683338..403cb20 100644 (file)
@@ -2639,27 +2639,7 @@ EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint texture
     #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
@@ -2684,17 +2664,7 @@ egl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textu
     #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
index cc7bb01..0666ac3 100644 (file)
@@ -3967,27 +3967,7 @@ EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint texture
     #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
@@ -4025,17 +4005,7 @@ egl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textu
     #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