[Mesa-dev] [PATCH 2/2] mesa: limit scope of GL 1.0 compatibility shim

Erik Faye-Lund kusmabite at gmail.com
Mon Aug 24 14:02:17 PDT 2015


OpenGL doesn't expect internalformat={1,2,3,4} to work
elsewhere than glTexImage{1,2,3}D, as clearly stated in the
spec of glCopyTexImage2D (taken from the OpenGL 1.1 spec,
similar wording is present up to OpenGL 3.1 core, where
OpenGL 1.0 compatibility was scrapped entirely):

"Parameters level, internalformat, and border are specified using
the same values, with the same meanings, as the equivalent
arguments of TexImage2D, except that internalformat may not be
specified as 1, 2, 3, or 4."

Fixes piglit tests:
 * spec@!opengl 1.1 at copyteximage 1d
 * spec@!opengl 1.1 at copyteximage 2d
 * spec at arb_texture_cube_map@copyteximage cube
 * spec at arb_texture_rectangle@copyteximage rect

No piglit regressions.
---

These piglit tests were just submitted (by me) on the piglit
mailing list, not yet a part of piglit.

 src/mesa/drivers/dri/nouveau/nouveau_texture.c |  4 ---
 src/mesa/drivers/dri/radeon/radeon_texture.c   |  4 ---
 src/mesa/main/glformats.c                      | 12 ---------
 src/mesa/main/texformat.c                      |  4 ---
 src/mesa/main/teximage.c                       | 35 +++++++++++++++++++++-----
 src/mesa/state_tracker/st_format.c             |  3 +--
 6 files changed, 30 insertions(+), 32 deletions(-)

diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
index dc5699c..ea0e1aa 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
@@ -166,7 +166,6 @@ nouveau_choose_tex_format(struct gl_context *ctx, GLenum target,
 			  GLenum srcFormat, GLenum srcType)
 {
 	switch (internalFormat) {
-	case 4:
 	case GL_RGBA:
 	case GL_RGBA2:
 	case GL_RGBA4:
@@ -186,13 +185,11 @@ nouveau_choose_tex_format(struct gl_context *ctx, GLenum target,
 	case GL_RGB16:
 	case GL_COMPRESSED_RGB:
 		return MESA_FORMAT_B8G8R8X8_UNORM;
-	case 3:
 	case GL_R3_G3_B2:
 	case GL_RGB4:
 	case GL_RGB5:
 		return MESA_FORMAT_B5G6R5_UNORM;
 
-	case 2:
 	case GL_LUMINANCE_ALPHA:
 	case GL_LUMINANCE4_ALPHA4:
 	case GL_LUMINANCE6_ALPHA2:
@@ -203,7 +200,6 @@ nouveau_choose_tex_format(struct gl_context *ctx, GLenum target,
 	case GL_COMPRESSED_LUMINANCE_ALPHA:
 		return MESA_FORMAT_B8G8R8A8_UNORM;
 
-	case 1:
 	case GL_LUMINANCE:
 	case GL_LUMINANCE4:
 	case GL_LUMINANCE12:
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
index 4794dda..6a6aa04 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
@@ -286,7 +286,6 @@ mesa_format radeonChooseTextureFormat(struct gl_context * ctx,
 			__func__, do32bpt, force16bpt);
 
 	switch (internalFormat) {
-	case 4:
 	case GL_RGBA:
 	case GL_COMPRESSED_RGBA:
 		switch (type) {
@@ -305,7 +304,6 @@ mesa_format radeonChooseTextureFormat(struct gl_context * ctx,
 			    _radeon_texformat_argb4444;
 		}
 
-	case 3:
 	case GL_RGB:
 	case GL_COMPRESSED_RGB:
 		switch (type) {
@@ -363,7 +361,6 @@ mesa_format radeonChooseTextureFormat(struct gl_context * ctx,
 #else
 		return MESA_FORMAT_A_UNORM8;
 #endif
-	case 1:
 	case GL_LUMINANCE:
 	case GL_LUMINANCE4:
 	case GL_LUMINANCE8:
@@ -372,7 +369,6 @@ mesa_format radeonChooseTextureFormat(struct gl_context * ctx,
 	case GL_COMPRESSED_LUMINANCE:
 		return MESA_FORMAT_L_UNORM8;
 
-	case 2:
 	case GL_LUMINANCE_ALPHA:
 	case GL_LUMINANCE4_ALPHA4:
 	case GL_LUMINANCE6_ALPHA2:
diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
index 3eb66da..1f8bb4b 100644
--- a/src/mesa/main/glformats.c
+++ b/src/mesa/main/glformats.c
@@ -636,14 +636,12 @@ _mesa_is_enum_format_unorm(GLenum format)
       case GL_ALPHA8:
       case GL_ALPHA12:
       case GL_ALPHA16:
-      case 1:
       case GL_LUMINANCE:
       case GL_SLUMINANCE:
       case GL_LUMINANCE4:
       case GL_LUMINANCE8:
       case GL_LUMINANCE12:
       case GL_LUMINANCE16:
-      case 2:
       case GL_LUMINANCE_ALPHA:
       case GL_SLUMINANCE_ALPHA:
       case GL_LUMINANCE4_ALPHA4:
@@ -662,7 +660,6 @@ _mesa_is_enum_format_unorm(GLenum format)
       case GL_RG:
       case GL_RG8:
       case GL_RG16:
-      case 3:
       case GL_RGB:
       case GL_BGR:
       case GL_SRGB:
@@ -674,7 +671,6 @@ _mesa_is_enum_format_unorm(GLenum format)
       case GL_RGB10:
       case GL_RGB12:
       case GL_RGB16:
-      case 4:
       case GL_ABGR_EXT:
       case GL_RGBA:
       case GL_BGRA:
@@ -881,13 +877,11 @@ _mesa_is_color_format(GLenum format)
       case GL_ALPHA8:
       case GL_ALPHA12:
       case GL_ALPHA16:
-      case 1:
       case GL_LUMINANCE:
       case GL_LUMINANCE4:
       case GL_LUMINANCE8:
       case GL_LUMINANCE12:
       case GL_LUMINANCE16:
-      case 2:
       case GL_LUMINANCE_ALPHA:
       case GL_LUMINANCE4_ALPHA4:
       case GL_LUMINANCE6_ALPHA2:
@@ -905,7 +899,6 @@ _mesa_is_color_format(GLenum format)
       case GL_RG:
       case GL_RG8:
       case GL_RG16:
-      case 3:
       case GL_RGB:
       case GL_BGR:
       case GL_R3_G3_B2:
@@ -916,7 +909,6 @@ _mesa_is_color_format(GLenum format)
       case GL_RGB10:
       case GL_RGB12:
       case GL_RGB16:
-      case 4:
       case GL_ABGR_EXT:
       case GL_RGBA:
       case GL_BGRA:
@@ -1519,16 +1511,12 @@ _mesa_get_nongeneric_internalformat(GLenum format)
 {
    switch (format) {
    /* GL 1.1 formats. */
-   case 4:
    case GL_RGBA:
       return GL_RGBA8;
-   case 3:
    case GL_RGB:
       return GL_RGB8;
-   case 2:
    case GL_LUMINANCE_ALPHA:
       return GL_LUMINANCE8_ALPHA8;
-   case 1:
    case GL_LUMINANCE:
       return GL_LUMINANCE8;
    case GL_ALPHA:
diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c
index f4d17e1..fa8be94 100644
--- a/src/mesa/main/texformat.c
+++ b/src/mesa/main/texformat.c
@@ -67,7 +67,6 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
 
    switch (internalFormat) {
    /* shallow RGBA formats */
-   case 4:
    case GL_RGBA:
       if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
          RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM);
@@ -109,7 +108,6 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
       break;
 
    /* shallow RGB formats */
-   case 3:
    case GL_RGB:
       if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
          RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM);
@@ -166,7 +164,6 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
       break;
 
    /* Luminance formats */
-   case 1:
    case GL_LUMINANCE:
    case GL_LUMINANCE4:
    case GL_LUMINANCE8:
@@ -185,7 +182,6 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
       break;
 
-   case 2:
    case GL_LUMINANCE_ALPHA:
    case GL_LUMINANCE6_ALPHA2:
    case GL_LUMINANCE8_ALPHA8:
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 7605d1b..127d4c9 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -139,14 +139,12 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
    case GL_ALPHA12:
    case GL_ALPHA16:
       return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
-   case 1:
    case GL_LUMINANCE:
    case GL_LUMINANCE4:
    case GL_LUMINANCE8:
    case GL_LUMINANCE12:
    case GL_LUMINANCE16:
       return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
-   case 2:
    case GL_LUMINANCE_ALPHA:
    case GL_LUMINANCE4_ALPHA4:
    case GL_LUMINANCE6_ALPHA2:
@@ -161,8 +159,6 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
    case GL_INTENSITY12:
    case GL_INTENSITY16:
       return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
-   case 3:
-      return (ctx->API != API_OPENGL_CORE) ? GL_RGB : -1;
    case GL_RGB:
    case GL_R3_G3_B2:
    case GL_RGB4:
@@ -172,8 +168,6 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
    case GL_RGB12:
    case GL_RGB16:
       return GL_RGB;
-   case 4:
-      return (ctx->API != API_OPENGL_CORE) ? GL_RGBA : -1;
    case GL_RGBA:
    case GL_RGBA2:
    case GL_RGBA4:
@@ -3231,6 +3225,35 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims,
 
    internalFormat = override_internal_format(internalFormat, width, height);
 
+   if (ctx->API == API_OPENGL_COMPAT)
+   {
+      /* OpenGL 3.0 spec says:
+       *
+       * "internalformat may (for backwards compatibility with the 1.0
+       * version of the GL) also take on the integer values 1, 2, 3,
+       * and 4, which are equivalent to symbolic constants LUMINANCE,
+       * LUMINANCE ALPHA, RGB, and RGBA respectively.
+       */
+
+      switch (internalFormat) {
+      case 1:
+         internalFormat = GL_LUMINANCE;
+         break;
+
+      case 2:
+         internalFormat = GL_LUMINANCE_ALPHA;
+         break;
+
+      case 3:
+         internalFormat = GL_RGB;
+         break;
+
+      case 4:
+         internalFormat = GL_RGBA;
+         break;
+      }
+   }
+
    /* target error checking */
    if (!legal_teximage_target(ctx, dims, target)) {
       _mesa_error(ctx, GL_INVALID_ENUM, "%s%uD(target=%s)",
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index db7b5b7..6bab2ff 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -1963,8 +1963,7 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
    bindings = PIPE_BIND_SAMPLER_VIEW;
    if (_mesa_is_depth_or_stencil_format(internalFormat))
       bindings |= PIPE_BIND_DEPTH_STENCIL;
-   else if (internalFormat == 3 || internalFormat == 4 ||
-            internalFormat == GL_RGB || internalFormat == GL_RGBA ||
+   else if (internalFormat == GL_RGB || internalFormat == GL_RGBA ||
             internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
             internalFormat == GL_BGRA)
 	 bindings |= PIPE_BIND_RENDER_TARGET;
-- 
2.1.4



More information about the mesa-dev mailing list