r600: handle cayman border color sint formats
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

This is the cayman implementation for these border
color formats which are already working on evergreen.

Here are the tests fixed:
deqp-gles31/functional/texture/border_clamp/formats/r16i/nearest_size_npot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/r16i/nearest_size_pot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/r8i/nearest_size_npot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/r8i/nearest_size_pot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/rg16i/nearest_size_npot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/rg16i/nearest_size_pot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/rg8i/nearest_size_npot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/rg8i/nearest_size_pot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/rgb16i/nearest_size_npot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/rgb16i/nearest_size_pot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/rgb8i/nearest_size_npot: fail pass
deqp-gles31/functional/texture/border_clamp/formats/rgb8i/nearest_size_pot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_2d/int_color/nearest/s_clamp_to_edge_t_clamp_to_border_npot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_2d/int_color/nearest/s_clamp_to_edge_t_clamp_to_border_pot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_2d/int_color/nearest/s_mirrored_repeat_t_clamp_to_border_npot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_2d/int_color/nearest/s_mirrored_repeat_t_clamp_to_border_pot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_2d/int_color/nearest/s_repeat_t_clamp_to_border_npot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_2d/int_color/nearest/s_repeat_t_clamp_to_border_pot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_3d/int_color/nearest/s_clamp_to_border_t_clamp_to_border_r_clamp_to_border_npot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_3d/int_color/nearest/s_clamp_to_border_t_clamp_to_border_r_clamp_to_border_pot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_3d/int_color/nearest/s_clamp_to_border_t_clamp_to_border_r_repeat_npot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_3d/int_color/nearest/s_clamp_to_border_t_clamp_to_border_r_repeat_pot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_3d/int_color/nearest/s_mirrored_repeat_t_clamp_to_border_r_repeat_npot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_3d/int_color/nearest/s_mirrored_repeat_t_clamp_to_border_r_repeat_pot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_3d/int_color/nearest/s_repeat_t_mirrored_repeat_r_clamp_to_border_npot: fail pass
deqp-gles31/functional/texture/border_clamp/per_axis_wrap_mode/texture_3d/int_color/nearest/s_repeat_t_mirrored_repeat_r_clamp_to_border_pot: fail pass
deqp-gles31/functional/texture/border_clamp/range_clamp/nearest_int_color: fail pass
deqp-gles31/functional/texture/border_clamp/sampler/int_color: fail pass

Cc: mesa-stable
Signed-off-by: Patrick Lerda <patrick9876@free.fr>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35280>
This commit is contained in:
Patrick Lerda 2025-05-30 13:24:36 +02:00 committed by Marge Bot
parent 49f5cc48cf
commit 1d28931d2c

View file

@ -2459,6 +2459,39 @@ static void border_swizzle_nr_channels_2(const unsigned *swizzle,
}
}
/* These two functions cayman_sint8() and cayman_sint16() calculate
* the sint border color value in a way compatible with cayman.
* The functions check first that the value is in the representable
* range, if not the value is clamped. In both cases the value is
* truncated to be compatible with what cayman expects. */
static inline unsigned cayman_sint8(const unsigned value)
{
const unsigned mask = 0xffffff80U;
const unsigned value_masked = value & mask;
if (likely(!value_masked ||
value_masked == mask))
return value & 0xff;
return value & (1U<<31) ?
0x80 :
0x7f;
}
static inline unsigned cayman_sint16(const unsigned value)
{
const unsigned mask = 0xffff8000U;
const unsigned value_masked = value & mask;
if (likely(!value_masked ||
value_masked == mask))
return value & 0xffff;
return value & (1U<<31) ?
0x8000 :
0x7fff;
}
static void cayman_convert_border_color(union pipe_color_union *in,
union pipe_color_union *out,
struct pipe_sampler_view *view)
@ -2494,10 +2527,28 @@ static void cayman_convert_border_color(union pipe_color_union *in,
} else {
memcpy(output_swz, neutral_swz, sizeof(output_swz));
}
out->f[output_swz[0]] = in->f[0];
out->f[output_swz[1]] = in->f[1];
out->f[output_swz[2]] = in->f[2];
out->f[output_swz[3]] = in->f[3];
switch(format) {
case PIPE_FORMAT_R8_SINT:
case PIPE_FORMAT_R8G8_SINT:
out->ui[output_swz[0]] = cayman_sint8(in->ui[0]);
out->ui[output_swz[1]] = cayman_sint8(in->ui[1]);
out->ui[output_swz[2]] = cayman_sint8(in->ui[2]);
out->ui[output_swz[3]] = cayman_sint8(in->ui[3]);
break;
case PIPE_FORMAT_R16_SINT:
case PIPE_FORMAT_R16G16_SINT:
out->ui[output_swz[0]] = cayman_sint16(in->ui[0]);
out->ui[output_swz[1]] = cayman_sint16(in->ui[1]);
out->ui[output_swz[2]] = cayman_sint16(in->ui[2]);
out->ui[output_swz[3]] = cayman_sint16(in->ui[3]);
break;
default:
out->f[output_swz[0]] = in->f[0];
out->f[output_swz[1]] = in->f[1];
out->f[output_swz[2]] = in->f[2];
out->f[output_swz[3]] = in->f[3];
break;
}
} else if ((!util_format_is_alpha(format) &&
!util_format_is_luminance(format) &&
!util_format_is_luminance_alpha(format) &&
@ -2523,6 +2574,23 @@ static void cayman_convert_border_color(union pipe_color_union *in,
out->f[1] = values[view->swizzle_g];
out->f[2] = values[view->swizzle_b];
out->f[3] = values[view->swizzle_a];
switch(format) {
case PIPE_FORMAT_R8G8B8X8_SINT:
out->ui[0] = cayman_sint8(out->ui[0]);
out->ui[1] = cayman_sint8(out->ui[1]);
out->ui[2] = cayman_sint8(out->ui[2]);
out->ui[3] = cayman_sint8(out->ui[3]);
break;
case PIPE_FORMAT_R16G16B16X16_SINT:
out->ui[0] = cayman_sint16(out->ui[0]);
out->ui[1] = cayman_sint16(out->ui[1]);
out->ui[2] = cayman_sint16(out->ui[2]);
out->ui[3] = cayman_sint16(out->ui[3]);
break;
default:
break;
}
} else {
memcpy(out->f, in->f, 4 * sizeof(float));
}