OSDN Git Service

Fix glTexSubImage support of half-float extension formats.
authorNicolas Capens <capn@google.com>
Wed, 14 Mar 2018 21:15:39 +0000 (17:15 -0400)
committerNicolas Capens <nicolascapens@google.com>
Thu, 15 Mar 2018 01:58:53 +0000 (01:58 +0000)
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>
src/OpenGL/libGLESv2/utilities.cpp

index c7f6bbb..facc550 100644 (file)
@@ -957,7 +957,7 @@ namespace es2
                        {
                        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 @@ namespace es2
                        {
                        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 @@ namespace es2
                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 @@ namespace es2
                        {
                        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 @@ namespace es2
                        {
                        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 @@ namespace es2
                        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 @@ namespace es2
                        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 @@ namespace es2
                        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;
                        }