[Mesa-dev] [PATCH 2/2] blorp: Properly handle Z24X8 blits.
Jason Ekstrand
jason at jlekstrand.net
Tue Aug 14 00:27:35 UTC 2018
On August 10, 2018 04:18:51 Kenneth Graunke <kenneth at whitecape.org> wrote:
> 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.
Is the hack even all that useful? It's one more blorp shader compile. I
could see scaled depth blits being a thing people care about. In fact, I
know they will fairly soon if you catch my drift. :-) Mind just dropping
it completely?
--Jason
> ---
> src/intel/blorp/blorp.c | 12 ------------
> src/intel/blorp/blorp_blit.c | 11 +++++++++++
> 2 files changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/src/intel/blorp/blorp.c b/src/intel/blorp/blorp.c
> index c36ec703b18..ffe26076e16 100644
> --- a/src/intel/blorp/blorp.c
> +++ b/src/intel/blorp/blorp.c
> @@ -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;
>
> diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c
> index 7b49f9afa35..3b84e634bd9 100644
> --- a/src/intel/blorp/blorp_blit.c
> +++ b/src/intel/blorp/blorp_blit.c
> @@ -2241,6 +2241,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,
> --
> 2.18.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list