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