r600: update evergreen_convert_border_color()

This change implements all the possible swizzle permutations
for one and two channel formats.

Note: The border color on integer 32-bits formats is working
only on cayman.

This change was tested on palm. Here are the tests fixed:
spec/arb_texture_rg/texwrap formats bordercolor-swizzled/gl_r16, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats bordercolor-swizzled/gl_r8, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats bordercolor-swizzled/gl_rg16, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats bordercolor-swizzled/gl_rg8, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-float bordercolor-swizzled/gl_r16f, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-float bordercolor-swizzled/gl_r32f, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-float bordercolor-swizzled/gl_rg16f, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-float bordercolor-swizzled/gl_rg32f, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-int bordercolor-swizzled/gl_r16i, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-int bordercolor-swizzled/gl_r16ui, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-int bordercolor-swizzled/gl_r8i, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-int bordercolor-swizzled/gl_r8ui, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-int bordercolor-swizzled/gl_rg16i, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-int bordercolor-swizzled/gl_rg16ui, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-int bordercolor-swizzled/gl_rg8i, swizzled, border color only: fail pass
spec/arb_texture_rg/texwrap formats-int bordercolor-swizzled/gl_rg8ui, swizzled, border color only: fail pass
spec/ext_texture_compression_rgtc/texwrap formats bordercolor-swizzled/gl_compressed_red_rgtc1, swizzled, border color only: fail pass
spec/ext_texture_compression_rgtc/texwrap formats bordercolor-swizzled/gl_compressed_rg_rgtc2, swizzled, border color only: fail pass
spec/ext_texture_compression_rgtc/texwrap formats bordercolor-swizzled/gl_compressed_signed_red_rgtc1, swizzled, border color only: fail pass
spec/ext_texture_compression_rgtc/texwrap formats bordercolor-swizzled/gl_compressed_signed_rg_rgtc2, swizzled, border color only: fail pass
spec/ext_texture_snorm/texwrap formats bordercolor-swizzled/gl_r16_snorm, swizzled, border color only: fail pass
spec/ext_texture_snorm/texwrap formats bordercolor-swizzled/gl_r8_snorm, swizzled, border color only: fail pass
spec/ext_texture_snorm/texwrap formats bordercolor-swizzled/gl_rg16_snorm, swizzled, border color only: fail pass
spec/ext_texture_snorm/texwrap formats bordercolor-swizzled/gl_rg8_snorm, swizzled, border color only: fail pass

Signed-off-by: Patrick Lerda <patrick9876@free.fr>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33579>
This commit is contained in:
Patrick Lerda 2025-02-14 14:27:16 +01:00 committed by Marge Bot
parent fd874bdd0c
commit 0551e284bb
2 changed files with 123 additions and 72 deletions

View file

@ -1225,30 +1225,12 @@ spec@arb_texture_gather@texturegatheroffset@vs-rgba-zero-uint-2d,Fail
spec@arb_texture_gather@texturegatheroffset@vs-rgba-zero-uint-2darray,Fail
spec@arb_texture_gather@texturegatheroffset@vs-rgba-zero-unorm-2d,Fail
spec@arb_texture_gather@texturegatheroffset@vs-rgba-zero-unorm-2darray,Fail
spec@arb_texture_rg@texwrap formats bordercolor-swizzled,Fail
spec@arb_texture_rg@texwrap formats bordercolor-swizzled@GL_R16- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats bordercolor-swizzled@GL_R8- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats bordercolor-swizzled@GL_RG16- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats bordercolor-swizzled@GL_RG8- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-float bordercolor-swizzled,Fail
spec@arb_texture_rg@texwrap formats-float bordercolor-swizzled@GL_R16F- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-float bordercolor-swizzled@GL_R32F- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-float bordercolor-swizzled@GL_RG16F- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-float bordercolor-swizzled@GL_RG32F- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_R16I- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_R16UI- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_R32I- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_R32UI- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_R8I- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_R8UI- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_RG16I- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_RG16UI- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_RG32I- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_RG32UI- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_RG8I- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor-swizzled@GL_RG8UI- swizzled- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor@GL_R32I- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor@GL_R32UI- border color only,Fail
spec@arb_texture_rg@texwrap formats-int bordercolor@GL_RG32I- border color only,Fail
@ -1328,11 +1310,6 @@ spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats@GL_COMPRESSED_RED N
spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats@GL_COMPRESSED_RED_RGTC1 NPOT,Fail
spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats@GL_COMPRESSED_RG NPOT,Fail
spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats@GL_COMPRESSED_RG_RGTC2 NPOT,Fail
spec@ext_texture_compression_rgtc@texwrap formats bordercolor-swizzled,Fail
spec@ext_texture_compression_rgtc@texwrap formats bordercolor-swizzled@GL_COMPRESSED_RED_RGTC1- swizzled- border color only,Fail
spec@ext_texture_compression_rgtc@texwrap formats bordercolor-swizzled@GL_COMPRESSED_RG_RGTC2- swizzled- border color only,Fail
spec@ext_texture_compression_rgtc@texwrap formats bordercolor-swizzled@GL_COMPRESSED_SIGNED_RED_RGTC1- swizzled- border color only,Fail
spec@ext_texture_compression_rgtc@texwrap formats bordercolor-swizzled@GL_COMPRESSED_SIGNED_RG_RGTC2- swizzled- border color only,Fail
spec@ext_texture_compression_s3tc@fbo-generatemipmap-formats,Fail
spec@ext_texture_compression_s3tc@fbo-generatemipmap-formats@GL_COMPRESSED_RGBA_S3TC_DXT1_EXT NPOT,Fail
spec@ext_texture_compression_s3tc@fbo-generatemipmap-formats@GL_COMPRESSED_RGBA_S3TC_DXT3_EXT NPOT,Fail
@ -1402,16 +1379,6 @@ spec@ext_texture_snorm@fbo-blending-formats@GL_RGB16_SNORM,Fail
spec@ext_texture_snorm@fbo-blending-formats@GL_RGB8_SNORM,Fail
spec@ext_texture_snorm@fbo-blending-formats@GL_RGB_SNORM,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled@GL_R16_SNORM- swizzled- border color only,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled@GL_R8_SNORM- swizzled- border color only,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled@GL_RG16_SNORM- swizzled- border color only,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled@GL_RG8_SNORM- swizzled- border color only,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled@GL_RGB16_SNORM- swizzled- border color only,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled@GL_RGB8_SNORM- swizzled- border color only,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled@GL_RGBA16_SNORM- swizzled- border color only,Fail
spec@ext_texture_snorm@texwrap formats bordercolor-swizzled@GL_RGBA8_SNORM- swizzled- border color only,Fail
spec@ext_texture_srgb@fbo-generatemipmap-formats-s3tc,Fail
spec@ext_texture_srgb@fbo-generatemipmap-formats-s3tc@GL_COMPRESSED_SRGB NPOT,Fail
spec@ext_texture_srgb@fbo-generatemipmap-formats-s3tc@GL_COMPRESSED_SRGB_ALPHA NPOT,Fail

View file

@ -20,6 +20,9 @@
#include <assert.h>
static const unsigned neutral_swz[4] = { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y,
PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W };
static inline unsigned evergreen_array_mode(unsigned mode)
{
switch (mode) {
@ -2407,6 +2410,53 @@ static void evergreen_emit_cs_sampler_views(struct r600_context *rctx, struct r6
EG_FETCH_CONSTANTS_OFFSET_CS + R600_MAX_CONST_BUFFERS, RADEON_CP_PACKET3_COMPUTE_MODE);
}
static void border_swizzle_nr_channels_2(const unsigned *swizzle,
unsigned *output_swz)
{
memcpy(output_swz, neutral_swz, sizeof(neutral_swz));
if (swizzle[PIPE_SWIZZLE_X] < PIPE_SWIZZLE_Z &&
swizzle[PIPE_SWIZZLE_Z] < PIPE_SWIZZLE_Z) {
output_swz[PIPE_SWIZZLE_Z] = PIPE_SWIZZLE_W;
output_swz[PIPE_SWIZZLE_W] = PIPE_SWIZZLE_Z;
} else if (swizzle[PIPE_SWIZZLE_Y] < PIPE_SWIZZLE_Z &&
swizzle[PIPE_SWIZZLE_Z] < PIPE_SWIZZLE_Z) {
const bool inverted =
(swizzle[PIPE_SWIZZLE_Y] == PIPE_SWIZZLE_X) ^
(swizzle[PIPE_SWIZZLE_W] == PIPE_SWIZZLE_1);
output_swz[PIPE_SWIZZLE_Y] = inverted ?
PIPE_SWIZZLE_W : PIPE_SWIZZLE_X;
output_swz[PIPE_SWIZZLE_Z] = inverted ?
PIPE_SWIZZLE_X : PIPE_SWIZZLE_W;
output_swz[PIPE_SWIZZLE_X] = PIPE_SWIZZLE_Z;
output_swz[PIPE_SWIZZLE_W] = PIPE_SWIZZLE_Y;
} else if (swizzle[PIPE_SWIZZLE_Z] < PIPE_SWIZZLE_Z &&
swizzle[PIPE_SWIZZLE_W] < PIPE_SWIZZLE_Z) {
const bool inverted =
(swizzle[PIPE_SWIZZLE_W] == PIPE_SWIZZLE_X) ^
(swizzle[PIPE_SWIZZLE_X] == PIPE_SWIZZLE_1);
output_swz[PIPE_SWIZZLE_Z] = inverted ?
PIPE_SWIZZLE_W : PIPE_SWIZZLE_X;
output_swz[PIPE_SWIZZLE_W] = inverted ?
PIPE_SWIZZLE_X : PIPE_SWIZZLE_W;
output_swz[PIPE_SWIZZLE_X] = PIPE_SWIZZLE_Z;
} else if (swizzle[PIPE_SWIZZLE_X] < PIPE_SWIZZLE_Z &&
swizzle[PIPE_SWIZZLE_W] < PIPE_SWIZZLE_Z) {
output_swz[PIPE_SWIZZLE_W] = PIPE_SWIZZLE_Y;
output_swz[PIPE_SWIZZLE_Y] = PIPE_SWIZZLE_W;
} else if (swizzle[PIPE_SWIZZLE_Y] < PIPE_SWIZZLE_Z &&
swizzle[PIPE_SWIZZLE_W] < PIPE_SWIZZLE_Z) {
const bool inverted =
(swizzle[PIPE_SWIZZLE_Y] == PIPE_SWIZZLE_X) ^
(swizzle[PIPE_SWIZZLE_Z] == PIPE_SWIZZLE_1);
output_swz[PIPE_SWIZZLE_Y] = inverted ?
PIPE_SWIZZLE_Y : PIPE_SWIZZLE_X;
output_swz[PIPE_SWIZZLE_W] = inverted ?
PIPE_SWIZZLE_X : PIPE_SWIZZLE_Y;
output_swz[PIPE_SWIZZLE_X] = PIPE_SWIZZLE_W;
}
}
static void cayman_convert_border_color(union pipe_color_union *in,
union pipe_color_union *out,
struct pipe_sampler_view *view)
@ -2450,52 +2500,86 @@ static void evergreen_convert_border_color(union pipe_color_union *in,
union pipe_color_union *out,
struct pipe_sampler_view *view)
{
enum pipe_format format = view->format;
const struct util_format_description *d = util_format_description(format);
const enum pipe_format format = view->format;
const struct util_format_description *d = util_format_description(format);
unsigned swizzle[4] = { view->swizzle_r, view->swizzle_g,
view->swizzle_b, view->swizzle_a };
const unsigned *input_swz = swizzle;
const unsigned *output_swz = neutral_swz;
unsigned misc_swz[4];
const bool is_luminance_or_alpha =
util_format_is_alpha(format) ||
util_format_is_luminance(format) ||
util_format_is_luminance_alpha(format);
const bool is_lai =
is_luminance_or_alpha ||
util_format_is_intensity(format) ||
d->channel[0].size < 8;
int swizzle[4] = { view->swizzle_r, view->swizzle_g, view->swizzle_b,
view->swizzle_a };
if (is_lai)
memcpy(swizzle, neutral_swz, sizeof(swizzle));
bool is_lai = util_format_is_alpha(format) ||
util_format_is_luminance(format) ||
util_format_is_luminance_alpha(format) ||
util_format_is_intensity(format) ||
d->channel[0].size < 8;
if (!util_format_is_depth_or_stencil(format)) {
const bool is_pure_integer = util_format_is_pure_integer(format);
if (is_lai) {
for (int i = 0; i < 4; ++i) {
swizzle[i] = i;
}
}
if (unlikely((d->nr_channels <= 2 && !util_format_is_compressed(format)) ||
format == PIPE_FORMAT_RGTC1_UNORM ||
format == PIPE_FORMAT_RGTC1_SNORM ||
format == PIPE_FORMAT_RGTC2_UNORM ||
format == PIPE_FORMAT_RGTC2_SNORM)) {
if ((d->nr_channels == 2 &&
(swizzle[PIPE_SWIZZLE_X] > PIPE_SWIZZLE_Y ||
swizzle[PIPE_SWIZZLE_Y] > PIPE_SWIZZLE_Y)) ||
format == PIPE_FORMAT_RGTC2_UNORM ||
format == PIPE_FORMAT_RGTC2_SNORM) {
border_swizzle_nr_channels_2(swizzle, misc_swz);
input_swz = neutral_swz;
output_swz = misc_swz;
} else if (d->nr_channels == 1 && swizzle[PIPE_SWIZZLE_X] != PIPE_SWIZZLE_X) {
for (unsigned i = PIPE_SWIZZLE_Y; i <= PIPE_SWIZZLE_W; ++i) {
if (swizzle[i] == PIPE_SWIZZLE_X) {
memcpy(misc_swz, neutral_swz, sizeof(misc_swz));
misc_swz[PIPE_SWIZZLE_W] = i;
misc_swz[i] = PIPE_SWIZZLE_W;
input_swz = neutral_swz;
output_swz = misc_swz;
break;
}
}
}
}
if (!util_format_is_depth_or_stencil(format)) {
for (unsigned i = 0; i <= PIPE_SWIZZLE_W; ++i) {
unsigned swz = swizzle[i];
for (int i = 0; i < 4; ++i) {
if (swz == PIPE_SWIZZLE_0) {
out->f[output_swz[i]] = 0.0f;
continue;
}
if (swizzle[i] == 4) {
out->f[i] = 0.0f;
continue;
}
if (swz == PIPE_SWIZZLE_1) {
out->f[output_swz[i]] = 1.0f;
continue;
}
if (swizzle[i] == 5) {
out->f[i] = 1.0f;
continue;
}
if (util_format_is_pure_integer(format)) {
int cs = d->channel[d->swizzle[i]].size;
if (d->channel[d->swizzle[i]].type == UTIL_FORMAT_TYPE_SIGNED)
out->f[i] = ((double)(in->i[swizzle[i]])) / ((1ul << (cs - 1)) - 1 );
else if (d->channel[d->swizzle[i]].type == UTIL_FORMAT_TYPE_UNSIGNED)
out->f[i] = ((double)(in->ui[swizzle[i]])) / ((1ul << cs) - 1 );
else
out->f[i] = 0;
} else {
out->f[i] = in->f[swizzle[i]];
}
}
} else {
if (is_pure_integer) {
if (is_luminance_or_alpha)
swz = d->swizzle[i];
{
const unsigned cs = d->channel[swz].size;
const unsigned type = d->channel[swz].type;
if (type == UTIL_FORMAT_TYPE_SIGNED)
out->f[output_swz[i]] = ((double)(in->i[input_swz[i]])) / ((1ul << (cs - 1)) - 1 );
else if (type == UTIL_FORMAT_TYPE_UNSIGNED)
out->f[output_swz[i]] = ((double)(in->ui[input_swz[i]])) / ((1ul << cs) - 1 );
else
out->f[output_swz[i]] = 0;
}
} else {
out->f[output_swz[i]] = in->f[input_swz[i]];
}
}
} else {
switch (format) {
case PIPE_FORMAT_X24S8_UINT:
case PIPE_FORMAT_X32_S8X24_UINT: