softpipe/buffer: load only as many components as the the buffer resource type provides

Otherwise we risk to read past the end of the buffer.

In addition, change the loop counters to unsigned to be consistent
with the types.

Fixes: afa8707ba9
    softpipe: add SSBO/shader atomics support.

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Gert Wollny 2019-05-13 14:02:24 +02:00 committed by Gert Wollny
parent 1050273094
commit 865b9ddae4
1 changed files with 5 additions and 2 deletions

View File

@ -55,7 +55,8 @@ sp_tgsi_load(const struct tgsi_buffer *buffer,
struct pipe_shader_buffer *bview;
struct softpipe_resource *spr;
unsigned width;
int c, j;
unsigned ncomp;
unsigned c, j;
unsigned char *data_ptr;
const struct util_format_description *format_desc = util_format_description(PIPE_FORMAT_R32_UINT);
@ -63,6 +64,8 @@ sp_tgsi_load(const struct tgsi_buffer *buffer,
goto fail_write_all_zero;
bview = &sp_buf->sp_bview[params->unit];
ncomp = util_format_get_nr_components(bview->buffer->format);
spr = softpipe_resource(bview->buffer);
if (!spr)
goto fail_write_all_zero;
@ -88,7 +91,7 @@ sp_tgsi_load(const struct tgsi_buffer *buffer,
continue;
}
data_ptr = (unsigned char *)spr->data + bview->buffer_offset + s_coord;
for (c = 0; c < 4; c++) {
for (c = 0; c < ncomp; c++) {
format_desc->fetch_rgba_uint(sdata, data_ptr, 0, 0);
((uint32_t *)rgba[c])[j] = sdata[0];
data_ptr += 4;