i965: Fix I/L/LA SNORM formats.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 26 Feb 2015 22:29:25 +0000 (14:29 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 27 Feb 2015 19:36:27 +0000 (11:36 -0800)
_mesa_choose_tex_format (texformat.c) tries I8_SNORM, L8_SNORM, and
either L8A8_SNORM or A8L8_SNORM, none of which are supported by our
driver.  Failing that, it falls back to RGBX for luminance, and RGBA
intensity and luminance alpha.  So, we need to use swizzle overrrides
to obtain the correct values.

Fixes Piglit's EXT_texture_snorm/fbo-blending-formats and
fbo-clear-formats.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
src/mesa/drivers/dri/i965/brw_wm_surface_state.c

index ec4dfdb2229e2474084c1800ced0b59156e492f4..f479f44d7cbdc500cb7a38cdf00e143a3907064b 100644 (file)
@@ -187,6 +187,8 @@ brw_get_texture_swizzle(const struct gl_context *ctx,
       }
    }
 
+   GLenum datatype = _mesa_get_format_datatype(img->TexFormat);
+
    /* If the texture's format is alpha-only, force R, G, and B to
     * 0.0. Similarly, if the texture's format has no alpha channel,
     * force the alpha value read to 1.0. This allows for the
@@ -200,13 +202,29 @@ brw_get_texture_swizzle(const struct gl_context *ctx,
       swizzles[2] = SWIZZLE_ZERO;
       break;
    case GL_LUMINANCE:
-      if (t->_IsIntegerFormat) {
+      if (t->_IsIntegerFormat || datatype == GL_SIGNED_NORMALIZED) {
          swizzles[0] = SWIZZLE_X;
          swizzles[1] = SWIZZLE_X;
          swizzles[2] = SWIZZLE_X;
          swizzles[3] = SWIZZLE_ONE;
       }
       break;
+   case GL_LUMINANCE_ALPHA:
+      if (datatype == GL_SIGNED_NORMALIZED) {
+         swizzles[0] = SWIZZLE_X;
+         swizzles[1] = SWIZZLE_X;
+         swizzles[2] = SWIZZLE_X;
+         swizzles[3] = SWIZZLE_W;
+      }
+      break;
+   case GL_INTENSITY:
+      if (datatype == GL_SIGNED_NORMALIZED) {
+         swizzles[0] = SWIZZLE_X;
+         swizzles[1] = SWIZZLE_X;
+         swizzles[2] = SWIZZLE_X;
+         swizzles[3] = SWIZZLE_X;
+      }
+      break;
    case GL_RED:
    case GL_RG:
    case GL_RGB: