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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev