For texturing, we map alpha formats to the corresponding red format, as many alpha formats are outright missing, and red is more efficient when sampling anyway.
When rendering to A8_UNORM, we use that format directly, so the image gets the shader output's .a/.w channel, rather than the .r/.x channel.
All other A* formats are non-renderable, so we can't do much and just mark them as unsupported for rendering. Fortunately, GL only requires rendering to A8_UNORM, so that works out.
According to Andre Heider and Timur Kristóf, this fixes font rendering in Witcher 1 (via nine). Andre also reported that it fixes Unigine Heaven (presumably via nine).
v2: Use the same swizzle for both sampler views and "render targets". BLORP expects the read swizzle, and will take the inverse when setting up the destination swizzle (and actually applying it in the shaders). We ignore the format swizzle when setting up normal rendering SURFACE_STATEs, which is necessary because it would be an illegal shader channel select combination. Thanks to Jason Ekstrand for pointing out that BLORP took an inverse swizzle.
809a81ec3a0 iris: Properly support alpha and luminance-alpha formats
src/gallium/drivers/iris/iris_blit.c | 2 +-
src/gallium/drivers/iris/iris_clear.c | 11 ++-
src/gallium/drivers/iris/iris_formats.c | 154 ++++++++++++++++----------------
src/gallium/drivers/iris/iris_state.c | 35 +++++++-
4 files changed, 117 insertions(+), 85 deletions(-)