From: Dave Airlie <airl...@redhat.com>

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 src/amd/common/ac_nir_to_llvm.c | 38 +++++++++++++++++++++++++++++++++++++-
 src/amd/common/ac_nir_to_llvm.h |  1 +
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index a095613..92e2b44 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -4538,6 +4538,39 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx)
 }
 
 static void
+handle_es_outputs_post(struct nir_to_llvm_context *ctx)
+{
+       int j;
+       uint64_t max_output_written = 0;
+       for (unsigned i = 0; i < RADEON_LLVM_MAX_OUTPUTS; ++i) {
+               LLVMValueRef *out_ptr = &ctx->outputs[i * 4];
+               int param_index;
+               if (!(ctx->output_mask & (1ull << i)))
+                       continue;
+
+               param_index = shader_io_get_unique_index(i);
+
+               if (param_index > max_output_written)
+                       max_output_written = param_index;
+
+               for (j = 0; j < 4; j++) {
+                       LLVMValueRef out_val = LLVMBuildLoad(ctx->builder, 
out_ptr[j], "");
+                       out_val = LLVMBuildBitCast(ctx->builder, out_val, 
ctx->i32, "");
+
+                       build_tbuffer_store(ctx,
+                                           ctx->esgs_ring,
+                                           out_val, 1,
+                                           LLVMGetUndef(ctx->i32), 
ctx->es2gs_offset,
+                                           (4 * param_index + j) * 4,
+                                           V_008F0C_BUF_DATA_FORMAT_32,
+                                           V_008F0C_BUF_NUM_FORMAT_UINT,
+                                           0, 0, 1, 1, 0);
+               }
+       }
+       ctx->shader_info->vs.esgs_itemsize = (max_output_written + 1) * 16;
+}
+
+static void
 si_export_mrt_color(struct nir_to_llvm_context *ctx,
                    LLVMValueRef *color, unsigned param, bool is_last)
 {
@@ -4658,7 +4691,10 @@ handle_shader_outputs_post(struct nir_to_llvm_context 
*ctx)
 {
        switch (ctx->stage) {
        case MESA_SHADER_VERTEX:
-               handle_vs_outputs_post(ctx);
+               if (ctx->options->key.vs.as_es)
+                       handle_es_outputs_post(ctx);
+               else
+                       handle_vs_outputs_post(ctx);
                break;
        case MESA_SHADER_FRAGMENT:
                handle_fs_outputs_post(ctx);
diff --git a/src/amd/common/ac_nir_to_llvm.h b/src/amd/common/ac_nir_to_llvm.h
index f0235fb..ab66108 100644
--- a/src/amd/common/ac_nir_to_llvm.h
+++ b/src/amd/common/ac_nir_to_llvm.h
@@ -104,6 +104,7 @@ struct ac_shader_variant_info {
                        bool as_es;
                        uint8_t clip_dist_mask;
                        uint8_t cull_dist_mask;
+                       uint32_t esgs_itemsize;
                } vs;
                struct {
                        unsigned num_interp;
-- 
2.9.3

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

Reply via email to