[Mesa-dev] [PATCH 5/5] i965/gen9: Don't allow the RGBX formats for texturing/rendering

Ben Widawsky ben at bwidawsk.net
Thu Nov 19 18:04:52 PST 2015


On Thu, Nov 19, 2015 at 04:25:21PM +0100, Neil Roberts wrote:
> 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.
> ---
>  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 7c38431..7594aca 100644
> --- a/src/mesa/drivers/dri/i965/brw_surface_formats.c
> +++ b/src/mesa/drivers/dri/i965/brw_surface_formats.c
> @@ -733,6 +733,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

A lot of these formats are already unsupported for fast clears. In fact, I
believe only MESA_FORMAT_R8G8B8X8_UNORM is a problem. Are you trying to
accomplish something else here as well?

> +    * 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.
>      */
> -- 
> 1.9.3
> 


More information about the mesa-dev mailing list