mesa: Expose GL_OES_required_internalformat on GLES contexts.
This extension is effectively a backport of GLES3's internalformat handling to GLES 1/2. It guarantees that sized internalformats specified for textures and renderbuffers have at least the specified size stored. That's a pretty minimal requirement, so I think it can be dummy_true and exposed as a standard in Mesa. As a side effect, it also allows GL_RGB565 to be specified as a texture format, not just as a renderbuffer. Mesa had previously been allowing 565 textures, which angered DEQP in the absence of this extension being exposed. v2: Allow 2101010rev with sized internalformats even on GLES3, citing the extension spec. Extend extension checks for GLES2 contexts exposing with texture_float, texture_half_float, and texture_rg. v3: Fix ALPHA/LUMINANCE/LUMINANCE_ALPHA error checking (GLES3 CTS failures) v4: Mark GL_RGB10 non-color-renderable on ES, fix A/L/LA errors on GLES2 with float formats. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
cee5585da7
commit
c16a7443e9
|
@ -319,7 +319,7 @@ Khronos, ARB, and OES extensions that are not part of any OpenGL or OpenGL ES ve
|
|||
GL_OES_depth_texture_cube_map DONE (all drivers that support GLSL 1.30+)
|
||||
GL_OES_EGL_image DONE (all drivers)
|
||||
GL_OES_EGL_image_external_essl3 not started
|
||||
GL_OES_required_internalformat not started - GLES2 extension based on OpenGL ES 3.0 feature
|
||||
GL_OES_required_internalformat DONE (all drivers)
|
||||
GL_OES_surfaceless_context DONE (all drivers)
|
||||
GL_OES_texture_compression_astc DONE (core only)
|
||||
GL_OES_texture_float DONE (i965, r300, r600, radeonsi, nv30, nv50, nvc0, softpipe, llvmpipe)
|
||||
|
|
|
@ -376,6 +376,7 @@ EXT(OES_point_sprite , ARB_point_sprite
|
|||
EXT(OES_primitive_bounding_box , OES_primitive_bounding_box , x , x , x , 31, 2014)
|
||||
EXT(OES_query_matrix , dummy_true , x , x , ES1, x , 2003)
|
||||
EXT(OES_read_format , dummy_true , GLL, x , ES1, x , 2003)
|
||||
EXT(OES_required_internalformat , dummy_true , x , x , ES1, ES2, 2012)
|
||||
EXT(OES_rgb8_rgba8 , dummy_true , x , x , ES1, ES2, 2005)
|
||||
EXT(OES_sample_shading , OES_sample_variables , x , x , x , 30, 2014)
|
||||
EXT(OES_sample_variables , OES_sample_variables , x , x , x , 30, 2014)
|
||||
|
|
|
@ -729,6 +729,7 @@ is_format_color_renderable(const struct gl_context *ctx, mesa_format format,
|
|||
case GL_RGB8I:
|
||||
case GL_RGB8UI:
|
||||
case GL_SRGB8:
|
||||
case GL_RGB10:
|
||||
case GL_RGB9_E5:
|
||||
case GL_RG8_SNORM:
|
||||
case GL_R8_SNORM:
|
||||
|
|
|
@ -2779,7 +2779,7 @@ _mesa_es3_effective_internal_format_for_format_and_type(GLenum format,
|
|||
|
||||
/**
|
||||
* Do error checking of format/type combinations for OpenGL ES 3
|
||||
* glTex[Sub]Image.
|
||||
* glTex[Sub]Image, or ES1/ES2 with GL_OES_required_internalformat.
|
||||
* \return error code, or GL_NO_ERROR.
|
||||
*/
|
||||
GLenum
|
||||
|
@ -2842,7 +2842,10 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
case GL_RGBA8:
|
||||
case GL_RGB5_A1:
|
||||
case GL_RGBA4:
|
||||
break;
|
||||
case GL_SRGB8_ALPHA8_EXT:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
default:
|
||||
return GL_INVALID_OPERATION;
|
||||
|
@ -2850,7 +2853,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_BYTE:
|
||||
if (internalFormat != GL_RGBA8_SNORM)
|
||||
if (ctx->Version <= 20 || internalFormat != GL_RGBA8_SNORM)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
|
||||
|
@ -2876,9 +2879,11 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
|
||||
case GL_UNSIGNED_INT_2_10_10_10_REV:
|
||||
switch (internalFormat) {
|
||||
case GL_RGBA: /* GL_EXT_texture_type_2_10_10_10_REV */
|
||||
case GL_RGBA:
|
||||
case GL_RGB10_A2:
|
||||
case GL_RGB5_A1:
|
||||
if (!ctx->Extensions.EXT_texture_type_2_10_10_10_REV)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
default:
|
||||
return GL_INVALID_OPERATION;
|
||||
|
@ -2886,7 +2891,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_HALF_FLOAT:
|
||||
if (internalFormat != GL_RGBA16F)
|
||||
if (ctx->Version <= 20 || internalFormat != GL_RGBA16F)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
|
||||
|
@ -2894,6 +2899,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
switch (internalFormat) {
|
||||
case GL_RGBA16F:
|
||||
case GL_RGBA32F:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
case GL_RGBA:
|
||||
if (ctx->Extensions.OES_texture_float && internalFormat == format)
|
||||
|
@ -2912,6 +2919,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_RGBA_INTEGER:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
switch (type) {
|
||||
case GL_UNSIGNED_BYTE:
|
||||
if (internalFormat != GL_RGBA8UI)
|
||||
|
@ -2960,7 +2969,10 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
case GL_RGB:
|
||||
case GL_RGB8:
|
||||
case GL_RGB565:
|
||||
break;
|
||||
case GL_SRGB8:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
default:
|
||||
return GL_INVALID_OPERATION;
|
||||
|
@ -2968,7 +2980,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_BYTE:
|
||||
if (internalFormat != GL_RGB8_SNORM)
|
||||
if (ctx->Version <= 20 || internalFormat != GL_RGB8_SNORM)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
|
||||
|
@ -2983,16 +2995,18 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_UNSIGNED_INT_10F_11F_11F_REV:
|
||||
if (internalFormat != GL_R11F_G11F_B10F)
|
||||
if (ctx->Version <= 20 || internalFormat != GL_R11F_G11F_B10F)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
|
||||
case GL_UNSIGNED_INT_5_9_9_9_REV:
|
||||
if (internalFormat != GL_RGB9_E5)
|
||||
if (ctx->Version <= 20 || internalFormat != GL_RGB9_E5)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
|
||||
case GL_HALF_FLOAT:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
switch (internalFormat) {
|
||||
case GL_RGB16F:
|
||||
case GL_R11F_G11F_B10F:
|
||||
|
@ -3009,6 +3023,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
case GL_RGB32F:
|
||||
case GL_R11F_G11F_B10F:
|
||||
case GL_RGB9_E5:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
case GL_RGB:
|
||||
if (ctx->Extensions.OES_texture_float && internalFormat == format)
|
||||
|
@ -3025,7 +3041,16 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
|
||||
case GL_UNSIGNED_INT_2_10_10_10_REV:
|
||||
switch (internalFormat) {
|
||||
case GL_RGB: /* GL_EXT_texture_type_2_10_10_10_REV */
|
||||
case GL_RGB:
|
||||
case GL_RGB10:
|
||||
case GL_RGB8:
|
||||
case GL_RGB565:
|
||||
/* GL_EXT_texture_type_2_10_10_10_REV allows GL_RGB even though
|
||||
* GLES3 doesn't, and GL_OES_required_internalformat extends that
|
||||
* to allow the sized RGB internalformats as well.
|
||||
*/
|
||||
if (!ctx->Extensions.EXT_texture_type_2_10_10_10_REV)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
default:
|
||||
return GL_INVALID_OPERATION;
|
||||
|
@ -3038,6 +3063,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_RGB_INTEGER:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
switch (type) {
|
||||
case GL_UNSIGNED_BYTE:
|
||||
if (internalFormat != GL_RGB8UI)
|
||||
|
@ -3075,6 +3102,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_RG:
|
||||
if (!ctx->Extensions.ARB_texture_rg)
|
||||
return GL_INVALID_OPERATION;
|
||||
switch (type) {
|
||||
case GL_UNSIGNED_BYTE:
|
||||
if (internalFormat != GL_RG8)
|
||||
|
@ -3122,6 +3151,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_RG_INTEGER:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
switch (type) {
|
||||
case GL_UNSIGNED_BYTE:
|
||||
if (internalFormat != GL_RG8UI)
|
||||
|
@ -3159,6 +3190,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_RED:
|
||||
if (!ctx->Extensions.ARB_texture_rg)
|
||||
return GL_INVALID_OPERATION;
|
||||
switch (type) {
|
||||
case GL_UNSIGNED_BYTE:
|
||||
if (internalFormat != GL_R8)
|
||||
|
@ -3207,6 +3240,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_RED_INTEGER:
|
||||
if (ctx->Version <= 20)
|
||||
return GL_INVALID_OPERATION;
|
||||
switch (type) {
|
||||
case GL_UNSIGNED_BYTE:
|
||||
if (internalFormat != GL_R8UI)
|
||||
|
@ -3263,7 +3298,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_FLOAT:
|
||||
if (internalFormat != GL_DEPTH_COMPONENT32F)
|
||||
if (ctx->Version <= 20 || internalFormat != GL_DEPTH_COMPONENT32F)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
|
||||
|
@ -3281,7 +3316,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
break;
|
||||
|
||||
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
|
||||
if (internalFormat != GL_DEPTH32F_STENCIL8)
|
||||
if (ctx->Version <= 20 || internalFormat != GL_DEPTH32F_STENCIL8)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
|
||||
|
@ -3303,15 +3338,27 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
|
|||
case GL_LUMINANCE_ALPHA:
|
||||
switch (type) {
|
||||
case GL_FLOAT:
|
||||
if (ctx->Extensions.OES_texture_float && internalFormat == format)
|
||||
break;
|
||||
case GL_HALF_FLOAT_OES:
|
||||
if (ctx->Extensions.OES_texture_half_float && internalFormat == format)
|
||||
break;
|
||||
default:
|
||||
if (type != GL_UNSIGNED_BYTE || format != internalFormat)
|
||||
if (!ctx->Extensions.OES_texture_float || internalFormat != format)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
case GL_HALF_FLOAT_OES:
|
||||
if (!ctx->Extensions.OES_texture_half_float || internalFormat != format)
|
||||
return GL_INVALID_OPERATION;
|
||||
break;
|
||||
case GL_UNSIGNED_BYTE:
|
||||
if (!(format == internalFormat ||
|
||||
(format == GL_ALPHA && internalFormat == GL_ALPHA8) ||
|
||||
(format == GL_LUMINANCE && internalFormat == GL_LUMINANCE8) ||
|
||||
(format == GL_LUMINANCE_ALPHA &&
|
||||
((internalFormat == GL_LUMINANCE8_ALPHA8) ||
|
||||
(internalFormat == GL_LUMINANCE4_ALPHA4))))) {
|
||||
return GL_INVALID_OPERATION;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return GL_INVALID_OPERATION;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return GL_NO_ERROR;
|
||||
|
|
|
@ -1731,28 +1731,15 @@ texture_format_error_check_gles(struct gl_context *ctx, GLenum format,
|
|||
GLenum type, GLenum internalFormat,
|
||||
GLuint dimensions, const char *callerName)
|
||||
{
|
||||
GLenum err;
|
||||
|
||||
if (_mesa_is_gles3(ctx)) {
|
||||
err = _mesa_es3_error_check_format_and_type(ctx, format, type,
|
||||
internalFormat);
|
||||
if (err != GL_NO_ERROR) {
|
||||
_mesa_error(ctx, err,
|
||||
"%s(format = %s, type = %s, internalformat = %s)",
|
||||
callerName, _mesa_enum_to_string(format),
|
||||
_mesa_enum_to_string(type),
|
||||
_mesa_enum_to_string(internalFormat));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
err = _mesa_es_error_check_format_and_type(ctx, format, type, dimensions);
|
||||
if (err != GL_NO_ERROR) {
|
||||
_mesa_error(ctx, err, "%s(format = %s, type = %s)",
|
||||
callerName, _mesa_enum_to_string(format),
|
||||
_mesa_enum_to_string(type));
|
||||
return true;
|
||||
}
|
||||
GLenum err = _mesa_es3_error_check_format_and_type(ctx, format, type,
|
||||
internalFormat);
|
||||
if (err != GL_NO_ERROR) {
|
||||
_mesa_error(ctx, err,
|
||||
"%s(format = %s, type = %s, internalformat = %s)",
|
||||
callerName, _mesa_enum_to_string(format),
|
||||
_mesa_enum_to_string(type),
|
||||
_mesa_enum_to_string(internalFormat));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
Loading…
Reference in New Issue