From 1a441ad5cb58e8169a0d83dd63a7c38462cdb18b Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Fri, 23 May 2025 12:58:19 +0200 Subject: [PATCH] r600: clamp to max_texel_buffer_elements This change is inspired by the following updates: 74a172a44857 ("radeonsi: fix glTexBuffer max size handling") and 86cce0e677ea ("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 Reviewed-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/evergreen_state.c | 15 ++++++++++++--- src/gallium/drivers/r600/r600_pipe.c | 2 +- src/gallium/drivers/r600/r600_state.c | 5 ++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 4ea3a80bc70..a8c3f0c21cc 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -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; diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 25b6f723f33..64a6e952f76 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -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; diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index 04e851ea1db..f78d54cf483 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -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,