Mesa (main): radeonsi: fix glTexBuffer max size handling
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed May 18 08:45:33 UTC 2022
Module: Mesa
Branch: main
Commit: 74a172a44857ccf7c73a03913bd4e1498dbf601e
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=74a172a44857ccf7c73a03913bd4e1498dbf601e
Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date: Thu May 12 20:09:22 2022 +0200
radeonsi: fix glTexBuffer max size handling
The spec says the number of texels must be clamped to the value of
GL_MAX_TEXTURE_BUFFER_SIZE.
Reviewed-by: Qiang Yu <yuq825 at gmail.com>
Reviewed-by: Mihai Preda <mhpreda at gmail.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16480>
---
.../drivers/radeonsi/ci/gfx10_3-sienna_cichlid-fail.csv | 7 -------
src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv | 7 -------
src/gallium/drivers/radeonsi/si_descriptors.c | 4 +++-
src/gallium/drivers/radeonsi/si_pipe.c | 3 +++
src/gallium/drivers/radeonsi/si_pipe.h | 2 ++
src/gallium/drivers/radeonsi/si_state.c | 5 ++++-
src/gallium/drivers/radeonsi/si_state.h | 16 ++++++++++++++++
7 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/ci/gfx10_3-sienna_cichlid-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx10_3-sienna_cichlid-fail.csv
index b9687f876a2..4dd7599f501 100644
--- a/src/gallium/drivers/radeonsi/ci/gfx10_3-sienna_cichlid-fail.csv
+++ b/src/gallium/drivers/radeonsi/ci/gfx10_3-sienna_cichlid-fail.csv
@@ -88,13 +88,6 @@ spec at arb_shader_texture_lod@execution at arb_shader_texture_lod-texgradcube,Fail
spec at arb_shading_language_packing@execution at built-in-functions@fs-packhalf2x16,Fail
spec at arb_shading_language_packing@execution at built-in-functions@vs-packhalf2x16,Fail
spec at arb_tessellation_shader@execution at tcs-tes-levels-out-of-bounds-write,Crash
-spec at arb_texture_buffer_object@texture-buffer-size-clamp,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at r8ui_texture_buffer_size_via_image,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at r8ui_texture_buffer_size_via_sampler,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at rg8ui_texture_buffer_size_via_image,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at rg8ui_texture_buffer_size_via_sampler,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at rgba8ui_texture_buffer_size_via_image,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at rgba8ui_texture_buffer_size_via_sampler,Fail
spec at egl_ext_protected_content@conformance,Fail
spec at ext_framebuffer_blit@fbo-blit-check-limits,Fail
spec at ext_image_dma_buf_import@ext_image_dma_buf_import-sample_uyvy,Fail
diff --git a/src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv
index df561a769fd..54fbbc9a528 100644
--- a/src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv
+++ b/src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv
@@ -102,13 +102,6 @@ spec at arb_shader_texture_lod@execution at arb_shader_texture_lod-texgradcube,Fail
spec at arb_shading_language_packing@execution at built-in-functions@fs-packhalf2x16,Fail
spec at arb_shading_language_packing@execution at built-in-functions@vs-packhalf2x16,Fail
spec at arb_tessellation_shader@execution at tcs-tes-levels-out-of-bounds-write,Crash
-spec at arb_texture_buffer_object@texture-buffer-size-clamp,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at r8ui_texture_buffer_size_via_image,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at r8ui_texture_buffer_size_via_sampler,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at rg8ui_texture_buffer_size_via_image,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at rg8ui_texture_buffer_size_via_sampler,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at rgba8ui_texture_buffer_size_via_image,Fail
-spec at arb_texture_buffer_object@texture-buffer-size-clamp at rgba8ui_texture_buffer_size_via_sampler,Fail
spec at arb_texture_compression@texwrap formats bordercolor-swizzled,Fail
spec at arb_texture_compression@texwrap formats bordercolor-swizzled at GL_COMPRESSED_RGB- swizzled- border color only,Fail
spec at arb_texture_compression@texwrap formats bordercolor-swizzled at GL_COMPRESSED_RGBA- swizzled- border color only,Fail
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index 698ac5f4691..3dd76a0d65d 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -755,8 +755,10 @@ static void si_set_shader_image_desc(struct si_context *ctx, const struct pipe_i
if (res->b.b.target == PIPE_BUFFER) {
if (view->access & PIPE_IMAGE_ACCESS_WRITE)
si_mark_image_range_valid(view);
+ uint32_t size = si_clamp_texture_texel_count(screen->max_texture_buffer_size,
+ view->format, view->u.buf.size);
- si_make_buffer_descriptor(screen, res, view->format, view->u.buf.offset, view->u.buf.size,
+ si_make_buffer_descriptor(screen, res, view->format, view->u.buf.offset, size,
desc);
si_set_buf_desc_address(res, view->u.buf.offset, desc + 4);
} else {
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index 589af37dd85..b7ed88b2a3c 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -1141,6 +1141,9 @@ static struct pipe_screen *radeonsi_screen_create_impl(struct radeon_winsys *ws,
si_init_screen_query_functions(sscreen);
si_init_screen_live_shader_cache(sscreen);
+ sscreen->max_texture_buffer_size = sscreen->b.get_param(
+ &sscreen->b, PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE);
+
/* Set these flags in debug_flags early, so that the shader cache takes
* them into account.
*
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index a3d8da2ea4c..4192ddc3b85 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -604,6 +604,8 @@ struct si_screen {
/* Texture filter settings. */
int force_aniso; /* -1 = disabled */
+ unsigned max_texture_buffer_size;
+
/* Auxiliary context. Mainly used to initialize resources.
* It must be locked prior to using and flushed before unlocking. */
struct pipe_context *aux_context;
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index ee19553f370..a91145a836c 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -4556,8 +4556,11 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx
/* Buffer resource. */
if (texture->target == PIPE_BUFFER) {
+ uint32_t size = si_clamp_texture_texel_count(sctx->screen->max_texture_buffer_size,
+ state->format, state->u.buf.size);
+
si_make_buffer_descriptor(sctx->screen, si_resource(texture), state->format,
- state->u.buf.offset, state->u.buf.size, view->state);
+ state->u.buf.offset, size, view->state);
return &view->base;
}
diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h
index 4cbcde6ac34..1122336d0d0 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -650,6 +650,22 @@ static inline unsigned si_get_image_slot(unsigned slot)
return SI_NUM_IMAGE_SLOTS - 1 - slot;
}
+static inline unsigned si_clamp_texture_texel_count(unsigned max_texture_buffer_size,
+ enum pipe_format format,
+ uint32_t size)
+{
+ /* The spec says:
+ * The number of texels in the texel array is then clamped to the value of
+ * the implementation-dependent limit GL_MAX_TEXTURE_BUFFER_SIZE.
+ *
+ * So compute the number of texels, compare to GL_MAX_TEXTURE_BUFFER_SIZE and update it.
+ */
+ unsigned stride = util_format_get_blocksize(format);
+ unsigned num_texels = MIN2(max_texture_buffer_size,
+ size / stride);
+ return num_texels * stride;
+}
+
#ifdef __cplusplus
}
#endif
More information about the mesa-commit
mailing list