From: Nicolai Hähnle <nicolai.haeh...@amd.com>

When running the copy shader for vertex streams != 0, the SX does not need
any data from us (there is no rasterization for the higher vertex streams,
only streamout).
---
 src/gallium/drivers/radeonsi/si_shader.c | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index b2cf44a..8db31c7 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -6270,40 +6270,47 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                        outputs[i].values[chan] =
                                LLVMBuildBitCast(gallivm->builder,
                                                 
lp_build_intrinsic(gallivm->builder,
                                                                 
"llvm.SI.buffer.load.dword.i32.i32",
                                                                 ctx.i32, args, 
9,
                                                                 
LP_FUNC_ATTR_READONLY),
                                                 ctx.f32, "");
                }
        }
 
-       if (gs_selector->so.num_outputs) {
-               for (int stream = 0; stream < 4; stream++) {
-                       struct lp_build_if_state if_ctx_stream;
+       for (int stream = 0; stream < 4; stream++) {
+               struct lp_build_if_state if_ctx_stream;
 
-                       if (!gsinfo->num_stream_output_components[stream])
-                               continue;
+               if (!gsinfo->num_stream_output_components[stream])
+                       continue;
+
+               if (stream > 0 && !gs_selector->so.num_outputs)
+                       continue;
 
-                       LLVMValueRef is_stream =
-                               LLVMBuildICmp(builder, LLVMIntEQ,
-                                             stream_id,
-                                             lp_build_const_int32(gallivm, 
stream), "");
+               LLVMValueRef is_stream =
+                       LLVMBuildICmp(builder, LLVMIntEQ,
+                                     stream_id,
+                                     lp_build_const_int32(gallivm, stream), 
"");
 
-                       lp_build_if(&if_ctx_stream, gallivm, is_stream);
+               lp_build_if(&if_ctx_stream, gallivm, is_stream);
+
+               if (gs_selector->so.num_outputs) {
                        si_llvm_emit_streamout(&ctx, outputs,
                                               gsinfo->num_outputs,
                                               stream);
-                       lp_build_endif(&if_ctx_stream);
                }
+
+               if (stream == 0)
+                       si_llvm_export_vs(bld_base, outputs, 
gsinfo->num_outputs);
+
+               lp_build_endif(&if_ctx_stream);
        }
-       si_llvm_export_vs(bld_base, outputs, gsinfo->num_outputs);
 
        LLVMBuildRetVoid(gallivm->builder);
 
        /* Dump LLVM IR before any optimization passes */
        if (sscreen->b.debug_flags & DBG_PREOPT_IR &&
            r600_can_dump_shader(&sscreen->b, PIPE_SHADER_GEOMETRY))
                LLVMDumpModule(bld_base->base.gallivm->module);
 
        si_llvm_finalize_module(&ctx,
                r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_GEOMETRY));
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to