Fix glTexSubImage support of half-float extension formats.
GL_HALF_FLOAT_OES and GL_HALF_FLOAT have different enum values, and we
weren't handling the case where a half-float texture was already
created (e.g. with an effective internal format of GL_RGBA16F) and then
updated with a glTexSubImage call using GL_HALF_FLOAT_OES type. In
other words, we assumed the OpenGL ES 3.0 sized internal format could
only be used with the OpenGL ES 3.0 half-float type, but this hasn't
been true since we started storing only the effective internal format
for all versions.
Note that GL_OES_texture_half_float, which defines GL_HALF_FLOAT_OES,
does not clarify whether HALF_FLOAT images can be updated using FLOAT,
or vice-versa. We're assuming the equivalent combinations of OpenGL ES
3.0 table 3.3 are valid. That is, FLOAT can be used to update,
HALF_FLOAT, but not the other way around.
Bug b/74609191
Change-Id: Ib8548cd37065820eb59a0943fd39647edc5e9f1b
Reviewed-on: https://swiftshader-review.googlesource.com/17748
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 c7f6bbb..facc550 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -957,7 +957,7 @@
{
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGBA8, GL_RGB5_A1, GL_RGBA4, GL_SRGB8_ALPHA8)
case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RGBA8_SNORM)
- case GL_HALF_FLOAT_OES: break;
+ case GL_HALF_FLOAT_OES: VALIDATE_INTERNALFORMAT(GL_RGBA16F)
case GL_UNSIGNED_SHORT_4_4_4_4: VALIDATE_INTERNALFORMAT(GL_RGBA4)
case GL_UNSIGNED_SHORT_5_5_5_1: VALIDATE_INTERNALFORMAT(GL_RGB5_A1)
case GL_UNSIGNED_INT_2_10_10_10_REV: VALIDATE_INTERNALFORMAT(GL_RGB10_A2, GL_RGB5_A1)
@@ -984,7 +984,7 @@
{
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8, GL_RGB565, GL_SRGB8)
case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8_SNORM)
- case GL_HALF_FLOAT_OES: break;
+ case GL_HALF_FLOAT_OES: VALIDATE_INTERNALFORMAT(GL_RGB16F)
case GL_UNSIGNED_SHORT_5_6_5: VALIDATE_INTERNALFORMAT(GL_RGB565)
case GL_UNSIGNED_INT_10F_11F_11F_REV: VALIDATE_INTERNALFORMAT(GL_R11F_G11F_B10F)
case GL_UNSIGNED_INT_5_9_9_9_REV: VALIDATE_INTERNALFORMAT(GL_RGB9_E5)
@@ -996,13 +996,13 @@
case GL_RGB_INTEGER:
switch(type)
{
- case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8UI)
- case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8I)
- case GL_UNSIGNED_SHORT: VALIDATE_INTERNALFORMAT(GL_RGB16UI)
- case GL_SHORT: VALIDATE_INTERNALFORMAT(GL_RGB16I)
- case GL_UNSIGNED_INT: VALIDATE_INTERNALFORMAT(GL_RGB32UI)
- case GL_INT: VALIDATE_INTERNALFORMAT(GL_RGB32I)
- default: return GL_INVALID_OPERATION;
+ case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8UI)
+ case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8I)
+ case GL_UNSIGNED_SHORT: VALIDATE_INTERNALFORMAT(GL_RGB16UI)
+ case GL_SHORT: VALIDATE_INTERNALFORMAT(GL_RGB16I)
+ case GL_UNSIGNED_INT: VALIDATE_INTERNALFORMAT(GL_RGB32UI)
+ case GL_INT: VALIDATE_INTERNALFORMAT(GL_RGB32I)
+ default: return GL_INVALID_OPERATION;
}
break;
case GL_RG:
@@ -1010,7 +1010,6 @@
{
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RG8)
case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RG8_SNORM)
- case GL_HALF_FLOAT_OES: break;
case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_RG16F)
case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_RG32F, GL_RG16F)
default: return GL_INVALID_OPERATION;
@@ -1033,7 +1032,6 @@
{
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_R8)
case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_R8_SNORM)
- case GL_HALF_FLOAT_OES: break;
case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_R16F)
case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_R32F, GL_R16F)
default: return GL_INVALID_OPERATION;
@@ -1072,8 +1070,9 @@
switch(type)
{
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_LUMINANCE8_ALPHA8_EXT)
- case GL_HALF_FLOAT_OES: // Invalid, only exists as unsized.
- case GL_FLOAT: // Invalid, only exists as unsized.
+ case GL_HALF_FLOAT_OES: VALIDATE_INTERNALFORMAT(GL_LUMINANCE_ALPHA16F_EXT)
+ case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_LUMINANCE_ALPHA16F_EXT)
+ case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA16F_EXT)
default:
return GL_INVALID_OPERATION;
}
@@ -1082,8 +1081,9 @@
switch(type)
{
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_LUMINANCE8_EXT)
- case GL_HALF_FLOAT_OES: // Invalid, only exists as unsized.
- case GL_FLOAT: // Invalid, only exists as unsized.
+ case GL_HALF_FLOAT_OES: VALIDATE_INTERNALFORMAT(GL_LUMINANCE16F_EXT)
+ case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_LUMINANCE16F_EXT)
+ case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_LUMINANCE32F_EXT, GL_LUMINANCE16F_EXT)
default:
return GL_INVALID_OPERATION;
}
@@ -1092,8 +1092,9 @@
switch(type)
{
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_ALPHA8_EXT)
- case GL_HALF_FLOAT_OES: // Invalid, only exists as unsized.
- case GL_FLOAT: // Invalid, only exists as unsized.
+ case GL_HALF_FLOAT_OES: VALIDATE_INTERNALFORMAT(GL_ALPHA16F_EXT)
+ case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_ALPHA16F_EXT)
+ case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_ALPHA32F_EXT, GL_ALPHA16F_EXT)
default:
return GL_INVALID_OPERATION;
}