Move ConvertReadFormatType to utilities.
Bug swiftshader:104
Change-Id: Ifcdffd3f960d7bb4982495381465da15ef671c3f
Reviewed-on: https://swiftshader-review.googlesource.com/18429
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/common/Image.cpp b/src/OpenGL/common/Image.cpp
index d169fc9..67de762 100644
--- a/src/OpenGL/common/Image.cpp
+++ b/src/OpenGL/common/Image.cpp
@@ -31,151 +31,6 @@
namespace gl
{
- sw::Format ConvertReadFormatType(GLenum format, GLenum type)
- {
- switch(format)
- {
- case GL_LUMINANCE:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_L8;
- case GL_HALF_FLOAT: return sw::FORMAT_L16F;
- case GL_HALF_FLOAT_OES: return sw::FORMAT_L16F;
- case GL_FLOAT: return sw::FORMAT_L32F;
- default: UNREACHABLE(type);
- }
- break;
- case GL_LUMINANCE_ALPHA:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_A8L8;
- case GL_HALF_FLOAT: return sw::FORMAT_A16L16F;
- case GL_HALF_FLOAT_OES: return sw::FORMAT_A16L16F;
- case GL_FLOAT: return sw::FORMAT_A32L32F;
- default: UNREACHABLE(type);
- }
- break;
- case GL_RGBA:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_A8B8G8R8;
- case GL_UNSIGNED_SHORT_4_4_4_4: return sw::FORMAT_R4G4B4A4;
- case GL_UNSIGNED_SHORT_5_5_5_1: return sw::FORMAT_R5G5B5A1;
- case GL_HALF_FLOAT: return sw::FORMAT_A16B16G16R16F;
- case GL_HALF_FLOAT_OES: return sw::FORMAT_A16B16G16R16F;
- case GL_FLOAT: return sw::FORMAT_A32B32G32R32F;
- case GL_UNSIGNED_INT_2_10_10_10_REV_EXT: return sw::FORMAT_A2B10G10R10;
- default: UNREACHABLE(type);
- }
- break;
- case GL_BGRA_EXT:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_A8R8G8B8;
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return sw::FORMAT_A4R4G4B4;
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return sw::FORMAT_A1R5G5B5;
- default: UNREACHABLE(type);
- }
- break;
- case GL_RGB:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_B8G8R8;
- case GL_UNSIGNED_SHORT_5_6_5: return sw::FORMAT_R5G6B5;
- case GL_HALF_FLOAT: return sw::FORMAT_B16G16R16F;
- case GL_HALF_FLOAT_OES: return sw::FORMAT_B16G16R16F;
- case GL_FLOAT: return sw::FORMAT_B32G32R32F;
- default: UNREACHABLE(type);
- }
- break;
- case GL_RG:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_G8R8;
- case GL_HALF_FLOAT: return sw::FORMAT_G16R16F;
- case GL_HALF_FLOAT_OES: return sw::FORMAT_G16R16F;
- case GL_FLOAT: return sw::FORMAT_G32R32F;
- default: UNREACHABLE(type);
- }
- break;
- case GL_RED:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_R8;
- case GL_HALF_FLOAT: return sw::FORMAT_R16F;
- case GL_HALF_FLOAT_OES: return sw::FORMAT_R16F;
- case GL_FLOAT: return sw::FORMAT_R32F;
- default: UNREACHABLE(type);
- }
- break;
- case GL_ALPHA:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_A8;
- case GL_HALF_FLOAT: return sw::FORMAT_A16F;
- case GL_HALF_FLOAT_OES: return sw::FORMAT_A16F;
- case GL_FLOAT: return sw::FORMAT_A32F;
- default: UNREACHABLE(type);
- }
- break;
- case GL_RED_INTEGER:
- switch(type)
- {
- case GL_INT: return sw::FORMAT_R32I;
- case GL_UNSIGNED_INT: return sw::FORMAT_R32UI;
- default: UNREACHABLE(type);
- }
- break;
- case GL_RG_INTEGER:
- switch(type)
- {
- case GL_INT: return sw::FORMAT_G32R32I;
- case GL_UNSIGNED_INT: return sw::FORMAT_G32R32UI;
- default: UNREACHABLE(type);
- }
- break;
- case GL_RGB_INTEGER:
- switch(type)
- {
- case GL_INT: return sw::FORMAT_X32B32G32R32I;
- case GL_UNSIGNED_INT: return sw::FORMAT_X32B32G32R32UI;
- default: UNREACHABLE(type);
- }
- break;
- case GL_RGBA_INTEGER:
- switch(type)
- {
- case GL_INT: return sw::FORMAT_A32B32G32R32I;
- case GL_UNSIGNED_INT: return sw::FORMAT_A32B32G32R32UI;
- case GL_UNSIGNED_INT_2_10_10_10_REV: return sw::FORMAT_A2B10G10R10UI;
- default: UNREACHABLE(type);
- }
- break;
- case GL_DEPTH_COMPONENT:
- switch(type)
- {
- case GL_UNSIGNED_SHORT: return sw::FORMAT_D16;
- case GL_UNSIGNED_INT_24_8_OES: return sw::FORMAT_D24X8;
- case GL_FLOAT: return sw::FORMAT_D32F_LOCKABLE;
- default: UNREACHABLE(type);
- }
- break;
- case GL_STENCIL_INDEX_OES:
- switch(type)
- {
- case GL_UNSIGNED_BYTE: return sw::FORMAT_S8;
- default: UNREACHABLE(type);
- }
- break;
- case GL_DEPTH_STENCIL_OES: // Cannot be read as one format. Handled separately.
- default:
- UNREACHABLE(format);
- break;
- }
-
- return sw::FORMAT_NULL;
- }
-
bool IsUnsizedInternalFormat(GLint internalformat)
{
switch(internalformat)
diff --git a/src/OpenGL/common/Image.hpp b/src/OpenGL/common/Image.hpp
index f115a63..1a1dfd7 100644
--- a/src/OpenGL/common/Image.hpp
+++ b/src/OpenGL/common/Image.hpp
@@ -53,7 +53,6 @@
};
GLint GetSizedInternalFormat(GLint internalFormat, GLenum type);
-sw::Format ConvertReadFormatType(GLenum format, GLenum type);
sw::Format SelectInternalFormat(GLint format);
bool IsUnsizedInternalFormat(GLint internalformat);
GLenum GetBaseInternalFormat(GLint internalformat);
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 612ee2a..2273e65 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -3345,7 +3345,7 @@
if(format != GL_DEPTH_STENCIL_OES) // The blitter only handles reading either depth or stencil.
{
- sw::Surface *externalSurface = sw::Surface::create(width, height, 1, gl::ConvertReadFormatType(format, type), pixels, outputPitch, outputPitch * outputHeight);
+ sw::Surface *externalSurface = sw::Surface::create(width, height, 1, es2::ConvertReadFormatType(format, type), pixels, outputPitch, outputPitch * outputHeight);
device->blit(renderTarget, srcRect, externalSurface, dstRect, false, false, false);
externalSurface->lockExternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC);
externalSurface->unlockExternal();
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 6ae091e..9dfe434 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -1245,6 +1245,151 @@
return 1;
}
+ sw::Format ConvertReadFormatType(GLenum format, GLenum type)
+ {
+ switch(format)
+ {
+ case GL_LUMINANCE:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_L8;
+ case GL_HALF_FLOAT: return sw::FORMAT_L16F;
+ case GL_HALF_FLOAT_OES: return sw::FORMAT_L16F;
+ case GL_FLOAT: return sw::FORMAT_L32F;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_LUMINANCE_ALPHA:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_A8L8;
+ case GL_HALF_FLOAT: return sw::FORMAT_A16L16F;
+ case GL_HALF_FLOAT_OES: return sw::FORMAT_A16L16F;
+ case GL_FLOAT: return sw::FORMAT_A32L32F;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_RGBA:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_A8B8G8R8;
+ case GL_UNSIGNED_SHORT_4_4_4_4: return sw::FORMAT_R4G4B4A4;
+ case GL_UNSIGNED_SHORT_5_5_5_1: return sw::FORMAT_R5G5B5A1;
+ case GL_HALF_FLOAT: return sw::FORMAT_A16B16G16R16F;
+ case GL_HALF_FLOAT_OES: return sw::FORMAT_A16B16G16R16F;
+ case GL_FLOAT: return sw::FORMAT_A32B32G32R32F;
+ case GL_UNSIGNED_INT_2_10_10_10_REV_EXT: return sw::FORMAT_A2B10G10R10;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_BGRA_EXT:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_A8R8G8B8;
+ case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return sw::FORMAT_A4R4G4B4;
+ case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return sw::FORMAT_A1R5G5B5;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_RGB:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_B8G8R8;
+ case GL_UNSIGNED_SHORT_5_6_5: return sw::FORMAT_R5G6B5;
+ case GL_HALF_FLOAT: return sw::FORMAT_B16G16R16F;
+ case GL_HALF_FLOAT_OES: return sw::FORMAT_B16G16R16F;
+ case GL_FLOAT: return sw::FORMAT_B32G32R32F;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_RG:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_G8R8;
+ case GL_HALF_FLOAT: return sw::FORMAT_G16R16F;
+ case GL_HALF_FLOAT_OES: return sw::FORMAT_G16R16F;
+ case GL_FLOAT: return sw::FORMAT_G32R32F;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_RED:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_R8;
+ case GL_HALF_FLOAT: return sw::FORMAT_R16F;
+ case GL_HALF_FLOAT_OES: return sw::FORMAT_R16F;
+ case GL_FLOAT: return sw::FORMAT_R32F;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_ALPHA:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_A8;
+ case GL_HALF_FLOAT: return sw::FORMAT_A16F;
+ case GL_HALF_FLOAT_OES: return sw::FORMAT_A16F;
+ case GL_FLOAT: return sw::FORMAT_A32F;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_RED_INTEGER:
+ switch(type)
+ {
+ case GL_INT: return sw::FORMAT_R32I;
+ case GL_UNSIGNED_INT: return sw::FORMAT_R32UI;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_RG_INTEGER:
+ switch(type)
+ {
+ case GL_INT: return sw::FORMAT_G32R32I;
+ case GL_UNSIGNED_INT: return sw::FORMAT_G32R32UI;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_RGB_INTEGER:
+ switch(type)
+ {
+ case GL_INT: return sw::FORMAT_X32B32G32R32I;
+ case GL_UNSIGNED_INT: return sw::FORMAT_X32B32G32R32UI;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_RGBA_INTEGER:
+ switch(type)
+ {
+ case GL_INT: return sw::FORMAT_A32B32G32R32I;
+ case GL_UNSIGNED_INT: return sw::FORMAT_A32B32G32R32UI;
+ case GL_UNSIGNED_INT_2_10_10_10_REV: return sw::FORMAT_A2B10G10R10UI;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_DEPTH_COMPONENT:
+ switch(type)
+ {
+ case GL_UNSIGNED_SHORT: return sw::FORMAT_D16;
+ case GL_UNSIGNED_INT_24_8_OES: return sw::FORMAT_D24X8;
+ case GL_FLOAT: return sw::FORMAT_D32F_LOCKABLE;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_STENCIL_INDEX_OES:
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE: return sw::FORMAT_S8;
+ default: UNREACHABLE(type);
+ }
+ break;
+ case GL_DEPTH_STENCIL_OES: // Cannot be read as one format. Handled separately.
+ default:
+ UNREACHABLE(format);
+ break;
+ }
+
+ return sw::FORMAT_NULL;
+ }
+
bool IsColorRenderable(GLint internalformat)
{
if(IsCompressed(internalformat))
diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h
index 3b2704e..a698d20 100644
--- a/src/OpenGL/libGLESv2/utilities.h
+++ b/src/OpenGL/libGLESv2/utilities.h
@@ -59,6 +59,7 @@
bool IsTextureTarget(GLenum target);
GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target);
size_t GetTypeSize(GLenum type);
+ sw::Format ConvertReadFormatType(GLenum format, GLenum type);
bool IsColorRenderable(GLint internalformat);
bool IsDepthRenderable(GLint internalformat);