r600: clamp to max_texel_buffer_elements

This change is inspired by the following updates: 74a172a448 ("radeonsi:
fix glTexBuffer max size handling") and 86cce0e677 ("panfrost: clamp
buffer-size to max-size").

The value of max_texel_buffer_elements is updated as well and synchronized
with radeonsi. The previous value was too high.

Note: the clamp is done on rv770 and cypress and the tests are failing. This
seems to be related to resinfo (textureSize()) which is not working properly
on these gpus.

This change was also tested on barts and cayman. Here are the tests fixed:
spec/arb_texture_buffer_object/texture-buffer-size-clamp/r8ui_texture_buffer_size_via_image: fail pass
spec/arb_texture_buffer_object/texture-buffer-size-clamp/r8ui_texture_buffer_size_via_sampler: fail pass
spec/arb_texture_buffer_object/texture-buffer-size-clamp/rg8ui_texture_buffer_size_via_image: skip pass
spec/arb_texture_buffer_object/texture-buffer-size-clamp/rg8ui_texture_buffer_size_via_sampler: skip pass

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/35159>
This commit is contained in:
Patrick Lerda 2025-05-23 12:58:19 +02:00 committed by Marge Bot
parent 1d03751801
commit 1a441ad5cb
3 changed files with 17 additions and 5 deletions

View file

@ -702,7 +702,9 @@ texture_buffer_sampler_view(struct r600_context *rctx,
params.pipe_format = view->base.format;
params.offset = view->base.u.buf.offset;
params.size = view->base.u.buf.size;
params.size = MIN2(util_format_get_blocksize(view->base.format) *
rctx->screen->b.b.caps.max_texel_buffer_elements,
view->base.u.buf.size);
params.swizzle[0] = view->base.swizzle_r;
params.swizzle[1] = view->base.swizzle_g;
params.swizzle[2] = view->base.swizzle_b;
@ -4482,6 +4484,9 @@ static void evergreen_set_shader_images(struct pipe_context *ctx,
istate->compressed_colortex_mask |= 1 << i;
else
istate->compressed_colortex_mask &= ~(1 << i);
unsigned buffer_size = iview->u.buf.size;
if (!is_buffer) {
evergreen_set_color_surface_common(rctx, rtex,
@ -4493,12 +4498,16 @@ static void evergreen_set_shader_images(struct pipe_context *ctx,
color.dim = S_028C78_WIDTH_MAX(u_minify(image->width0, iview->u.tex.level) - 1) |
S_028C78_HEIGHT_MAX(u_minify(image->height0, iview->u.tex.level) - 1);
} else {
buffer_size = MIN2(util_format_get_blocksize(iview->format) *
rctx->screen->b.b.caps.max_texel_buffer_elements,
buffer_size);
color.offset = 0;
color.view = 0;
evergreen_set_color_surface_buffer(rctx, resource,
iview->format,
iview->u.buf.offset,
iview->u.buf.size,
buffer_size,
&color);
}
@ -4564,7 +4573,7 @@ static void evergreen_set_shader_images(struct pipe_context *ctx,
} else {
memset(&buf_params, 0, sizeof(buf_params));
buf_params.pipe_format = iview->format;
buf_params.size = iview->u.buf.size;
buf_params.size = buffer_size;
buf_params.offset = iview->u.buf.offset;
buf_params.swizzle[0] = PIPE_SWIZZLE_X;
buf_params.swizzle[1] = PIPE_SWIZZLE_Y;

View file

@ -473,7 +473,7 @@ static void r600_init_screen_caps(struct r600_screen *rscreen)
caps->fake_sw_msaa = false;
caps->max_texel_buffer_elements =
MIN2(rscreen->b.info.max_heap_size_kb * 1024ull / 4, INT_MAX);
MIN2(rscreen->b.info.max_heap_size_kb * 1024ull / 4, UINT32_MAX / 16);
caps->min_map_buffer_alignment = R600_MAP_BUFFER_ALIGNMENT;

View file

@ -618,11 +618,14 @@ static struct pipe_sampler_view *
texture_buffer_sampler_view(struct pipe_context *ctx,
struct r600_pipe_sampler_view *view)
{
struct r600_context *rctx = (struct r600_context *)ctx;
struct r600_texture *tmp = (struct r600_texture*)view->base.texture;
const unsigned stride = util_format_get_blocksize(view->base.format);
unsigned format, num_format, format_comp, endian;
uint64_t offset = view->base.u.buf.offset;
unsigned size = view->base.u.buf.size;
const unsigned size = MIN2(stride *
rctx->screen->b.b.caps.max_texel_buffer_elements,
view->base.u.buf.size);
r600_vertex_data_type(view->base.format,
&format, &num_format, &format_comp,