radv/ac: handle emitting vertex outputs to esgs ring.
authorDave Airlie <airlied@redhat.com>
Thu, 19 Jan 2017 05:14:31 +0000 (15:14 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 30 Jan 2017 23:30:05 +0000 (09:30 +1000)
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_nir_to_llvm.c
src/amd/common/ac_nir_to_llvm.h

index 593128867cd775683917f20504e4a8c1b081ede9..c5c32eb80fd1e125790166a4303357cf03a83311 100644 (file)
@@ -4557,6 +4557,39 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx)
        ctx->shader_info->vs.param_exports = param_count;
 }
 
+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)
@@ -4678,7 +4711,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);
index 82c75bf6963dbfdaf9c2bd6451b8e1c95eb92a9f..ab6ce5a5c6ab67b1318be9e890f963f19fc6e314 100644 (file)
@@ -105,6 +105,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;