Fix using base internal format for CopyTexImage validation. Change-Id: Iddd32408b090f00cbae15a76cab064d699f5098b Reviewed-on: https://swiftshader-review.googlesource.com/16968 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/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp index 3cc0e0b..e435be0 100644 --- a/src/OpenGL/libGLESv2/utilities.cpp +++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -617,9 +617,11 @@ return error(GL_INVALID_OPERATION, false); } + GLenum baseFormat = GetBaseInternalFormat(textureFormat); + // [OpenGL ES 2.0.24] table 3.9 // [OpenGL ES 3.0.5] table 3.16 - switch(textureFormat) + switch(baseFormat) { case GL_ALPHA: if(colorbufferFormat != GL_RGBA4 && @@ -1272,6 +1274,83 @@ return 1; } + GLenum GetBaseInternalFormat(GLint internalformat) + { + switch(internalformat) + { + // [OpenGL ES 3.0 Table 3.13] + case GL_R8: return GL_RED; + case GL_R8_SNORM: return GL_RED; + case GL_RG8: return GL_RG; + case GL_RG8_SNORM: return GL_RG; + case GL_RGB8: return GL_RGB; + case GL_RGB8_SNORM: return GL_RGB; + case GL_RGB565: return GL_RGB; + case GL_RGBA4: return GL_RGBA; + case GL_RGB5_A1: return GL_RGBA; + case GL_RGBA8: return GL_RGBA; + case GL_RGBA8_SNORM: return GL_RGBA; + case GL_RGB10_A2: return GL_RGBA; + case GL_RGB10_A2UI: return GL_RGBA; + case GL_SRGB8: return GL_RGB; + case GL_SRGB8_ALPHA8: return GL_RGBA; + case GL_R16F: return GL_RED; + case GL_RG16F: return GL_RG; + case GL_RGB16F: return GL_RGB; + case GL_RGBA16F: return GL_RGBA; + case GL_R32F: return GL_RED; + case GL_RG32F: return GL_RG; + case GL_RGB32F: return GL_RGB; + case GL_RGBA32F: return GL_RGBA; + case GL_R11F_G11F_B10F: return GL_RGB; + case GL_RGB9_E5: return GL_RGB; + case GL_R8I: return GL_RED; + case GL_R8UI: return GL_RED; + case GL_R16I: return GL_RED; + case GL_R16UI: return GL_RED; + case GL_R32I: return GL_RED; + case GL_R32UI: return GL_RED; + case GL_RG8I: return GL_RG; + case GL_RG8UI: return GL_RG; + case GL_RG16I: return GL_RG; + case GL_RG16UI: return GL_RG; + case GL_RG32I: return GL_RG; + case GL_RG32UI: return GL_RG; + case GL_RGB8I: return GL_RGB; + case GL_RGB8UI: return GL_RGB; + case GL_RGB16I: return GL_RGB; + case GL_RGB16UI: return GL_RGB; + case GL_RGB32I: return GL_RGB; + case GL_RGB32UI: return GL_RGB; + case GL_RGBA8I: return GL_RGBA; + case GL_RGBA8UI: return GL_RGBA; + case GL_RGBA16I: return GL_RGBA; + case GL_RGBA16UI: return GL_RGBA; + case GL_RGBA32I: return GL_RGBA; + case GL_RGBA32UI: return GL_RGBA; + + // GL_EXT_texture_storage + case GL_ALPHA8_EXT: return GL_ALPHA; + case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA; + case GL_LUMINANCE8_EXT: return GL_LUMINANCE; + + case GL_BGRA8_EXT: return GL_BGRA_EXT; // GL_APPLE_texture_format_BGRA8888 + + case GL_DEPTH_COMPONENT24: return GL_DEPTH_COMPONENT; + case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT; + case GL_DEPTH_COMPONENT32F: return GL_DEPTH_COMPONENT; + case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT; + case GL_DEPTH32F_STENCIL8: return GL_DEPTH_STENCIL; + case GL_DEPTH24_STENCIL8: return GL_DEPTH_STENCIL; + case GL_STENCIL_INDEX8: return GL_STENCIL_INDEX_OES; + default: + UNREACHABLE(internalformat); + break; + } + + return GL_NONE; + } + bool IsColorRenderable(GLint internalformat, GLint clientVersion) { if(IsCompressed(internalformat, clientVersion))
diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h index f83e752..d773d77 100644 --- a/src/OpenGL/libGLESv2/utilities.h +++ b/src/OpenGL/libGLESv2/utilities.h
@@ -57,6 +57,7 @@ bool IsTextureTarget(GLenum target); GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLint clientVersion); GLsizei GetTypeSize(GLenum type); + GLenum GetBaseInternalFormat(GLint internalformat); bool IsColorRenderable(GLint internalformat, GLint clientVersion); bool IsDepthRenderable(GLint internalformat, GLint clientVersion);