Refactor CopyTexImage format validation.
Deduplicate common functions and remove unsized color buffer formats.
Change-Id: I76b3b507c27c8bfa932aab64a9338e2a124a25da
Reviewed-on: https://swiftshader-review.googlesource.com/16289
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 7464ed6..4d190c9 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -54,69 +54,6 @@
return true;
}
-static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)
-{
- if(IsCompressed(textureFormat, egl::getClientVersion()))
- {
- return error(GL_INVALID_OPERATION, false);
- }
-
- // [OpenGL ES 2.0.24] table 3.9
- switch(textureFormat)
- {
- case GL_ALPHA:
- if(colorbufferFormat != GL_ALPHA &&
- colorbufferFormat != GL_RGBA &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_RGBA16F_EXT &&
- colorbufferFormat != GL_RGBA32F_EXT)
- {
- return error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_LUMINANCE:
- case GL_RGB:
- if(colorbufferFormat != GL_RGB &&
- colorbufferFormat != GL_RGB565 &&
- colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_RGB16F_EXT &&
- colorbufferFormat != GL_RGB32F_EXT &&
- colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_RGBA16F_EXT &&
- colorbufferFormat != GL_RGBA32F_EXT)
- {
- return error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_LUMINANCE_ALPHA:
- case GL_RGBA:
- if(colorbufferFormat != GL_RGBA &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_RGBA16F_EXT &&
- colorbufferFormat != GL_RGBA32F_EXT)
- {
- return error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_OES:
- return error(GL_INVALID_OPERATION, false);
- default:
- return error(GL_INVALID_ENUM, false);
- }
- return true;
-}
-
void ActiveTexture(GLenum texture)
{
TRACE("(GLenum texture = 0x%X)", texture);
@@ -1054,7 +991,7 @@
GLenum colorbufferFormat = source->getFormat();
- if(!validateColorBufferFormat(internalformat, colorbufferFormat))
+ if(!ValidateCopyFormats(internalformat, colorbufferFormat))
{
return;
}
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 1c1e2d0..1c934a2 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -53,57 +53,6 @@
return true;
}
-static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)
-{
- if(IsCompressed(textureFormat, egl::getClientVersion()))
- {
- return error(GL_INVALID_OPERATION, false);
- }
-
- switch(textureFormat)
- {
- case GL_ALPHA:
- if(colorbufferFormat != GL_ALPHA &&
- colorbufferFormat != GL_RGBA &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8)
- {
- return error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_LUMINANCE:
- case GL_RGB:
- if(colorbufferFormat != GL_RGB &&
- colorbufferFormat != GL_RGB565 &&
- colorbufferFormat != GL_RGB8 &&
- colorbufferFormat != GL_RGBA &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8)
- {
- return error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_LUMINANCE_ALPHA:
- case GL_RGBA:
- if(colorbufferFormat != GL_RGBA &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8)
- {
- return error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL:
- return error(GL_INVALID_OPERATION, false);
- default:
- return error(GL_INVALID_ENUM, false);
- }
- return true;
-}
-
static FormatMap BuildFormatMap3D()
{
FormatMap map;
@@ -798,7 +747,7 @@
GLenum textureFormat = texture->getFormat(target, level);
- if(!validateColorBufferFormat(textureFormat, colorbufferFormat))
+ if(!ValidateCopyFormats(textureFormat, colorbufferFormat))
{
return;
}
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 87245ac..3cc0e0b 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -610,6 +610,66 @@
return GL_NONE;
}
+ bool ValidateCopyFormats(GLenum textureFormat, GLenum colorbufferFormat)
+ {
+ if(IsCompressed(textureFormat, egl::getClientVersion()))
+ {
+ return error(GL_INVALID_OPERATION, false);
+ }
+
+ // [OpenGL ES 2.0.24] table 3.9
+ // [OpenGL ES 3.0.5] table 3.16
+ switch(textureFormat)
+ {
+ case GL_ALPHA:
+ if(colorbufferFormat != GL_RGBA4 &&
+ colorbufferFormat != GL_RGB5_A1 &&
+ colorbufferFormat != GL_RGBA8 &&
+ colorbufferFormat != GL_BGRA8_EXT &&
+ colorbufferFormat != GL_RGBA16F_EXT &&
+ colorbufferFormat != GL_RGBA32F_EXT)
+ {
+ return error(GL_INVALID_OPERATION, false);
+ }
+ break;
+ case GL_LUMINANCE:
+ case GL_RGB:
+ if(colorbufferFormat != GL_RGB565 &&
+ colorbufferFormat != GL_RGB8 &&
+ colorbufferFormat != GL_RGBA4 &&
+ colorbufferFormat != GL_RGB5_A1 &&
+ colorbufferFormat != GL_RGBA8 &&
+ colorbufferFormat != GL_RGB16F_EXT &&
+ colorbufferFormat != GL_RGB32F_EXT &&
+ colorbufferFormat != GL_BGRA8_EXT &&
+ colorbufferFormat != GL_RGBA16F_EXT &&
+ colorbufferFormat != GL_RGBA32F_EXT)
+ {
+ return error(GL_INVALID_OPERATION, false);
+ }
+ break;
+ case GL_LUMINANCE_ALPHA:
+ case GL_RGBA:
+ if(colorbufferFormat != GL_RGBA4 &&
+ colorbufferFormat != GL_RGB5_A1 &&
+ colorbufferFormat != GL_RGBA8 &&
+ colorbufferFormat != GL_BGRA8_EXT &&
+ colorbufferFormat != GL_RGBA16F_EXT &&
+ colorbufferFormat != GL_RGBA32F_EXT)
+ {
+ return error(GL_INVALID_OPERATION, false);
+ }
+ break;
+ case GL_DEPTH_COMPONENT:
+ case GL_DEPTH_STENCIL_OES:
+ return error(GL_INVALID_OPERATION, false);
+ default:
+ return error(GL_INVALID_ENUM, false);
+ }
+
+ return true;
+ }
+
bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type, GLint clientVersion)
{
// GL_NV_read_depth
diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h
index 1dc1222..f83e752 100644
--- a/src/OpenGL/libGLESv2/utilities.h
+++ b/src/OpenGL/libGLESv2/utilities.h
@@ -48,6 +48,7 @@
GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture, GLint clientVersion);
GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture, GLint clientVersion);
+ bool ValidateCopyFormats(GLenum textureFormat, GLenum colorbufferFormat);
bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type, GLint clientVersion);
bool IsDepthTexture(GLenum format);
bool IsStencilTexture(GLenum format);