Mesa (master): gallium/tgsi_exec: Replace the SSBO RESQ-specific interface with lookup.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Dec 31 06:36:18 UTC 2020


Module: Mesa
Branch: master
Commit: 851e3af07c6e7cb03a75db54428e23853ce9943d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=851e3af07c6e7cb03a75db54428e23853ce9943d

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Dec 30 12:44:42 2020 -0800

gallium/tgsi_exec: Replace the SSBO RESQ-specific interface with lookup.

We've got the new lookup with size+ptr, just use that one for querying
buffer size.

This means we now return 0 instead of undefined for unbound buffers, but
it also means we return 0 for a buffer view with a size larger than that
of the underlying buffer.

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8276>

---

 src/gallium/auxiliary/tgsi/tgsi_exec.c   | 28 ++++++-----------
 src/gallium/auxiliary/tgsi/tgsi_exec.h   |  4 ---
 src/gallium/drivers/softpipe/sp_buffer.c | 52 ++++----------------------------
 3 files changed, 15 insertions(+), 69 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index ff28d582d99..9237aa303de 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -4374,27 +4374,17 @@ static void
 exec_resq_buf(struct tgsi_exec_machine *mach,
               const struct tgsi_full_instruction *inst)
 {
-   int result;
-   union tgsi_exec_channel r[4];
-   uint unit;
-   int i, chan;
-   struct tgsi_buffer_params params;
-   int kilmask = mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0];
-
-   unit = fetch_sampler_unit(mach, inst, 0);
-
-   params.execmask = mach->ExecMask & mach->NonHelperMask & ~kilmask;
-   params.unit = unit;
-
-   mach->Buffer->get_dims(mach->Buffer, &params, &result);
+   uint32_t unit = fetch_sampler_unit(mach, inst, 0);
+   uint32_t size;
+   (void)mach->Buffer->lookup(mach->Buffer, unit, &size);
 
-   for (i = 0; i < TGSI_QUAD_SIZE; i++) {
-      r[0].i[i] = result;
-   }
+   union tgsi_exec_channel r;
+   for (int i = 0; i < TGSI_QUAD_SIZE; i++)
+      r.i[i] = size;
 
-   for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
-      if (inst->Dst[0].Register.WriteMask & (1 << chan)) {
-         store_dest(mach, &r[chan], &inst->Dst[0], inst, chan,
+   if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
+      for (int chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
+         store_dest(mach, &r, &inst->Dst[0], inst, TGSI_CHAN_X,
                     TGSI_EXEC_DATA_INT);
       }
    }
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
index 6bf1c093628..798538e1b7f 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
@@ -157,10 +157,6 @@ struct tgsi_buffer_params {
 struct tgsi_buffer {
    void *(*lookup)(const struct tgsi_buffer *buffer,
                    uint32_t unit, uint32_t *size);
-
-   void (*get_dims)(const struct tgsi_buffer *buffer,
-                    const struct tgsi_buffer_params *params,
-                    int *dim);
 };
 
 /**
diff --git a/src/gallium/drivers/softpipe/sp_buffer.c b/src/gallium/drivers/softpipe/sp_buffer.c
index 27655cc6323..fdc21b96eb7 100644
--- a/src/gallium/drivers/softpipe/sp_buffer.c
+++ b/src/gallium/drivers/softpipe/sp_buffer.c
@@ -27,21 +27,6 @@
 
 #include "util/format/u_format.h"
 
-static bool
-get_dimensions(const struct pipe_shader_buffer *bview,
-               const struct softpipe_resource *spr,
-               unsigned *width)
-{
-   *width = bview->buffer_size;
-   /*
-    * Bounds check the buffer size from the view
-    * and the buffer size from the underlying buffer.
-    */
-   if (*width > spr->base.width0)
-      return false;
-   return true;
-}
-
 static void *
 sp_tgsi_ssbo_lookup(const struct tgsi_buffer *buffer,
                     uint32_t unit,
@@ -49,44 +34,20 @@ sp_tgsi_ssbo_lookup(const struct tgsi_buffer *buffer,
 {
    struct sp_tgsi_buffer *sp_buf = (struct sp_tgsi_buffer *)buffer;
 
-   if (unit >= PIPE_MAX_SHADER_BUFFERS) {
-      *size = 0;
+   *size = 0;
+   if (unit >= PIPE_MAX_SHADER_BUFFERS)
       return NULL;
-   }
 
    struct pipe_shader_buffer *bview = &sp_buf->sp_bview[unit];
-   struct softpipe_resource *spr = softpipe_resource(bview->buffer);
-   if (!spr || !get_dimensions(bview, spr, size)) {
-      *size = 0;
+   /* Sanity check the view size is within our buffer. */
+   if (!bview->buffer || bview->buffer_size > bview->buffer->width0)
       return NULL;
-   }
 
+   struct softpipe_resource *spr = softpipe_resource(bview->buffer);
+   *size = bview->buffer_size;
    return (char *)spr->data + bview->buffer_offset;
 }
 
-/*
- * return size of the attached buffer for RESQ opcode.
- */
-static void
-sp_tgsi_get_dims(const struct tgsi_buffer *buffer,
-                 const struct tgsi_buffer_params *params,
-                 int *dim)
-{
-   struct sp_tgsi_buffer *sp_buf = (struct sp_tgsi_buffer *)buffer;
-   struct pipe_shader_buffer *bview;
-   struct softpipe_resource *spr;
-
-   if (params->unit >= PIPE_MAX_SHADER_BUFFERS)
-      return;
-
-   bview = &sp_buf->sp_bview[params->unit];
-   spr = softpipe_resource(bview->buffer);
-   if (!spr)
-      return;
-
-   *dim = bview->buffer_size;
-}
-
 struct sp_tgsi_buffer *
 sp_create_tgsi_buffer(void)
 {
@@ -95,6 +56,5 @@ sp_create_tgsi_buffer(void)
       return NULL;
 
    buf->base.lookup = sp_tgsi_ssbo_lookup;
-   buf->base.get_dims = sp_tgsi_get_dims;
    return buf;
 };



More information about the mesa-commit mailing list