mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-03 15:10:37 +01:00
radeonsi: fix texture gather on stencil textures
At least on VI, texture gather doesn't work with a 24_8 data format, so
use 8_8_8_8 and a modified swizzle instead.
A bit of background: When creating a GL_STENCIL_INDEX8 texture, we select
the X24S8 pipe format because we don't support stencil-only render targets
properly. With mip-mapping this can lead to a setup where the tiling is
incompatible with stencil texturing, and a flushed stencil texture is
used. For the flushed stencil, a literal X24S8 is used because there were
issues with an 8bpp DB->CB copy.
Longer term, it would be good if we could get away from these workarounds,
i.e. properly support an S8 format for stencil-only rendering and flushed
stencil. Since stencil texturing is somewhat rare, it's not a high
priority.
Fixes GL45-CTS.texture_cube_map_array.sampling.
Cc: 17.0 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Acked-by: Edward O'Callaghan <funfunctor@folklore1984.net>
(cherry picked from commit 3cd092c415)
This commit is contained in:
parent
caef71832c
commit
b6ec9c2098
1 changed files with 16 additions and 2 deletions
|
|
@ -1345,11 +1345,17 @@ static uint32_t si_translate_texformat(struct pipe_screen *screen,
|
|||
case PIPE_FORMAT_Z16_UNORM:
|
||||
return V_008F14_IMG_DATA_FORMAT_16;
|
||||
case PIPE_FORMAT_X24S8_UINT:
|
||||
case PIPE_FORMAT_S8X24_UINT:
|
||||
/*
|
||||
* Implemented as an 8_8_8_8 data format to fix texture
|
||||
* gathers in stencil sampling. This affects at least
|
||||
* GL45-CTS.texture_cube_map_array.sampling on VI.
|
||||
*/
|
||||
return V_008F14_IMG_DATA_FORMAT_8_8_8_8;
|
||||
case PIPE_FORMAT_Z24X8_UNORM:
|
||||
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
|
||||
return V_008F14_IMG_DATA_FORMAT_8_24;
|
||||
case PIPE_FORMAT_X8Z24_UNORM:
|
||||
case PIPE_FORMAT_S8X24_UINT:
|
||||
case PIPE_FORMAT_S8_UINT_Z24_UNORM:
|
||||
return V_008F14_IMG_DATA_FORMAT_24_8;
|
||||
case PIPE_FORMAT_S8_UINT:
|
||||
|
|
@ -2752,14 +2758,22 @@ si_make_texture_descriptor(struct si_screen *screen,
|
|||
if (desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) {
|
||||
const unsigned char swizzle_xxxx[4] = {0, 0, 0, 0};
|
||||
const unsigned char swizzle_yyyy[4] = {1, 1, 1, 1};
|
||||
const unsigned char swizzle_wwww[4] = {3, 3, 3, 3};
|
||||
|
||||
switch (pipe_format) {
|
||||
case PIPE_FORMAT_S8_UINT_Z24_UNORM:
|
||||
case PIPE_FORMAT_X24S8_UINT:
|
||||
case PIPE_FORMAT_X32_S8X24_UINT:
|
||||
case PIPE_FORMAT_X8Z24_UNORM:
|
||||
util_format_compose_swizzles(swizzle_yyyy, state_swizzle, swizzle);
|
||||
break;
|
||||
case PIPE_FORMAT_X24S8_UINT:
|
||||
/*
|
||||
* X24S8 is implemented as an 8_8_8_8 data format, to
|
||||
* fix texture gathers. This affects at least
|
||||
* GL45-CTS.texture_cube_map_array.sampling on VI.
|
||||
*/
|
||||
util_format_compose_swizzles(swizzle_wwww, state_swizzle, swizzle);
|
||||
break;
|
||||
default:
|
||||
util_format_compose_swizzles(swizzle_xxxx, state_swizzle, swizzle);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue