Module: Mesa Branch: master Commit: 851e3af07c6e7cb03a75db54428e23853ce9943d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=851e3af07c6e7cb03a75db54428e23853ce9943d
Author: Eric Anholt <[email protected]> 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 <[email protected]> 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; }; _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
