radeonsi: Handle TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS
authorMichel Dänzer <michel.daenzer@amd.com>
Tue, 12 Feb 2013 17:37:22 +0000 (18:37 +0100)
committerMichel Dänzer <michel@daenzer.net>
Thu, 14 Feb 2013 09:51:44 +0000 (10:51 +0100)
8 more little piglits.

NOTE: This is a candidate for the 9.1 branch.

src/gallium/drivers/radeonsi/radeonsi_shader.c

index 7e61560..7c57f4c 100644 (file)
@@ -615,6 +615,12 @@ static void si_llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
                int i;
 
                tgsi_parse_token(parse);
+
+               if (parse->FullToken.Token.Type == TGSI_TOKEN_TYPE_PROPERTY &&
+                   parse->FullToken.FullProperty.Property.PropertyName ==
+                   TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS)
+                       shader->fs_write_all = TRUE;
+
                if (parse->FullToken.Token.Type != TGSI_TOKEN_TYPE_DECLARATION)
                        continue;
 
@@ -778,6 +784,29 @@ static void si_llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
        last_args[1] = lp_build_const_int32(base->gallivm,
                                            si_shader_ctx->type == TGSI_PROCESSOR_FRAGMENT);
 
+       if (shader->fs_write_all && shader->nr_cbufs > 1) {
+               int i;
+
+               /* Specify that this is not yet the last export */
+               last_args[2] = lp_build_const_int32(base->gallivm, 0);
+
+               for (i = 1; i < shader->nr_cbufs; i++) {
+                       /* Specify the target we are exporting */
+                       last_args[3] = lp_build_const_int32(base->gallivm,
+                                                           V_008DFC_SQ_EXP_MRT + i);
+
+                       lp_build_intrinsic(base->gallivm->builder,
+                                          "llvm.SI.export",
+                                          LLVMVoidTypeInContext(base->gallivm->context),
+                                          last_args, 9);
+
+                       si_shader_ctx->shader->spi_shader_col_format |=
+                               si_shader_ctx->shader->spi_shader_col_format << 4;
+               }
+
+               last_args[3] = lp_build_const_int32(base->gallivm, V_008DFC_SQ_EXP_MRT);
+       }
+
        /* Specify that this is the last export */
        last_args[2] = lp_build_const_int32(base->gallivm, 1);