r600/shader: fix ssbo atomic operations formats.
authorDave Airlie <airlied@redhat.com>
Tue, 5 Dec 2017 08:28:13 +0000 (08:28 +0000)
committerDave Airlie <airlied@redhat.com>
Tue, 5 Dec 2017 20:07:07 +0000 (20:07 +0000)
Don't try and use the image format for ssbo, just 32-bit uint.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c

index df5a7b3cc082a3843bb4359fb3e60185b18098d5..93b86eae263f4a70c7815db30283bbb6cdb28986 100644 (file)
@@ -8360,10 +8360,19 @@ static int tgsi_atomic_op_rat(struct r600_shader_ctx *ctx)
        cf->barrier = 1;
        cf->cf_addr = 1;
 
-       desc = util_format_description(inst->Memory.Format);
-       r600_vertex_data_type(inst->Memory.Format,
-                             &format, &num_format, &format_comp, &endian);
        memset(&vtx, 0, sizeof(struct r600_bytecode_vtx));
+       if (inst->Src[0].Register.File == TGSI_FILE_IMAGE) {
+               desc = util_format_description(inst->Memory.Format);
+               r600_vertex_data_type(inst->Memory.Format,
+                                     &format, &num_format, &format_comp, &endian);
+               vtx.dst_sel_x = desc->swizzle[0];
+       } else {
+               format = FMT_32;
+               num_format = 1;
+               format_comp = 0;
+               endian = 0;
+               vtx.dst_sel_x = 0;
+       }
        vtx.op = FETCH_OP_VFETCH;
        vtx.buffer_id = immed_base + inst->Src[0].Register.Index;
        vtx.buffer_index_mode = rat_index_mode;
@@ -8371,7 +8380,6 @@ static int tgsi_atomic_op_rat(struct r600_shader_ctx *ctx)
        vtx.src_gpr = ctx->thread_id_gpr;
        vtx.src_sel_x = 1;
        vtx.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
-       vtx.dst_sel_x = desc->swizzle[0];
        vtx.dst_sel_y = 7;
        vtx.dst_sel_z = 7;
        vtx.dst_sel_w = 7;