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);