Commit 6b5038e7 by Nicolas Capens Committed by Nicolas Capens

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/17748Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 2f113e3e
...@@ -957,7 +957,7 @@ namespace es2 ...@@ -957,7 +957,7 @@ namespace es2
{ {
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGBA8, GL_RGB5_A1, GL_RGBA4, GL_SRGB8_ALPHA8) 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_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_4_4_4_4: VALIDATE_INTERNALFORMAT(GL_RGBA4)
case GL_UNSIGNED_SHORT_5_5_5_1: VALIDATE_INTERNALFORMAT(GL_RGB5_A1) 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) case GL_UNSIGNED_INT_2_10_10_10_REV: VALIDATE_INTERNALFORMAT(GL_RGB10_A2, GL_RGB5_A1)
...@@ -984,7 +984,7 @@ namespace es2 ...@@ -984,7 +984,7 @@ namespace es2
{ {
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8, GL_RGB565, GL_SRGB8) case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8, GL_RGB565, GL_SRGB8)
case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8_SNORM) 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_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_10F_11F_11F_REV: VALIDATE_INTERNALFORMAT(GL_R11F_G11F_B10F)
case GL_UNSIGNED_INT_5_9_9_9_REV: VALIDATE_INTERNALFORMAT(GL_RGB9_E5) case GL_UNSIGNED_INT_5_9_9_9_REV: VALIDATE_INTERNALFORMAT(GL_RGB9_E5)
...@@ -996,13 +996,13 @@ namespace es2 ...@@ -996,13 +996,13 @@ namespace es2
case GL_RGB_INTEGER: case GL_RGB_INTEGER:
switch(type) switch(type)
{ {
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8UI) case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8UI)
case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8I) case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RGB8I)
case GL_UNSIGNED_SHORT: VALIDATE_INTERNALFORMAT(GL_RGB16UI) case GL_UNSIGNED_SHORT: VALIDATE_INTERNALFORMAT(GL_RGB16UI)
case GL_SHORT: VALIDATE_INTERNALFORMAT(GL_RGB16I) case GL_SHORT: VALIDATE_INTERNALFORMAT(GL_RGB16I)
case GL_UNSIGNED_INT: VALIDATE_INTERNALFORMAT(GL_RGB32UI) case GL_UNSIGNED_INT: VALIDATE_INTERNALFORMAT(GL_RGB32UI)
case GL_INT: VALIDATE_INTERNALFORMAT(GL_RGB32I) case GL_INT: VALIDATE_INTERNALFORMAT(GL_RGB32I)
default: return GL_INVALID_OPERATION; default: return GL_INVALID_OPERATION;
} }
break; break;
case GL_RG: case GL_RG:
...@@ -1010,7 +1010,6 @@ namespace es2 ...@@ -1010,7 +1010,6 @@ namespace es2
{ {
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RG8) case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RG8)
case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RG8_SNORM) case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_RG8_SNORM)
case GL_HALF_FLOAT_OES: break;
case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_RG16F) case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_RG16F)
case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_RG32F, GL_RG16F) case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_RG32F, GL_RG16F)
default: return GL_INVALID_OPERATION; default: return GL_INVALID_OPERATION;
...@@ -1033,7 +1032,6 @@ namespace es2 ...@@ -1033,7 +1032,6 @@ namespace es2
{ {
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_R8) case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_R8)
case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_R8_SNORM) case GL_BYTE: VALIDATE_INTERNALFORMAT(GL_R8_SNORM)
case GL_HALF_FLOAT_OES: break;
case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_R16F) case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_R16F)
case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_R32F, GL_R16F) case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_R32F, GL_R16F)
default: return GL_INVALID_OPERATION; default: return GL_INVALID_OPERATION;
...@@ -1072,8 +1070,9 @@ namespace es2 ...@@ -1072,8 +1070,9 @@ namespace es2
switch(type) switch(type)
{ {
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_LUMINANCE8_ALPHA8_EXT) case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_LUMINANCE8_ALPHA8_EXT)
case GL_HALF_FLOAT_OES: // Invalid, only exists as unsized. case GL_HALF_FLOAT_OES: VALIDATE_INTERNALFORMAT(GL_LUMINANCE_ALPHA16F_EXT)
case GL_FLOAT: // Invalid, only exists as unsized. case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_LUMINANCE_ALPHA16F_EXT)
case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA16F_EXT)
default: default:
return GL_INVALID_OPERATION; return GL_INVALID_OPERATION;
} }
...@@ -1082,8 +1081,9 @@ namespace es2 ...@@ -1082,8 +1081,9 @@ namespace es2
switch(type) switch(type)
{ {
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_LUMINANCE8_EXT) case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_LUMINANCE8_EXT)
case GL_HALF_FLOAT_OES: // Invalid, only exists as unsized. case GL_HALF_FLOAT_OES: VALIDATE_INTERNALFORMAT(GL_LUMINANCE16F_EXT)
case GL_FLOAT: // Invalid, only exists as unsized. case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_LUMINANCE16F_EXT)
case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_LUMINANCE32F_EXT, GL_LUMINANCE16F_EXT)
default: default:
return GL_INVALID_OPERATION; return GL_INVALID_OPERATION;
} }
...@@ -1092,8 +1092,9 @@ namespace es2 ...@@ -1092,8 +1092,9 @@ namespace es2
switch(type) switch(type)
{ {
case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_ALPHA8_EXT) case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_ALPHA8_EXT)
case GL_HALF_FLOAT_OES: // Invalid, only exists as unsized. case GL_HALF_FLOAT_OES: VALIDATE_INTERNALFORMAT(GL_ALPHA16F_EXT)
case GL_FLOAT: // Invalid, only exists as unsized. case GL_HALF_FLOAT: VALIDATE_INTERNALFORMAT(GL_ALPHA16F_EXT)
case GL_FLOAT: VALIDATE_INTERNALFORMAT(GL_ALPHA32F_EXT, GL_ALPHA16F_EXT)
default: default:
return GL_INVALID_OPERATION; return GL_INVALID_OPERATION;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment