mesa: validate texture format against GL/ES ctx
authormwezdeck <maksym.wezdecki@collabora.co.uk>
Mon, 27 Sep 2021 08:53:13 +0000 (10:53 +0200)
committerMarge Bot <eric+marge@anholt.net>
Wed, 29 Sep 2021 12:42:21 +0000 (12:42 +0000)
GL_ALPHA, GL_LUMINANCE and GL_LUMINANCE_ALPHA
texture formats are supported in:
1. GL Compatibility spec
2. GLES 1.0 - GLES 3.2 spec

However, these formats are not supported in:
1. GL Core spec

This patch changes a logic of validation
texture formats in calls like glTexImage2D.

If the context is CORE and these formats were
selected, then return "-1" and in upper layer
return GL_INVALID_ENUM.

If the context is not CORE, return appropriate
format.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13059>

src/mesa/main/glformats.c

index 641b103..3e9b5c5 100644 (file)
@@ -2377,13 +2377,13 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat)
 
    switch (internalFormat) {
    case GL_COMPRESSED_ALPHA:
-      return GL_ALPHA;
+      return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
    case GL_COMPRESSED_LUMINANCE:
-      return GL_LUMINANCE;
+      return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
    case GL_COMPRESSED_LUMINANCE_ALPHA:
-      return GL_LUMINANCE_ALPHA;
+      return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
    case GL_COMPRESSED_INTENSITY:
-      return GL_INTENSITY;
+      return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
    case GL_COMPRESSED_RGB:
       return GL_RGB;
    case GL_COMPRESSED_RGBA:
@@ -2413,34 +2413,34 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat)
    if (_mesa_has_half_float_textures(ctx)) {
       switch (internalFormat) {
       case GL_ALPHA16F_ARB:
-         return GL_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
       case GL_RGBA16F_ARB:
          return GL_RGBA;
       case GL_RGB16F_ARB:
          return GL_RGB;
       case GL_INTENSITY16F_ARB:
-         return GL_INTENSITY;
+         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
       case GL_LUMINANCE16F_ARB:
-         return GL_LUMINANCE;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
       case GL_LUMINANCE_ALPHA16F_ARB:
-         return GL_LUMINANCE_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
       }
    }
 
    if (_mesa_has_float_textures(ctx)) {
       switch (internalFormat) {
       case GL_ALPHA32F_ARB:
-         return GL_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
       case GL_RGBA32F_ARB:
          return GL_RGBA;
       case GL_RGB32F_ARB:
          return GL_RGB;
       case GL_INTENSITY32F_ARB:
-         return GL_INTENSITY;
+         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
       case GL_LUMINANCE32F_ARB:
-         return GL_LUMINANCE;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
       case GL_LUMINANCE_ALPHA32F_ARB:
-         return GL_LUMINANCE_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
       }
    }
 
@@ -2465,19 +2465,19 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat)
       case GL_ALPHA_SNORM:
       case GL_ALPHA8_SNORM:
       case GL_ALPHA16_SNORM:
-         return GL_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
       case GL_LUMINANCE_SNORM:
       case GL_LUMINANCE8_SNORM:
       case GL_LUMINANCE16_SNORM:
-         return GL_LUMINANCE;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
       case GL_LUMINANCE_ALPHA_SNORM:
       case GL_LUMINANCE8_ALPHA8_SNORM:
       case GL_LUMINANCE16_ALPHA16_SNORM:
-         return GL_LUMINANCE_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
       case GL_INTENSITY_SNORM:
       case GL_INTENSITY8_SNORM:
       case GL_INTENSITY16_SNORM:
-         return GL_INTENSITY;
+         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
       default:
          ; /* fallthrough */
       }
@@ -2496,11 +2496,11 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat)
       case GL_SLUMINANCE_ALPHA_EXT:
       case GL_SLUMINANCE8_ALPHA8_EXT:
       case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
-         return GL_LUMINANCE_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
       case GL_SLUMINANCE_EXT:
       case GL_SLUMINANCE8_EXT:
       case GL_COMPRESSED_SLUMINANCE_EXT:
-         return GL_LUMINANCE;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
       default:
          ; /* fallthrough */
       }
@@ -2558,28 +2558,28 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat)
       case GL_ALPHA8I_EXT:
       case GL_ALPHA16I_EXT:
       case GL_ALPHA32I_EXT:
-         return GL_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
       case GL_INTENSITY8UI_EXT:
       case GL_INTENSITY16UI_EXT:
       case GL_INTENSITY32UI_EXT:
       case GL_INTENSITY8I_EXT:
       case GL_INTENSITY16I_EXT:
       case GL_INTENSITY32I_EXT:
-         return GL_INTENSITY;
+         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
       case GL_LUMINANCE8UI_EXT:
       case GL_LUMINANCE16UI_EXT:
       case GL_LUMINANCE32UI_EXT:
       case GL_LUMINANCE8I_EXT:
       case GL_LUMINANCE16I_EXT:
       case GL_LUMINANCE32I_EXT:
-         return GL_LUMINANCE;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
       case GL_LUMINANCE_ALPHA8UI_EXT:
       case GL_LUMINANCE_ALPHA16UI_EXT:
       case GL_LUMINANCE_ALPHA32UI_EXT:
       case GL_LUMINANCE_ALPHA8I_EXT:
       case GL_LUMINANCE_ALPHA16I_EXT:
       case GL_LUMINANCE_ALPHA32I_EXT:
-         return GL_LUMINANCE_ALPHA;
+         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
       default:
          ; /* fallthrough */
       }