softpipe/buffer: load only as many components as the the buffer resource type provides
authorGert Wollny <gert.wollny@collabora.com>
Mon, 13 May 2019 12:02:24 +0000 (14:02 +0200)
committerGert Wollny <gw.fossdev@gmail.com>
Tue, 14 May 2019 06:49:43 +0000 (06:49 +0000)
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: afa8707ba93a7d226a76319acda2a8dd89524db7
    softpipe: add SSBO/shader atomics support.

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/softpipe/sp_buffer.c

index 3ec738527af4095227fa85e36b244f1edd9e3119..4b0617e0beacda622e888ad9c1ccf64fe1a1224f 100644 (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;