diff options
author | Michel Dänzer <[email protected]> | 2013-02-12 18:37:22 +0100 |
---|---|---|
committer | Michel Dänzer <[email protected]> | 2013-02-14 10:51:44 +0100 |
commit | c840270ebe588a62f22cae34c02ceeb95345f1f4 (patch) | |
tree | c3c10f604193e887c5c12b535344160e9738db8c | |
parent | f34ad857658c93c8f42bd2ed77033e2dfb2540e3 (diff) |
radeonsi: Handle TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS
8 more little piglits.
NOTE: This is a candidate for the 9.1 branch.
-rw-r--r-- | src/gallium/drivers/radeonsi/radeonsi_shader.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index 7e61560369d..7c57f4c2f3e 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -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); |