Просмотр исходного кода

blorp: Properly handle Z24X8 blits.

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
Kenneth Graunke 7 лет назад
Родитель
Сommit
de57926dc9
2 измененных файлов: 11 добавлений и 12 удалений
  1. 0
    12
      src/intel/blorp/blorp.c
  2. 11
    0
      src/intel/blorp/blorp_blit.c

+ 0
- 12
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;


+ 11
- 0
src/intel/blorp/blorp_blit.c Просмотреть файл

@@ -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, &params.src, src_surf, src_level,
src_layer, src_format, false);
brw_blorp_surface_info_init(batch->blorp, &params.dst, dst_surf, dst_level,

Загрузка…
Отмена
Сохранить