OSDN Git Service

Implement glReadPixels() for RGBA formats.
authorNicolas Capens <capn@google.com>
Sun, 29 Mar 2015 02:01:42 +0000 (22:01 -0400)
committerNicolas Capens <capn@google.com>
Tue, 31 Mar 2015 18:32:50 +0000 (18:32 +0000)
Change-Id: Ia2f7d1db3b2a0f075326c3331125ca347f42932d
Reviewed-on: https://swiftshader-review.googlesource.com/2756
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLES_CM/Context.cpp
src/OpenGL/libGLESv2/Context.cpp

index a784ded..7801633 100644 (file)
@@ -1952,9 +1952,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                unsigned short *dest16 = (unsigned short*)dest;\r
                unsigned int *dest32 = (unsigned int*)dest;\r
 \r
-               if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 &&\r
+               if(renderTarget->getInternalFormat() == sw::FORMAT_A8B8G8R8 &&\r
            format == GL_RGBA && type == GL_UNSIGNED_BYTE)\r
         {\r
+            memcpy(dest, source, (rect.x1 - rect.x0) * 4);\r
+        }\r
+               else if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 &&\r
+                format == GL_RGBA && type == GL_UNSIGNED_BYTE)\r
+        {\r
             for(int i = 0; i < rect.x1 - rect.x0; i++)\r
                        {\r
                                unsigned int argb = *(unsigned int*)(source + 4 * i);\r
@@ -2038,6 +2043,16 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                                                r = (argb & 0x00FF0000) * (1.0f / 0x00FF0000);\r
                                        }\r
                                        break;\r
+                               case sw::FORMAT_A8B8G8R8:\r
+                                       {\r
+                                               unsigned int abgr = *(unsigned int*)(source + 4 * i);\r
+\r
+                                               a = (abgr & 0xFF000000) * (1.0f / 0xFF000000);\r
+                                               b = (abgr & 0x00FF0000) * (1.0f / 0x00FF0000);\r
+                                               g = (abgr & 0x0000FF00) * (1.0f / 0x0000FF00);\r
+                                               r = (abgr & 0x000000FF) * (1.0f / 0x000000FF);\r
+                                       }\r
+                                       break;\r
                                case sw::FORMAT_X8R8G8B8:\r
                                        {\r
                                                unsigned int xrgb = *(unsigned int*)(source + 4 * i);\r
@@ -2048,6 +2063,16 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                                                r = (xrgb & 0x00FF0000) * (1.0f / 0x00FF0000);\r
                                        }\r
                                        break;\r
+                               case sw::FORMAT_X8B8G8R8:\r
+                                       {\r
+                                               unsigned int xbgr = *(unsigned int*)(source + 4 * i);\r
+\r
+                                               a = 1.0f;\r
+                                               b = (xbgr & 0x00FF0000) * (1.0f / 0x00FF0000);\r
+                                               g = (xbgr & 0x0000FF00) * (1.0f / 0x0000FF00);\r
+                                               r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF);\r
+                                       }\r
+                                       break;\r
                                case sw::FORMAT_A2R10G10B10:\r
                                        {\r
                                                unsigned int argb = *(unsigned int*)(source + 4 * i);\r
index 2b099a2..0fdb24a 100644 (file)
@@ -2597,9 +2597,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                unsigned short *dest16 = (unsigned short*)dest;\r
                unsigned int *dest32 = (unsigned int*)dest;\r
 \r
-               if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 &&\r
+               if(renderTarget->getInternalFormat() == sw::FORMAT_A8B8G8R8 &&\r
            format == GL_RGBA && type == GL_UNSIGNED_BYTE)\r
         {\r
+            memcpy(dest, source, (rect.x1 - rect.x0) * 4);\r
+        }\r
+               else if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 &&\r
+                format == GL_RGBA && type == GL_UNSIGNED_BYTE)\r
+        {\r
             for(int i = 0; i < rect.x1 - rect.x0; i++)\r
                        {\r
                                unsigned int argb = *(unsigned int*)(source + 4 * i);\r
@@ -2693,6 +2698,16 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                                                r = (argb & 0x00FF0000) * (1.0f / 0x00FF0000);\r
                                        }\r
                                        break;\r
+                               case sw::FORMAT_A8B8G8R8:\r
+                                       {\r
+                                               unsigned int abgr = *(unsigned int*)(source + 4 * i);\r
+\r
+                                               a = (abgr & 0xFF000000) * (1.0f / 0xFF000000);\r
+                                               b = (abgr & 0x00FF0000) * (1.0f / 0x00FF0000);\r
+                                               g = (abgr & 0x0000FF00) * (1.0f / 0x0000FF00);\r
+                                               r = (abgr & 0x000000FF) * (1.0f / 0x000000FF);\r
+                                       }\r
+                                       break;\r
                                case sw::FORMAT_X8R8G8B8:\r
                                        {\r
                                                unsigned int xrgb = *(unsigned int*)(source + 4 * i);\r
@@ -2703,6 +2718,16 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                                                r = (xrgb & 0x00FF0000) * (1.0f / 0x00FF0000);\r
                                        }\r
                                        break;\r
+                               case sw::FORMAT_X8B8G8R8:\r
+                                       {\r
+                                               unsigned int xbgr = *(unsigned int*)(source + 4 * i);\r
+\r
+                                               a = 1.0f;\r
+                                               b = (xbgr & 0x00FF0000) * (1.0f / 0x00FF0000);\r
+                                               g = (xbgr & 0x0000FF00) * (1.0f / 0x0000FF00);\r
+                                               r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF);\r
+                                       }\r
+                                       break;\r
                                case sw::FORMAT_A2R10G10B10:\r
                                        {\r
                                                unsigned int argb = *(unsigned int*)(source + 4 * i);\r
@@ -2792,7 +2817,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                                        switch(type)\r
                                        {\r
                                        case GL_UNSIGNED_SHORT_5_6_5:\r
-                                               dest16[i] = \r
+                                               dest16[i] =\r
                                                        ((unsigned short)(31 * b + 0.5f) << 0) |\r
                                                        ((unsigned short)(63 * g + 0.5f) << 5) |\r
                                                        ((unsigned short)(31 * r + 0.5f) << 11);\r