One of the reasons we didn't notice that R24_UNORM_X8_TYPELESS
destinations were broken was that an earlier layer was swapping it
out for B8G8R8A8_UNORM. That made Z24X8 -> Z24X8 blits work.
However, R32_FLOAT -> R24_UNORM_X8_TYPELESS was still totally broken.
The old code only considered one format at a time, without thinking
that format conversion may need to occur.
This patch moves the translation out to a place where it can consider
both formats. If both are Z24X8, we continue using B8G8R8A8_UNORM to
avoid having to do shader math workarounds. If we have a Z24X8
destination, but a non-matching source, we use our shader hacks to
actually render to it properly.
Fixes: 804856fa57
(intel/blorp: Handle more exotic destination formats)
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
tags/18.3-branchpoint
@@ -75,18 +75,6 @@ brw_blorp_surface_info_init(struct blorp_context *blorp, | |||
if (format == ISL_FORMAT_UNSUPPORTED) | |||
format = surf->surf->format; | |||
if (format == ISL_FORMAT_R24_UNORM_X8_TYPELESS) { | |||
/* Unfortunately, ISL_FORMAT_R24_UNORM_X8_TYPELESS it isn't supported as | |||
* a render target, which would prevent us from blitting to 24-bit | |||
* depth. The miptree consists of 32 bits per pixel, arranged as 24-bit | |||
* depth values interleaved with 8 "don't care" bits. Since depth | |||
* values don't require any blending, it doesn't matter how we interpret | |||
* the bit pattern as long as we copy the right amount of data, so just | |||
* map it as 8-bit BGRA. | |||
*/ | |||
format = ISL_FORMAT_B8G8R8A8_UNORM; | |||
} | |||
info->surf = *surf->surf; | |||
info->addr = surf->addr; | |||
@@ -2250,6 +2250,17 @@ blorp_blit(struct blorp_batch *batch, | |||
} | |||
} | |||
/* ISL_FORMAT_R24_UNORM_X8_TYPELESS it isn't supported as a render target, | |||
* which requires shader math to render to it. Blitting Z24X8 to Z24X8 | |||
* is fairly common though, so we'd like to avoid it. Since we don't need | |||
* to blend depth values, we can simply pick a renderable format with the | |||
* right number of bits-per-pixel, like 8-bit BGRA. | |||
*/ | |||
if (dst_surf->surf->format == ISL_FORMAT_R24_UNORM_X8_TYPELESS && | |||
src_surf->surf->format == ISL_FORMAT_R24_UNORM_X8_TYPELESS) { | |||
src_format = dst_format = ISL_FORMAT_B8G8R8A8_UNORM; | |||
} | |||
brw_blorp_surface_info_init(batch->blorp, ¶ms.src, src_surf, src_level, | |||
src_layer, src_format, false); | |||
brw_blorp_surface_info_init(batch->blorp, ¶ms.dst, dst_surf, dst_level, |