diff options
Diffstat (limited to 'src/mesa/main')
-rw-r--r-- | src/mesa/main/teximage.c | 63 |
1 files changed, 56 insertions, 7 deletions
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 0a641cf2cad..56ae4150a6f 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -1854,19 +1854,68 @@ _mesa_target_can_be_compressed(const struct gl_context *ctx, GLenum target, return write_error(error, GL_INVALID_OPERATION); target_can_be_compresed = ctx->Extensions.ARB_texture_cube_map_array; - break; - case GL_TEXTURE_3D: - /* See ETC2/EAC comment in switch case GL_TEXTURE_CUBE_MAP_ARRAY. */ - if (layout == MESA_FORMAT_LAYOUT_ETC2 && _mesa_is_gles3(ctx)) + /* From the KHR_texture_compression_astc_hdr spec: + * + * Add a second new column "3D Tex." which is empty for all non-ASTC + * formats. If only the LDR profile is supported by the + * implementation, this column is also empty for all ASTC formats. If + * both the LDR and HDR profiles are supported only, this column is + * checked for all ASTC formats. + * + * Add a third new column "Cube Map Array Tex." which is empty for all + * non-ASTC formats, and checked for all ASTC formats. + * + * and, + * + * 'An INVALID_OPERATION error is generated by CompressedTexImage3D + * if <internalformat> is TEXTURE_CUBE_MAP_ARRAY and the + * "Cube Map Array" column of table 8.19 is *not* checked, or if + * <internalformat> is TEXTURE_3D and the "3D Tex." column of table + * 8.19 is *not* checked' + * + * The instances of <internalformat> above should say <target>. + */ + + /* Throw an INVALID_OPERATION error if the target is + * TEXTURE_CUBE_MAP_ARRAY and the format is not ASTC. + */ + if (target_can_be_compresed && + ctx->Extensions.KHR_texture_compression_astc_ldr && + layout != MESA_FORMAT_LAYOUT_ASTC) return write_error(error, GL_INVALID_OPERATION); - if (layout == MESA_FORMAT_LAYOUT_BPTC) { + break; + case GL_TEXTURE_3D: + switch (layout) { + case MESA_FORMAT_LAYOUT_ETC2: + /* See ETC2/EAC comment in case GL_TEXTURE_CUBE_MAP_ARRAY. */ + if (_mesa_is_gles3(ctx)) + return write_error(error, GL_INVALID_OPERATION); + break; + case MESA_FORMAT_LAYOUT_BPTC: target_can_be_compresed = ctx->Extensions.ARB_texture_compression_bptc; break; - } + case MESA_FORMAT_LAYOUT_ASTC: + target_can_be_compresed = + ctx->Extensions.KHR_texture_compression_astc_hdr; - break; + /* Throw an INVALID_OPERATION error if the target is TEXTURE_3D and + * and the hdr extension is not supported. + * See comment in switch case GL_TEXTURE_CUBE_MAP_ARRAY for more info. + */ + if (!target_can_be_compresed) + return write_error(error, GL_INVALID_OPERATION); + break; + default: + /* Throw an INVALID_OPERATION error if the target is TEXTURE_3D and + * the format is not ASTC. + * See comment in switch case GL_TEXTURE_CUBE_MAP_ARRAY for more info. + */ + if (ctx->Extensions.KHR_texture_compression_astc_ldr) + return write_error(error, GL_INVALID_OPERATION); + break; + } default: break; } |