diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_emit.c b/src/gallium/drivers/freedreno/a5xx/fd5_emit.c index ce8af76a656..7f237f5da01 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_emit.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_emit.c @@ -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); diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c index c1268729ab8..34fdd9e0b8d 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c @@ -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); diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 8716c921aac..bcbe465e25a 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -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: diff --git a/src/gallium/drivers/freedreno/freedreno_texture.c b/src/gallium/drivers/freedreno/freedreno_texture.c index c1765b39f8a..a7ece466f7b 100644 --- a/src/gallium/drivers/freedreno/freedreno_texture.c +++ b/src/gallium/drivers/freedreno/freedreno_texture.c @@ -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]); - } } } }