From: Nicolas Capens Date: Sun, 29 Mar 2015 02:01:42 +0000 (-0400) Subject: Implement glReadPixels() for RGBA formats. X-Git-Tag: android-x86-7.1-r1~1183 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=edb2e17215f3a9e31e51cf9768388a26458f9120;p=android-x86%2Fexternal-swiftshader.git Implement glReadPixels() for RGBA formats. Change-Id: Ia2f7d1db3b2a0f075326c3331125ca347f42932d Reviewed-on: https://swiftshader-review.googlesource.com/2756 Reviewed-by: Nicolas Capens Tested-by: Nicolas Capens --- diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp index a784deda9..780163336 100644 --- a/src/OpenGL/libGLES_CM/Context.cpp +++ b/src/OpenGL/libGLES_CM/Context.cpp @@ -1952,9 +1952,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, unsigned short *dest16 = (unsigned short*)dest; unsigned int *dest32 = (unsigned int*)dest; - if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 && + if(renderTarget->getInternalFormat() == sw::FORMAT_A8B8G8R8 && format == GL_RGBA && type == GL_UNSIGNED_BYTE) { + memcpy(dest, source, (rect.x1 - rect.x0) * 4); + } + else if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 && + format == GL_RGBA && type == GL_UNSIGNED_BYTE) + { for(int i = 0; i < rect.x1 - rect.x0; i++) { unsigned int argb = *(unsigned int*)(source + 4 * i); @@ -2038,6 +2043,16 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, r = (argb & 0x00FF0000) * (1.0f / 0x00FF0000); } break; + case sw::FORMAT_A8B8G8R8: + { + unsigned int abgr = *(unsigned int*)(source + 4 * i); + + a = (abgr & 0xFF000000) * (1.0f / 0xFF000000); + b = (abgr & 0x00FF0000) * (1.0f / 0x00FF0000); + g = (abgr & 0x0000FF00) * (1.0f / 0x0000FF00); + r = (abgr & 0x000000FF) * (1.0f / 0x000000FF); + } + break; case sw::FORMAT_X8R8G8B8: { unsigned int xrgb = *(unsigned int*)(source + 4 * i); @@ -2048,6 +2063,16 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, r = (xrgb & 0x00FF0000) * (1.0f / 0x00FF0000); } break; + case sw::FORMAT_X8B8G8R8: + { + unsigned int xbgr = *(unsigned int*)(source + 4 * i); + + a = 1.0f; + b = (xbgr & 0x00FF0000) * (1.0f / 0x00FF0000); + g = (xbgr & 0x0000FF00) * (1.0f / 0x0000FF00); + r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF); + } + break; case sw::FORMAT_A2R10G10B10: { unsigned int argb = *(unsigned int*)(source + 4 * i); diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp index 2b099a246..0fdb24a09 100644 --- a/src/OpenGL/libGLESv2/Context.cpp +++ b/src/OpenGL/libGLESv2/Context.cpp @@ -2597,9 +2597,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, unsigned short *dest16 = (unsigned short*)dest; unsigned int *dest32 = (unsigned int*)dest; - if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 && + if(renderTarget->getInternalFormat() == sw::FORMAT_A8B8G8R8 && format == GL_RGBA && type == GL_UNSIGNED_BYTE) { + memcpy(dest, source, (rect.x1 - rect.x0) * 4); + } + else if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 && + format == GL_RGBA && type == GL_UNSIGNED_BYTE) + { for(int i = 0; i < rect.x1 - rect.x0; i++) { unsigned int argb = *(unsigned int*)(source + 4 * i); @@ -2693,6 +2698,16 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, r = (argb & 0x00FF0000) * (1.0f / 0x00FF0000); } break; + case sw::FORMAT_A8B8G8R8: + { + unsigned int abgr = *(unsigned int*)(source + 4 * i); + + a = (abgr & 0xFF000000) * (1.0f / 0xFF000000); + b = (abgr & 0x00FF0000) * (1.0f / 0x00FF0000); + g = (abgr & 0x0000FF00) * (1.0f / 0x0000FF00); + r = (abgr & 0x000000FF) * (1.0f / 0x000000FF); + } + break; case sw::FORMAT_X8R8G8B8: { unsigned int xrgb = *(unsigned int*)(source + 4 * i); @@ -2703,6 +2718,16 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, r = (xrgb & 0x00FF0000) * (1.0f / 0x00FF0000); } break; + case sw::FORMAT_X8B8G8R8: + { + unsigned int xbgr = *(unsigned int*)(source + 4 * i); + + a = 1.0f; + b = (xbgr & 0x00FF0000) * (1.0f / 0x00FF0000); + g = (xbgr & 0x0000FF00) * (1.0f / 0x0000FF00); + r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF); + } + break; case sw::FORMAT_A2R10G10B10: { unsigned int argb = *(unsigned int*)(source + 4 * i); @@ -2792,7 +2817,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, switch(type) { case GL_UNSIGNED_SHORT_5_6_5: - dest16[i] = + dest16[i] = ((unsigned short)(31 * b + 0.5f) << 0) | ((unsigned short)(63 * g + 0.5f) << 5) | ((unsigned short)(31 * r + 0.5f) << 11);