freedreno: Use our border-color quirk

This will let us remove our assumption that samplers and views map 1:1,
and generally simplify our border-color handling.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19561>
This commit is contained in:
Rob Clark 2022-11-06 08:29:40 -08:00 committed by Marge Bot
parent 26e742c661
commit ed9152e2c1
4 changed files with 36 additions and 67 deletions

View file

@ -198,19 +198,7 @@ setup_border_colors(struct fd_texture_stateobj *tex,
bc = &sampler->border_color;
/*
* XXX HACK ALERT XXX
*
* The border colors need to be swizzled in a particular
* format-dependent order. Even though samplers don't know about
* formats, we can assume that with a GL state tracker, there's a
* 1:1 correspondence between sampler and texture. Take advantage
* of that knowledge.
*/
if ((i >= tex->num_textures) || !tex->textures[i])
continue;
enum pipe_format format = tex->textures[i]->format;
enum pipe_format format = sampler->border_color_format;
const struct util_format_description *desc =
util_format_description(format);

View file

@ -97,20 +97,7 @@ setup_border_colors(struct fd_texture_stateobj *tex,
bc = &sampler->border_color;
/*
* XXX HACK ALERT XXX
*
* The border colors need to be swizzled in a particular
* format-dependent order. Even though samplers don't know about
* formats, we can assume that with a GL state tracker, there's a
* 1:1 correspondence between sampler and texture. Take advantage
* of that knowledge.
*/
if ((i >= tex->num_textures) || !tex->textures[i])
continue;
struct pipe_sampler_view *view = tex->textures[i];
enum pipe_format format = view->format;
enum pipe_format format = sampler->border_color_format;
const struct util_format_description *desc =
util_format_description(format);

View file

@ -305,6 +305,9 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
return 0;
case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
return PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_FREEDRENO;
case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
case PIPE_CAP_CUBE_MAP_ARRAY:
case PIPE_CAP_SAMPLER_VIEW_TARGET:

View file

@ -150,50 +150,41 @@ fd_setup_border_colors(struct fd_texture_stateobj *tex, void *ptr,
if (!sampler)
continue;
/*
* XXX HACK ALERT XXX
*
* The border colors need to be swizzled in a particular
* format-dependent order. Even though samplers don't know about
* formats, we can assume that with a GL state tracker, there's a
* 1:1 correspondence between sampler and texture. Take advantage
* of that knowledge.
*/
if (i < tex->num_textures && tex->textures[i]) {
const struct util_format_description *desc =
util_format_description(tex->textures[i]->format);
for (j = 0; j < 4; j++) {
if (desc->swizzle[j] >= 4)
continue;
enum pipe_format format = sampler->border_color_format;
const struct util_format_channel_description *chan =
const struct util_format_description *desc =
util_format_description(sampler->border_color_format);
for (j = 0; j < 4; j++) {
if (desc->swizzle[j] >= 4)
continue;
const struct util_format_channel_description *chan =
&desc->channel[desc->swizzle[j]];
uint8_t native = desc->swizzle[j];
/* Special cases:
* - X24S8 is implemented with 8_8_8_8_UINT, so the 'native'
* location is actually 0 rather than 1
* - X32_S8X24_UINT has stencil with a secretly-S8_UINT resource
* so again we want 0 rather than 1
*
* In both cases, there is only one non-void format, so we don't
* have to be too careful.
*
* Note that this only affects a4xx -- a3xx did not support
* stencil texturing, and a5xx+ don't use this helper.
*/
if (tex->textures[i]->format == PIPE_FORMAT_X24S8_UINT ||
tex->textures[i]->format == PIPE_FORMAT_X32_S8X24_UINT) {
native = 0;
}
uint8_t native = desc->swizzle[j];
/* Special cases:
* - X24S8 is implemented with 8_8_8_8_UINT, so the 'native'
* location is actually 0 rather than 1
* - X32_S8X24_UINT has stencil with a secretly-S8_UINT resource
* so again we want 0 rather than 1
*
* In both cases, there is only one non-void format, so we don't
* have to be too careful.
*
* Note that this only affects a4xx -- a3xx did not support
* stencil texturing, and a5xx+ don't use this helper.
*/
if (format == PIPE_FORMAT_X24S8_UINT ||
format == PIPE_FORMAT_X32_S8X24_UINT) {
native = 0;
}
if (chan->pure_integer) {
bcolor32[native + 4] = sampler->border_color.i[j];
bcolor[native + 8] = sampler->border_color.i[j];
} else {
bcolor32[native] = fui(sampler->border_color.f[j]);
bcolor[native] =
if (chan->pure_integer) {
bcolor32[native + 4] = sampler->border_color.i[j];
bcolor[native + 8] = sampler->border_color.i[j];
} else {
bcolor32[native] = fui(sampler->border_color.f[j]);
bcolor[native] =
_mesa_float_to_half(sampler->border_color.f[j]);
}
}
}
}