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, ¶ms, &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