OSDN Git Service

Enable OpenGL ES 3.0 context creation.
authorNicolas Capens <capn@google.com>
Wed, 11 Feb 2015 22:40:30 +0000 (17:40 -0500)
committerNicolas Capens <capn@google.com>
Mon, 23 Feb 2015 20:26:27 +0000 (20:26 +0000)
Bug 19362672

Change-Id: Ie948dd0c26a6a5f65f6e15b75f2376d598129c28
Reviewed-on: https://swiftshader-review.googlesource.com/2287
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libEGL/Config.cpp
src/OpenGL/libEGL/Display.cpp
src/OpenGL/libEGL/main.cpp
src/OpenGL/libEGL/main.h
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Context.h
src/OpenGL/libGLESv2/libGLESv2.cpp
src/OpenGL/libGLESv2/main.cpp

index 45eb38e..6530e80 100644 (file)
@@ -81,7 +81,7 @@ Config::Config(const DisplayMode &displayMode, EGLint minInterval, EGLint maxInt
     mColorBufferType = EGL_RGB_BUFFER;
     mConfigCaveat = isSlowConfig() ? EGL_SLOW_CONFIG : EGL_NONE;
     mConfigID = 0;
-    mConformant = EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT;
+    mConformant = EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
 
        switch (depthStencilFormat)
        {
@@ -139,7 +139,7 @@ Config::Config(const DisplayMode &displayMode, EGLint minInterval, EGLint maxInt
     mNativeRenderable = EGL_FALSE;
     mNativeVisualID = 0;
     mNativeVisualType = 0;
-    mRenderableType = EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT;
+    mRenderableType = EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
     mSampleBuffers = multiSample ? 1 : 0;
     mSamples = multiSample;
     mSurfaceType = EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
index 39017b4..2013e7b 100644 (file)
@@ -400,11 +400,12 @@ EGLContext Display::createContext(EGLConfig configHandle, const egl::Context *sh
                        context = es1::createContext(config, shareContext);
                }
        }
-       else if(clientVersion == 2 && config->mRenderableType & EGL_OPENGL_ES2_BIT)
+       else if((clientVersion == 2 && config->mRenderableType & EGL_OPENGL_ES2_BIT) ||
+               (clientVersion == 3 && config->mRenderableType & EGL_OPENGL_ES3_BIT))
        {
                if(es2::createContext != 0)
                {
-                       context = es2::createContext(config, shareContext);
+                       context = es2::createContext(config, shareContext, clientVersion);
                }
        }
        else
index a7cf892..3cd35d7 100644 (file)
@@ -104,7 +104,7 @@ CONSTRUCTOR static bool eglAttachProcess()
        #endif\r
 \r
     libGLESv2 = loadLibrary(libGLESv2_lib);\r
-    es2::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*))getProcAddress(libGLESv2, "glCreateContext");\r
+    es2::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*, EGLint))getProcAddress(libGLESv2, "glCreateContext");\r
     es2::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLESv2, "glGetProcAddress");\r
 \r
        es::createBackBuffer = (egl::Image *(*)(int, int, const egl::Config*))getProcAddress(libGLES_CM, "createBackBuffer");\r
@@ -342,7 +342,7 @@ namespace es1
 \r
 namespace es2\r
 {\r
-       egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext) = 0;\r
+       egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext, EGLint clientVersion) = 0;\r
        __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;\r
 }\r
 \r
index fbdc014..f6d74d5 100644 (file)
@@ -92,7 +92,7 @@ namespace es1
 // libGLESv2 dependencies
 namespace es2
 {
-       extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext);
+       extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext, EGLint clientVersion);
        extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
 }
 
index 586f238..14808e7 100644 (file)
@@ -39,7 +39,8 @@
 \r
 namespace es2\r
 {\r
-Context::Context(const egl::Config *config, const Context *shareContext) : mConfig(config)\r
+Context::Context(const egl::Config *config, const Context *shareContext, EGLint clientVersion)\r
+       : mConfig(config), clientVersion(clientVersion)\r
 {\r
        sw::Context *context = new sw::Context();\r
        device = new es2::Device(context);\r
@@ -272,9 +273,9 @@ void Context::destroy()
        delete this;\r
 }\r
 \r
-int Context::getClientVersion()\r
+EGLint Context::getClientVersion()\r
 {\r
-       return 2;\r
+       return clientVersion;\r
 }\r
 \r
 // This function will set all of the state-related dirty flags, so that all state is set during next pre-draw.\r
@@ -3245,8 +3246,8 @@ Device *Context::getDevice()
 // Exported functions for use by EGL\r
 extern "C"\r
 {\r
-       es2::Context *glCreateContext(const egl::Config *config, const es2::Context *shareContext)\r
+       es2::Context *glCreateContext(const egl::Config *config, const es2::Context *shareContext, int clientVersion)\r
        {\r
-               return new es2::Context(config, shareContext);\r
+               return new es2::Context(config, shareContext, clientVersion);\r
        }\r
 }\r
index 5d25b40..434644c 100644 (file)
@@ -251,11 +251,11 @@ struct State
 class Context : public egl::Context\r
 {\r
 public:\r
-    Context(const egl::Config *config, const Context *shareContext);\r
+    Context(const egl::Config *config, const Context *shareContext, EGLint clientVersion);\r
 \r
        virtual void makeCurrent(egl::Surface *surface);\r
        virtual void destroy();\r
-       virtual int getClientVersion();\r
+       virtual EGLint getClientVersion();\r
 \r
     void markAllStateDirty();\r
 \r
@@ -459,6 +459,7 @@ private:
     bool cullSkipsDraw(GLenum drawMode);\r
     bool isTriangleMode(GLenum drawMode);\r
 \r
+       const EGLint clientVersion;\r
     const egl::Config *const mConfig;\r
 \r
     State mState;\r
index 9cb3f10..c781480 100644 (file)
@@ -4086,106 +4086,109 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
                return error(GL_INVALID_VALUE);\r
        }\r
 \r
-       if(internalformat != format)\r
-       {\r
-               return error(GL_INVALID_OPERATION);\r
-       }\r
+       es2::Context *context = es2::getContext();\r
 \r
-       switch(format)\r
+       if(context)\r
        {\r
-       case GL_ALPHA:\r
-       case GL_LUMINANCE:\r
-       case GL_LUMINANCE_ALPHA:\r
-               switch(type)\r
+               if(context->getClientVersion() < 3)\r
                {\r
-               case GL_UNSIGNED_BYTE:\r
-               case GL_FLOAT:\r
-               case GL_HALF_FLOAT_OES:\r
-                       break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
+                       if(internalformat != format)\r
+                       {\r
+                               return error(GL_INVALID_OPERATION);\r
+                       }\r
                }\r
-               break;\r
-       case GL_RGB:\r
-               switch(type)\r
+\r
+               switch(format)\r
                {\r
-               case GL_UNSIGNED_BYTE:\r
-               case GL_UNSIGNED_SHORT_5_6_5:\r
-               case GL_FLOAT:\r
-               case GL_HALF_FLOAT_OES:\r
+               case GL_ALPHA:\r
+               case GL_LUMINANCE:\r
+               case GL_LUMINANCE_ALPHA:\r
+                       switch(type)\r
+                       {\r
+                       case GL_UNSIGNED_BYTE:\r
+                       case GL_FLOAT:\r
+                       case GL_HALF_FLOAT_OES:\r
+                               break;\r
+                       default:\r
+                               return error(GL_INVALID_ENUM);\r
+                       }\r
                        break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
-       case GL_RGBA:\r
-               switch(type)\r
-               {\r
-               case GL_UNSIGNED_BYTE:\r
-               case GL_UNSIGNED_SHORT_4_4_4_4:\r
-               case GL_UNSIGNED_SHORT_5_5_5_1:\r
-               case GL_FLOAT:\r
-               case GL_HALF_FLOAT_OES:\r
+               case GL_RGB:\r
+                       switch(type)\r
+                       {\r
+                       case GL_UNSIGNED_BYTE:\r
+                       case GL_UNSIGNED_SHORT_5_6_5:\r
+                       case GL_FLOAT:\r
+                       case GL_HALF_FLOAT_OES:\r
+                               break;\r
+                       default:\r
+                               return error(GL_INVALID_ENUM);\r
+                       }\r
                        break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
-       case GL_BGRA_EXT:\r
-               switch(type)\r
-               {\r
-               case GL_UNSIGNED_BYTE:\r
+               case GL_RGBA:\r
+                       switch(type)\r
+                       {\r
+                       case GL_UNSIGNED_BYTE:\r
+                       case GL_UNSIGNED_SHORT_4_4_4_4:\r
+                       case GL_UNSIGNED_SHORT_5_5_5_1:\r
+                       case GL_FLOAT:\r
+                       case GL_HALF_FLOAT_OES:\r
+                               break;\r
+                       default:\r
+                               return error(GL_INVALID_ENUM);\r
+                       }\r
                        break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
-       case GL_ETC1_RGB8_OES:\r
-               return error(GL_INVALID_OPERATION);\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(S3TC_SUPPORT)\r
-               {\r
+               case GL_BGRA_EXT:\r
+                       switch(type)\r
+                       {\r
+                       case GL_UNSIGNED_BYTE:\r
+                               break;\r
+                       default:\r
+                               return error(GL_INVALID_ENUM);\r
+                       }\r
+                       break;\r
+               case GL_ETC1_RGB8_OES:\r
                        return error(GL_INVALID_OPERATION);\r
-               }\r
-               else\r
-               {\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-       case GL_DEPTH_COMPONENT:\r
-               switch(type)\r
-               {\r
-               case GL_UNSIGNED_SHORT:\r
-               case GL_UNSIGNED_INT:\r
+               case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
+               case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
+               case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
+               case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
+                       if(S3TC_SUPPORT)\r
+                       {\r
+                               return error(GL_INVALID_OPERATION);\r
+                       }\r
+                       else\r
+                       {\r
+                               return error(GL_INVALID_ENUM);\r
+                       }\r
+               case GL_DEPTH_COMPONENT:\r
+                       switch(type)\r
+                       {\r
+                       case GL_UNSIGNED_SHORT:\r
+                       case GL_UNSIGNED_INT:\r
+                               break;\r
+                       default:\r
+                               return error(GL_INVALID_ENUM);\r
+                       }\r
                        break;\r
-               default:\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
-       case GL_DEPTH_STENCIL_OES:\r
-               switch(type)\r
-               {\r
-               case GL_UNSIGNED_INT_24_8_OES:\r
+               case GL_DEPTH_STENCIL_OES:\r
+                       switch(type)\r
+                       {\r
+                       case GL_UNSIGNED_INT_24_8_OES:\r
+                               break;\r
+                       default:\r
+                               return error(GL_INVALID_ENUM);\r
+                       }\r
                        break;\r
                default:\r
-                       return error(GL_INVALID_ENUM);\r
+                       return error(GL_INVALID_VALUE);\r
                }\r
-               break;\r
-       default:\r
-               return error(GL_INVALID_VALUE);\r
-       }\r
 \r
-       if(border != 0)\r
-       {\r
-               return error(GL_INVALID_VALUE);\r
-       }\r
-\r
-       es2::Context *context = es2::getContext();\r
+               if(border != 0)\r
+               {\r
+                       return error(GL_INVALID_VALUE);\r
+               }\r
 \r
-       if(context)\r
-       {\r
                switch(target)\r
                {\r
                case GL_TEXTURE_2D:\r
index e351580..9ab0ed9 100644 (file)
@@ -109,7 +109,8 @@ es2::Context *getContext()
 {\r
        egl::Context *context = egl::getCurrentContext();\r
 \r
-       if(context && context->getClientVersion() == 2)\r
+       if(context && (context->getClientVersion() == 2 ||\r
+                      context->getClientVersion() == 3))\r
        {\r
                return static_cast<es2::Context*>(context);\r
        }\r