OSDN Git Service

Move the EGL shared image creation implementation to the context.
authorNicolas Capens <capn@google.com>
Mon, 27 Oct 2014 20:46:31 +0000 (16:46 -0400)
committerNicolas Capens <nicolascapens@google.com>
Tue, 28 Oct 2014 02:46:44 +0000 (02:46 +0000)
BUG=18110152

Change-Id: I21aece83756f033f579f11c0fb2e9e3d21f93703
Reviewed-on: https://swiftshader-review.googlesource.com/1262
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
src/GLES2/libEGL/Context.hpp
src/GLES2/libEGL/Display.cpp
src/GLES2/libEGL/Surface.cpp
src/GLES2/libEGL/libEGL.cpp
src/GLES2/libEGL/main.cpp
src/GLES2/libEGL/main.h
src/GLES2/libGLES_CM/Context.cpp
src/GLES2/libGLES_CM/Context.h
src/GLES2/libGLESv2/Context.cpp
src/GLES2/libGLESv2/Context.h

index d8ce02d..c7ac343 100644 (file)
@@ -1,6 +1,16 @@
 #ifndef egl_Context_hpp\r
 #define egl_Context_hpp\r
 \r
+#define EGLAPI\r
+#include <EGL/egl.h>\r
+#define GL_API\r
+#include <GLES/gl.h>\r
+\r
+namespace gl\r
+{\r
+class Image;\r
+}\r
+\r
 namespace egl\r
 {\r
 class Surface;\r
@@ -10,6 +20,8 @@ class Context
 public:\r
        virtual void destroy() = 0;\r
        virtual void bindTexImage(Surface *surface) = 0;\r
+       virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;\r
+       virtual gl::Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;\r
 };\r
 }\r
 \r
index b80ef75..5d6d7c7 100644 (file)
@@ -16,7 +16,6 @@
 #include "Display.h"\r
 \r
 #include "main.h"\r
-#include "libGLESv2/mathutil.h"\r
 #include "libGLESv2/Device.hpp"\r
 #include "libEGL/Surface.h"\r
 #include "libEGL/Context.hpp"\r
index 06c84a2..11287ef 100644 (file)
@@ -312,7 +312,7 @@ bool Surface::checkForResize()
 \r
         if(static_cast<egl::Surface*>(getCurrentDrawSurface()) == this)\r
         {\r
-            gl::makeCurrent(static_cast<gl::Context*>(getCurrentContext()), static_cast<egl::Display*>(getCurrentDisplay()), this);\r
+            gl::makeCurrent(static_cast<egl::Context*>(getCurrentContext()), static_cast<egl::Display*>(getCurrentDisplay()), this);\r
         }\r
 \r
         return true;\r
index f5a6105..1130a50 100644 (file)
@@ -15,8 +15,8 @@
 #include "Display.h"\r
 #include "Surface.h"\r
 #include "Texture2D.hpp"\r
-#include "libGLESv2/Context.h"\r
-#include "libGLESv2/Texture.h"\r
+#include "Context.hpp"\r
+#include "libGLESv2/Image.hpp"\r
 #include "common/debug.h"\r
 #include "Common/Version.h"\r
 \r
@@ -845,7 +845,7 @@ EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurfac
     try\r
     {\r
         egl::Display *display = static_cast<egl::Display*>(dpy);\r
-        gl::Context *context = static_cast<gl::Context*>(ctx);\r
+        egl::Context *context = static_cast<egl::Context*>(ctx);\r
 \r
         if(ctx != EGL_NO_CONTEXT && !validateContext(display, context))\r
         {\r
@@ -953,7 +953,7 @@ EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint at
     try\r
     {\r
         egl::Display *display = static_cast<egl::Display*>(dpy);\r
-        gl::Context *context = static_cast<gl::Context*>(ctx);\r
+        egl::Context *context = static_cast<egl::Context*>(ctx);\r
 \r
         if(!validateContext(display, context))\r
         {\r
@@ -1070,7 +1070,7 @@ EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenu
     try\r
     {\r
         egl::Display *display = static_cast<egl::Display*>(dpy);\r
-        gl::Context *context = static_cast<gl::Context*>(ctx);\r
+        egl::Context *context = static_cast<egl::Context*>(ctx);\r
 \r
         if(!validateDisplay(display))\r
         {\r
@@ -1082,27 +1082,6 @@ EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenu
             return error(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);\r
         }\r
 \r
-        GLenum textureTarget = GL_NONE;\r
-\r
-        switch(target)\r
-        {\r
-        case EGL_GL_TEXTURE_2D_KHR:\r
-            textureTarget = GL_TEXTURE_2D;\r
-            break;\r
-        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:\r
-        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:\r
-        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:\r
-        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:\r
-        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:\r
-        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:\r
-            textureTarget = GL_TEXTURE_CUBE_MAP;\r
-            break;\r
-        case EGL_GL_RENDERBUFFER_KHR:\r
-            break;\r
-        default:\r
-            return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
-        }\r
-\r
         EGLenum imagePreserved = EGL_FALSE;\r
         GLuint textureLevel = 0;\r
         if(attrib_list)\r
@@ -1124,11 +1103,6 @@ EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenu
             }\r
         }\r
 \r
-        if(textureLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
-        {\r
-            return error(EGL_BAD_MATCH, EGL_NO_IMAGE_KHR);\r
-        }\r
-\r
         GLuint name = reinterpret_cast<intptr_t>(buffer);\r
 \r
         if(name == 0)\r
@@ -1136,51 +1110,14 @@ EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenu
             return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
         }\r
 \r
-        gl::Image *image = 0;\r
-\r
-        if(textureTarget != GL_NONE)\r
-        {\r
-            gl::Texture *texture = context->getTexture(name);\r
-\r
-            if(!texture || texture->getTarget() != textureTarget)\r
-            {\r
-                return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
-            }\r
-\r
-            if(texture->isShared(textureTarget, textureLevel))   // Bound to an EGLSurface or already an EGLImage sibling\r
-            {\r
-                return error(EGL_BAD_ACCESS, EGL_NO_IMAGE_KHR);\r
-            }\r
-\r
-            if(textureLevel != 0 && !texture->isSamplerComplete())\r
-            {\r
-                return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
-            }\r
-\r
-            if(textureLevel == 0 && !(texture->isSamplerComplete() && texture->getLevelCount() == 1))\r
-            {\r
-                return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
-            }\r
-\r
-            image = texture->createSharedImage(textureTarget, textureLevel);\r
-        }\r
-        else if(target == EGL_GL_RENDERBUFFER_KHR)\r
-        {\r
-            gl::Renderbuffer *renderbuffer = context->getRenderbuffer(name);\r
-\r
-            if(!renderbuffer)\r
-            {\r
-                return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
-            }\r
+               EGLenum validationResult = context->validateSharedImage(target, name, textureLevel);\r
 \r
-            if(renderbuffer->isShared())   // Already an EGLImage sibling\r
-            {\r
-                return error(EGL_BAD_ACCESS, EGL_NO_IMAGE_KHR);\r
-            }\r
+               if(validationResult != EGL_SUCCESS)\r
+               {\r
+                       return error(validationResult, EGL_NO_IMAGE_KHR);\r
+               }\r
 \r
-            image = renderbuffer->createSharedImage();\r
-        }\r
-        else UNREACHABLE();\r
+        gl::Image *image = context->createSharedImage(target, name, textureLevel);\r
 \r
         if(!image)\r
         {\r
index dfbfee1..96a2d9c 100644 (file)
@@ -91,7 +91,7 @@ CONSTRUCTOR static bool eglAttachProcess()
     libGLESv2 = loadLibrary(libGLESv2_lib);\r
     gl::createDevice = (gl::Device*(*)())getProcAddress(libGLESv2, "createDevice");\r
     gl::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*))getProcAddress(libGLESv2, "glCreateContext");\r
-    gl::makeCurrent = (void (*)(gl::Context*, egl::Display*, egl::Surface*))getProcAddress(libGLESv2, "glMakeCurrent");\r
+    gl::makeCurrent = (void (*)(egl::Context*, egl::Display*, egl::Surface*))getProcAddress(libGLESv2, "glMakeCurrent");\r
     gl::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLESv2, "glGetProcAddress");\r
     gl::createBackBuffer = (gl::Image *(*)(int, int, const egl::Config*))getProcAddress(libGLESv2, "createBackBuffer");\r
     gl::createFrameBuffer = (sw::FrameBuffer *(*)(EGLNativeDisplayType, EGLNativeWindowType, int, int))getProcAddress(libGLESv2, "createFrameBuffer");\r
@@ -263,8 +263,8 @@ namespace gl
        Device *(*createDevice)() = 0;\r
        egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext) = 0;\r
        void (*bindTexImage)(egl::Surface *surface) = 0;\r
-       void (*makeCurrent)(Context *context, egl::Display *display, egl::Surface *surface) = 0;\r
-       Context *(*getCurrentContext)() = 0;\r
+       void (*makeCurrent)(egl::Context *context, egl::Display *display, egl::Surface *surface) = 0;\r
+       egl::Context *(*getCurrentContext)() = 0;\r
        __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;\r
        Image *(*createBackBuffer)(int width, int height, const egl::Config *config) = 0;\r
        sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height) = 0;\r
index 01a6873..cf6973c 100644 (file)
@@ -84,12 +84,11 @@ namespace sw
 namespace gl
 {
        class Device;
-       class Context;
        class Image;
 
        extern Device *(*createDevice)();
        extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext);
-       extern void (*makeCurrent)(Context *context, egl::Display *display, egl::Surface *surface);
+       extern void (*makeCurrent)(egl::Context *context, egl::Display *display, egl::Surface *surface);
        extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
        extern Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
        extern sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
index d07f444..541b733 100644 (file)
@@ -29,6 +29,8 @@
 #include "libEGL/Surface.h"\r
 #include "Common/Half.hpp"\r
 \r
+#include <EGL/eglext.h>\r
+\r
 #undef near\r
 #undef far\r
 \r
@@ -2226,6 +2228,85 @@ void Context::bindTexImage(egl::Surface *surface)
        }\r
 }\r
 \r
+EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel)\r
+{\r
+    switch(target)\r
+    {\r
+    case EGL_GL_TEXTURE_2D_KHR:\r
+        break;\r
+    case EGL_GL_RENDERBUFFER_KHR:\r
+        break;\r
+    default:\r
+        return EGL_BAD_PARAMETER;\r
+    }\r
+\r
+    if(textureLevel >= IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+    {\r
+        return EGL_BAD_MATCH;\r
+    }\r
+\r
+       if(target == EGL_GL_TEXTURE_2D_KHR)\r
+    {\r
+        Texture *texture = getTexture(name);\r
+\r
+        if(!texture || texture->getTarget() != target)\r
+        {\r
+            return EGL_BAD_PARAMETER;\r
+        }\r
+\r
+        if(texture->isShared(GL_TEXTURE_2D, textureLevel))   // Bound to an EGLSurface or already an EGLImage sibling\r
+        {\r
+            return EGL_BAD_ACCESS;\r
+        }\r
+\r
+        if(textureLevel != 0 && !texture->isSamplerComplete())\r
+        {\r
+            return EGL_BAD_PARAMETER;\r
+        }\r
+\r
+        if(textureLevel == 0 && !(texture->isSamplerComplete() && texture->getLevelCount() == 1))\r
+        {\r
+            return EGL_BAD_PARAMETER;\r
+        }\r
+    }\r
+    else if(target == EGL_GL_RENDERBUFFER_KHR)\r
+    {\r
+        Renderbuffer *renderbuffer = getRenderbuffer(name);\r
+\r
+        if(!renderbuffer)\r
+        {\r
+            return EGL_BAD_PARAMETER;\r
+        }\r
+\r
+        if(renderbuffer->isShared())   // Already an EGLImage sibling\r
+        {\r
+            return EGL_BAD_ACCESS;\r
+        }\r
+    }\r
+    else UNREACHABLE();\r
+\r
+       return EGL_SUCCESS;\r
+}\r
+\r
+Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textureLevel)\r
+{\r
+    if(target == EGL_GL_TEXTURE_2D_KHR)\r
+    {\r
+        gl::Texture *texture = getTexture(name);\r
+\r
+        return texture->createSharedImage(GL_TEXTURE_2D, textureLevel);\r
+    }\r
+    else if(target == EGL_GL_RENDERBUFFER_KHR)\r
+    {\r
+        gl::Renderbuffer *renderbuffer = getRenderbuffer(name);\r
+\r
+        return renderbuffer->createSharedImage();\r
+    }\r
+    else UNREACHABLE();\r
+\r
+       return 0;\r
+}\r
+\r
 }\r
 \r
 // Exported functions for use by EGL\r
index ee4d38f..cf6f939 100644 (file)
@@ -368,6 +368,8 @@ public:
     static int getSupportedMultiSampleDepth(sw::Format format, int requested);\r
 \r
        virtual void bindTexImage(egl::Surface *surface);\r
+       virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel);\r
+       virtual Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel);\r
 \r
 private:\r
        virtual ~Context();\r
index c54e140..d4e48fb 100644 (file)
@@ -32,6 +32,8 @@
 #include "libEGL/Surface.h"\r
 #include "Common/Half.hpp"\r
 \r
+#include <EGL/eglext.h>\r
+\r
 #undef near\r
 #undef far\r
 \r
@@ -3039,6 +3041,109 @@ void Context::bindTexImage(egl::Surface *surface)
        }\r
 }\r
 \r
+EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel)\r
+{\r
+    GLenum textureTarget = GL_NONE;\r
+\r
+    switch(target)\r
+    {\r
+    case EGL_GL_TEXTURE_2D_KHR:\r
+        textureTarget = GL_TEXTURE_2D;\r
+        break;\r
+    case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:\r
+    case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:\r
+    case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:\r
+    case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:\r
+    case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:\r
+    case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:\r
+        textureTarget = GL_TEXTURE_CUBE_MAP;\r
+        break;\r
+    case EGL_GL_RENDERBUFFER_KHR:\r
+        break;\r
+    default:\r
+        return EGL_BAD_PARAMETER;\r
+    }\r
+       \r
+    if(textureLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+    {\r
+        return EGL_BAD_MATCH;\r
+    }\r
+\r
+    if(textureTarget != GL_NONE)\r
+    {\r
+        gl::Texture *texture = getTexture(name);\r
+\r
+        if(!texture || texture->getTarget() != textureTarget)\r
+        {\r
+            return EGL_BAD_PARAMETER;\r
+        }\r
+\r
+        if(texture->isShared(textureTarget, textureLevel))   // Bound to an EGLSurface or already an EGLImage sibling\r
+        {\r
+            return EGL_BAD_ACCESS;\r
+        }\r
+\r
+        if(textureLevel != 0 && !texture->isSamplerComplete())\r
+        {\r
+            return EGL_BAD_PARAMETER;\r
+        }\r
+\r
+        if(textureLevel == 0 && !(texture->isSamplerComplete() && texture->getLevelCount() == 1))\r
+        {\r
+            return EGL_BAD_PARAMETER;\r
+        }\r
+    }\r
+    else if(target == EGL_GL_RENDERBUFFER_KHR)\r
+    {\r
+        gl::Renderbuffer *renderbuffer = getRenderbuffer(name);\r
+\r
+        if(!renderbuffer)\r
+        {\r
+            return EGL_BAD_PARAMETER;\r
+        }\r
+\r
+        if(renderbuffer->isShared())   // Already an EGLImage sibling\r
+        {\r
+            return EGL_BAD_ACCESS;\r
+        }\r
+    }\r
+    else UNREACHABLE();\r
+\r
+       return EGL_SUCCESS;\r
+}\r
+\r
+Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textureLevel)\r
+{\r
+       GLenum textureTarget = GL_NONE;\r
+\r
+    switch(target)\r
+    {\r
+    case EGL_GL_TEXTURE_2D_KHR:                  textureTarget = GL_TEXTURE_2D;                  break;\r
+    case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X; break;\r
+    case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_X; break;\r
+    case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_Y; break;\r
+    case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; break;\r
+    case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_Z; break;\r
+    case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; break;\r
+    }\r
+\r
+    if(textureTarget != GL_NONE)\r
+    {\r
+        gl::Texture *texture = getTexture(name);\r
+\r
+        return texture->createSharedImage(textureTarget, textureLevel);\r
+    }\r
+    else if(target == EGL_GL_RENDERBUFFER_KHR)\r
+    {\r
+        gl::Renderbuffer *renderbuffer = getRenderbuffer(name);\r
+\r
+        return renderbuffer->createSharedImage();\r
+    }\r
+    else UNREACHABLE();\r
+\r
+       return 0;\r
+}\r
+\r
 }\r
 \r
 // Exported functions for use by EGL\r
index aefd7bd..7e83f0b 100644 (file)
@@ -420,6 +420,8 @@ public:
                          GLbitfield mask);\r
 \r
        virtual void bindTexImage(egl::Surface *surface);\r
+       virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel);\r
+       virtual gl::Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel);\r
 \r
 private:\r
        virtual ~Context();\r