[Mesa-dev] [PATCH 20/29] radv/ac: handle emitting vertex outputs to esgs ring.

Dave Airlie airlied at gmail.com
Mon Jan 30 06:02:54 UTC 2017


From: Dave Airlie <airlied at redhat.com>

Signed-off-by: Dave Airlie <airlied at 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 6d62e20..6f7d8a0 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -4549,6 +4549,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)
 {
@@ -4669,7 +4702,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 82c75bf..ab6ce5a 100644
--- a/src/amd/common/ac_nir_to_llvm.h
+++ b/src/amd/common/ac_nir_to_llvm.h
@@ -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;
-- 
2.9.3



More information about the mesa-dev mailing list