OSDN Git Service

Retrieve the implementation color read format/type from the framebuffer.
authorNicolas Capens <capn@google.com>
Tue, 13 Jan 2015 20:49:15 +0000 (15:49 -0500)
committerNicolas Capens <capn@google.com>
Wed, 14 Jan 2015 22:19:24 +0000 (22:19 +0000)
Bug 14643416

Change-Id: Icdacb4185839ef6fb71fe2ff651e283d55d447a9
Reviewed-on: https://swiftshader-review.googlesource.com/1701
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLES_CM/Context.cpp
src/OpenGL/libGLES_CM/Context.h
src/OpenGL/libGLES_CM/Framebuffer.cpp
src/OpenGL/libGLES_CM/Framebuffer.h
src/OpenGL/libGLES_CM/libGLES_CM.cpp
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Context.h
src/OpenGL/libGLESv2/Framebuffer.cpp
src/OpenGL/libGLESv2/Framebuffer.h
src/OpenGL/libGLESv2/libGLESv2.cpp

index 781d6e8..c5c86e5 100644 (file)
@@ -1039,8 +1039,18 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
             }\r
         }\r
         break;\r
-    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:   *params = IMPLEMENTATION_COLOR_READ_TYPE;   break;\r
-    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: *params = IMPLEMENTATION_COLOR_READ_FORMAT; break;\r
+    case GL_IMPLEMENTATION_COLOR_READ_TYPE:\r
+               {\r
+                       Framebuffer *framebuffer = getFramebuffer();\r
+                       *params = framebuffer->getImplementationColorReadType();\r
+               }\r
+               break;\r
+    case GL_IMPLEMENTATION_COLOR_READ_FORMAT:\r
+               {\r
+                       Framebuffer *framebuffer = getFramebuffer();\r
+                       *params = framebuffer->getImplementationColorReadFormat();\r
+               }\r
+               break;\r
     case GL_MAX_VIEWPORT_DIMS:\r
         {\r
                        int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE;\r
@@ -1814,6 +1824,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
         return error(GL_INVALID_OPERATION);\r
     }\r
 \r
+       if(format != GL_RGBA || type != GL_UNSIGNED_BYTE)\r
+       {\r
+               if(format != framebuffer->getImplementationColorReadFormat() || type != framebuffer->getImplementationColorReadType())\r
+               {\r
+                       return error(GL_INVALID_OPERATION);\r
+               }\r
+       }\r
+\r
        GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment);\r
 \r
        // Sized query sanity check\r
@@ -1986,10 +2004,10 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                                        default: UNREACHABLE();\r
                                        }\r
                                        break;\r
-                               case GL_RGB:   // IMPLEMENTATION_COLOR_READ_FORMAT\r
+                               case GL_RGB:\r
                                        switch(type)\r
                                        {\r
-                                       case GL_UNSIGNED_SHORT_5_6_5:   // IMPLEMENTATION_COLOR_READ_TYPE\r
+                                       case GL_UNSIGNED_SHORT_5_6_5:\r
                                                dest16[i + j * outputPitch / sizeof(unsigned short)] =\r
                                                        ((unsigned short)(31 * b + 0.5f) << 0) |\r
                                                        ((unsigned short)(63 * g + 0.5f) << 5) |\r
index 816a3ff..1361f22 100644 (file)
@@ -71,9 +71,6 @@ enum
        MAX_MODELVIEW_STACK_DEPTH = 32,\r
        MAX_PROJECTION_STACK_DEPTH = 2,\r
        MAX_TEXTURE_STACK_DEPTH = 2,\r
-\r
-    IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,\r
-    IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5\r
 };\r
 \r
 const GLenum compressedTextureFormats[] =\r
index 3692b83..b985406 100644 (file)
@@ -400,6 +400,16 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
        return GL_FRAMEBUFFER_COMPLETE_OES;
 }
 
+GLenum Framebuffer::getImplementationColorReadFormat()
+{
+       return GL_RGB;
+}
+
+GLenum Framebuffer::getImplementationColorReadType()
+{
+       return GL_UNSIGNED_SHORT_5_6_5;
+}
+
 DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
 {
        mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
index 058db28..0f4542f 100644 (file)
@@ -63,6 +63,9 @@ public:
        virtual GLenum completeness();\r
        GLenum completeness(int &width, int &height, int &samples);\r
 \r
+       GLenum getImplementationColorReadFormat();\r
+       GLenum getImplementationColorReadType();\r
+\r
 protected:\r
     GLenum mColorbufferType;\r
     gl::BindingPointer<Renderbuffer> mColorbufferPointer;\r
index 0e48003..fe85299 100644 (file)
@@ -80,47 +80,6 @@ static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei heigh
        return true;\r
 }\r
 \r
-// Check for combinations of format and type that are valid for ReadPixels\r
-static bool validReadFormatType(GLenum format, GLenum type)\r
-{\r
-       switch(format)\r
-       {\r
-       case GL_RGBA:\r
-               switch (type)\r
-               {\r
-               case GL_UNSIGNED_BYTE:\r
-                       break;\r
-               default:\r
-                       return false;\r
-               }\r
-               break;\r
-       case GL_BGRA_EXT:\r
-               switch (type)\r
-               {\r
-               case GL_UNSIGNED_BYTE:\r
-               case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:\r
-               case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:\r
-                       break;\r
-               default:\r
-                       return false;\r
-               }\r
-               break;\r
-       case es1::IMPLEMENTATION_COLOR_READ_FORMAT:\r
-               switch (type)\r
-               {\r
-               case es1::IMPLEMENTATION_COLOR_READ_TYPE:\r
-                       break;\r
-               default:\r
-                       return false;\r
-               }\r
-               break;\r
-       default:\r
-               return false;\r
-       }\r
-\r
-       return true;\r
-}\r
-\r
 extern "C"\r
 {\r
 \r
@@ -612,8 +571,8 @@ void GL_APIENTRY glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum src
 }\r
 \r
 void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)\r
-{
-       size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications
+{\r
+       size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications\r
 \r
        TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",\r
              target, size, data, usage);\r
@@ -660,12 +619,12 @@ void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data
 }\r
 \r
 void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)\r
-{
-       size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications
-       offset = static_cast<GLint>(offset);
+{\r
+       size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications\r
+       offset = static_cast<GLint>(offset);\r
 \r
        TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",\r
-             target, offset, size, data);
+             target, offset, size, data);\r
 \r
        if(size < 0 || offset < 0)\r
        {\r
@@ -2952,12 +2911,7 @@ void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, G
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
-\r
-       if(!validReadFormatType(format, type))\r
-       {\r
-               return error(GL_INVALID_OPERATION);\r
-       }\r
-\r
+       \r
        es1::Context *context = es1::getContext();\r
 \r
        if(context)\r
index 0c86f51..34003e5 100644 (file)
@@ -1358,8 +1358,18 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
             }\r
         }\r
         break;\r
-    case GL_IMPLEMENTATION_COLOR_READ_TYPE:   *params = IMPLEMENTATION_COLOR_READ_TYPE;   break;\r
-    case GL_IMPLEMENTATION_COLOR_READ_FORMAT: *params = IMPLEMENTATION_COLOR_READ_FORMAT; break;\r
+    case GL_IMPLEMENTATION_COLOR_READ_TYPE:\r
+               {\r
+                       Framebuffer *framebuffer = getReadFramebuffer();\r
+                       *params = framebuffer->getImplementationColorReadType();\r
+               }\r
+               break;\r
+    case GL_IMPLEMENTATION_COLOR_READ_FORMAT:\r
+               {\r
+                       Framebuffer *framebuffer = getReadFramebuffer();\r
+                       *params = framebuffer->getImplementationColorReadFormat();\r
+               }\r
+               break;\r
     case GL_MAX_VIEWPORT_DIMS:\r
         {\r
                        int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE;\r
@@ -2147,6 +2157,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
         return error(GL_INVALID_OPERATION);\r
     }\r
 \r
+       if(format != GL_RGBA || type != GL_UNSIGNED_BYTE)\r
+       {\r
+               if(format != framebuffer->getImplementationColorReadFormat() || type != framebuffer->getImplementationColorReadType())\r
+               {\r
+                       return error(GL_INVALID_OPERATION);\r
+               }\r
+       }\r
+\r
        GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment);\r
     \r
        // Sized query sanity check\r
@@ -2319,10 +2337,10 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                                        default: UNREACHABLE();\r
                                        }\r
                                        break;\r
-                               case GL_RGB:   // IMPLEMENTATION_COLOR_READ_FORMAT\r
+                               case GL_RGB:\r
                                        switch(type)\r
                                        {\r
-                                       case GL_UNSIGNED_SHORT_5_6_5:   // IMPLEMENTATION_COLOR_READ_TYPE\r
+                                       case GL_UNSIGNED_SHORT_5_6_5:\r
                                                dest16[i + j * outputPitch / sizeof(unsigned short)] = \r
                                                        ((unsigned short)(31 * b + 0.5f) << 0) |\r
                                                        ((unsigned short)(63 * g + 0.5f) << 5) |\r
index 9d7ac89..42c8c19 100644 (file)
@@ -75,9 +75,6 @@ enum
     MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS,\r
     MAX_FRAGMENT_UNIFORM_VECTORS = 224 - 3,    // Reserve space for gl_DepthRange\r
     MAX_DRAW_BUFFERS = 1,\r
-\r
-    IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,\r
-    IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5\r
 };\r
 \r
 const GLenum compressedTextureFormats[] =\r
index c98973c..4e67657 100644 (file)
@@ -399,6 +399,16 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
        return GL_FRAMEBUFFER_COMPLETE;
 }
 
+GLenum Framebuffer::getImplementationColorReadFormat()\r
+{\r
+       return GL_RGB;\r
+}\r
+\r
+GLenum Framebuffer::getImplementationColorReadType()
+{
+       return GL_UNSIGNED_SHORT_5_6_5;
+}
+
 DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
 {
        mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
index 3021b14..df9486e 100644 (file)
@@ -63,6 +63,9 @@ public:
        virtual GLenum completeness();\r
        GLenum completeness(int &width, int &height, int &samples);\r
 \r
+       GLenum getImplementationColorReadFormat();\r
+       GLenum getImplementationColorReadType();\r
+\r
 protected:\r
     GLenum mColorbufferType;\r
     gl::BindingPointer<Renderbuffer> mColorbufferPointer;\r
index cb2df49..7f289dc 100644 (file)
@@ -78,47 +78,6 @@ static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei heigh
        return true;\r
 }\r
 \r
-// Check for combinations of format and type that are valid for ReadPixels\r
-static bool validReadFormatType(GLenum format, GLenum type)\r
-{\r
-       switch(format)\r
-       {\r
-       case GL_RGBA:\r
-               switch(type)\r
-               {\r
-               case GL_UNSIGNED_BYTE:\r
-                       break;\r
-               default:\r
-                       return false;\r
-               }\r
-               break;\r
-       case GL_BGRA_EXT:\r
-               switch(type)\r
-               {\r
-               case GL_UNSIGNED_BYTE:\r
-               case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:\r
-               case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:\r
-                       break;\r
-               default:\r
-                       return false;\r
-               }\r
-               break;\r
-       case es2::IMPLEMENTATION_COLOR_READ_FORMAT:\r
-               switch(type)\r
-               {\r
-               case es2::IMPLEMENTATION_COLOR_READ_TYPE:\r
-                       break;\r
-               default:\r
-                       return false;\r
-               }\r
-               break;\r
-       default:\r
-               return false;\r
-       }\r
-\r
-       return true;\r
-}\r
-\r
 extern "C"\r
 {\r
 \r
@@ -3618,11 +3577,6 @@ void GL_APIENTRY glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei heigh
                return error(GL_INVALID_VALUE);\r
        }\r
 \r
-       if(!validReadFormatType(format, type))\r
-       {\r
-               return error(GL_INVALID_OPERATION);\r
-       }\r
-\r
        es2::Context *context = es2::getContext();\r
 \r
        if(context)\r
@@ -3642,11 +3596,6 @@ void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, G
                return error(GL_INVALID_VALUE);\r
        }\r
 \r
-       if(!validReadFormatType(format, type))\r
-       {\r
-               return error(GL_INVALID_OPERATION);\r
-       }\r
-\r
        es2::Context *context = es2::getContext();\r
 \r
        if(context)\r