r600g: honour semantic index in fragment color exports
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 1 Aug 2013 18:56:21 +0000 (20:56 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 2 Aug 2013 11:32:49 +0000 (13:32 +0200)
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/r600/r600_shader.c

index dc44faee36b791acfb9ae9c67e15bf4cc45db299..37298ccdcf21655e36566cb1a4377589d617d292 100644 (file)
@@ -917,7 +917,7 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen,
        unsigned output_done, noutput;
        unsigned opcode;
        int i, j, k, r = 0;
-       int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
+       int next_pos_base = 60, next_param_base = 0;
        /* Declarations used by llvm code */
        bool use_llvm = false;
        bool indirect_gprs;
@@ -1440,13 +1440,13 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen,
                case TGSI_PROCESSOR_FRAGMENT:
                        if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
                                /* never export more colors than the number of CBs */
-                               if (next_pixel_base && next_pixel_base >= key.nr_cbufs) {
+                               if (shader->output[i].sid >= key.nr_cbufs) {
                                        /* skip export */
                                        j--;
                                        continue;
                                }
                                output[j].swizzle_w = key.alpha_to_one ? 5 : 3;
-                               output[j].array_base = next_pixel_base++;
+                               output[j].array_base = shader->output[i].sid;
                                output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
                                shader->nr_ps_color_exports++;
                                if (shader->fs_write_all && (rscreen->chip_class >= EVERGREEN)) {
@@ -1461,7 +1461,7 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen,
                                                output[j].swizzle_w = key.alpha_to_one ? 5 : 3;
                                                output[j].burst_count = 1;
                                                output[j].barrier = 1;
-                                               output[j].array_base = next_pixel_base++;
+                                               output[j].array_base = k;
                                                output[j].op = CF_OP_EXPORT;
                                                output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
                                                shader->nr_ps_color_exports++;
@@ -1532,7 +1532,7 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen,
        }
 
        /* add fake pixel export */
-       if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) {
+       if (ctx.type == TGSI_PROCESSOR_FRAGMENT && shader->nr_ps_color_exports == 0) {
                memset(&output[j], 0, sizeof(struct r600_bytecode_output));
                output[j].gpr = 0;
                output[j].elem_size = 3;