[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