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);
}
}
#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,
{
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)
{
return NULL;
buf->base.lookup = sp_tgsi_ssbo_lookup;
- buf->base.get_dims = sp_tgsi_get_dims;
return buf;
};