Reject copying from GL_RGB10_A2 to unsized formats.
glCopyTexImage2D() with an framebuffer format of GL_RGB10_A2 and
internalformat of GL_LUMINANCE_ALPHA was hitting the UNIMPLEMENTED()
assert.
The spec states that:
If an effective internal format exists that has
* the same component sizes as,
* component sizes greater than or equal to, or
* component sizes smaller than or equal to
those of the source buffer's effective internal format (for all
matching components in <internalformat>), that format is chosen for
the new image array and this is the effective internal format of the
new texel array.
There is no unorm luminance+alpha format that has all components either
greater or smaller, so this operation is invalid.
Also see https://www.khronos.org/members/login/bugzilla/show_bug.cgi?id=9807#c56
Bug chromium:853424
Change-Id: Ia79a50bf7411a3f2aa87cf7f9bdbcbf971bdd7ce
Reviewed-on: https://swiftshader-review.googlesource.com/19768
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 7ae8126..b7ae2c5 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -930,6 +930,13 @@
// Determine the sized internal format.
if(gl::IsUnsizedInternalFormat(internalformat))
{
+ if(colorbufferFormat == GL_RGB10_A2)
+ {
+ // Not supported with unsized internalformat.
+ // https://www.khronos.org/members/login/bugzilla/show_bug.cgi?id=9807#c56
+ return error(GL_INVALID_OPERATION);
+ }
+
if(gl::GetBaseInternalFormat(colorbufferFormat) == internalformat)
{
internalformat = colorbufferFormat;
@@ -959,6 +966,7 @@
}
else
{
+ printf("internalformat = %x, colorbufferFormat = %X\n", internalformat, colorbufferFormat);
UNIMPLEMENTED();
return error(GL_INVALID_OPERATION);