Mesa (master): i965/gen9: Don't allow the RGBX formats for texturing/ rendering

Neil Roberts nroberts at kemper.freedesktop.org
Wed Jan 13 13:05:35 UTC 2016


Module: Mesa
Branch: master
Commit: cda886a4851ab767fba40e8474d6fa8190347e4f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cda886a4851ab767fba40e8474d6fa8190347e4f

Author: Neil Roberts <neil at linux.intel.com>
Date:   Thu Nov 19 16:25:21 2015 +0100

i965/gen9: Don't allow the RGBX formats for texturing/rendering

The RGBX surface formats aren't renderable so we internally remap them
to RGBA when rendering. They are retained as RGBX when used as
textures. However since the previous patch fast clears are disabled
for surfaces that use a different format for rendering than for
texturing. To avoid this situation we can just pretend not to support
RGBX formats at all. This will cause the upper layers of mesa to pick
an RGBA format internally instead. This should be safe because we
always override the alpha component to 1.0 for RGBX in the texture
swizzle anyway. We could also do this for all gens except that it's a
bit more difficult when the hardware doesn't support texture
swizzling. Gens using the blorp have further problems because that
doesn't implement this swizzle override.

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>

---

 src/mesa/drivers/dri/i965/brw_surface_formats.c |   28 +++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_surface_formats.c b/src/mesa/drivers/dri/i965/brw_surface_formats.c
index 7bc8b8b..b5c1a35 100644
--- a/src/mesa/drivers/dri/i965/brw_surface_formats.c
+++ b/src/mesa/drivers/dri/i965/brw_surface_formats.c
@@ -736,6 +736,34 @@ brw_init_surface_formats(struct brw_context *brw)
    if (brw->gen >= 8)
       ctx->TextureFormatSupported[MESA_FORMAT_Z_UNORM16] = true;
 
+   /* The RGBX formats are not renderable. Normally these get mapped
+    * internally to RGBA formats when rendering. However on Gen9+ when this
+    * internal override is used fast clears don't work so they are disabled in
+    * brw_meta_fast_clear. To avoid this problem we can just pretend not to
+    * support RGBX formats at all. This will cause the upper layers of Mesa to
+    * pick the RGBA formats instead. This works fine because when it is used
+    * as a texture source the swizzle state is programmed to force the alpha
+    * channel to 1.0 anyway. We could also do this for all gens except that
+    * it's a bit more difficult when the hardware doesn't support texture
+    * swizzling. Gens using the blorp have further problems because that
+    * doesn't implement this swizzle override. We don't need to do this for
+    * BGRX because that actually is supported natively on Gen8+.
+    */
+   if (brw->gen >= 9) {
+      static const mesa_format rgbx_formats[] = {
+         MESA_FORMAT_R8G8B8X8_UNORM,
+         MESA_FORMAT_R8G8B8X8_SRGB,
+         MESA_FORMAT_RGBX_UNORM16,
+         MESA_FORMAT_RGBX_FLOAT16,
+         MESA_FORMAT_RGBX_FLOAT32
+      };
+
+      for (int i = 0; i < ARRAY_SIZE(rgbx_formats); i++) {
+         ctx->TextureFormatSupported[rgbx_formats[i]] = false;
+         brw->format_supported_as_render_target[rgbx_formats[i]] = false;
+      }
+   }
+
    /* On hardware that lacks support for ETC1, we map ETC1 to RGBX
     * during glCompressedTexImage2D(). See intel_mipmap_tree::wraps_etc1.
     */




More information about the mesa-commit mailing list