Mesa (master): radv: handle multi-component shared load/stores.

Dave Airlie airlied at kemper.freedesktop.org
Mon Dec 26 00:31:38 UTC 2016


Module: Mesa
Branch: master
Commit: 4813c9ade70b4181ccf5d0ab462cf34da96373a6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4813c9ade70b4181ccf5d0ab462cf34da96373a6

Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec 23 05:41:18 2016 +0000

radv: handle multi-component shared load/stores.

This was seen in doom shaders, so handle it properly.

Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Signed-off-by: Dave AIrlie <airlied at redhat.com>

---

 src/amd/common/ac_nir_to_llvm.c | 41 +++++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 90ee917..f214fcd 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -2244,13 +2244,15 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx,
 				      &const_index, &indir_index);
 		LLVMValueRef ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
 		LLVMValueRef derived_ptr;
-		LLVMValueRef index = ctx->i32zero;
-		if (indir_index)
-			index = LLVMBuildAdd(ctx->builder, index, indir_index, "");
-		derived_ptr = LLVMBuildGEP(ctx->builder, ptr, &index, 1, "");
 
-		return to_integer(ctx, LLVMBuildLoad(ctx->builder, derived_ptr, ""));
-		break;
+		for (unsigned chan = 0; chan < ve; chan++) {
+			LLVMValueRef index = LLVMConstInt(ctx->i32, chan, false);
+			if (indir_index)
+				index = LLVMBuildAdd(ctx->builder, index, indir_index, "");
+			derived_ptr = LLVMBuildGEP(ctx->builder, ptr, &index, 1, "");
+			values[chan] = LLVMBuildLoad(ctx->builder, derived_ptr, "");
+		}
+		return to_integer(ctx, build_gather_values(ctx, values, ve));
 	}
 	default:
 		break;
@@ -2345,14 +2347,29 @@ visit_store_var(struct nir_to_llvm_context *ctx,
 				      &const_index, &indir_index);
 
 		ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
-		LLVMValueRef index = ctx->i32zero;
 		LLVMValueRef derived_ptr;
 
-		if (indir_index)
-			index = LLVMBuildAdd(ctx->builder, index, indir_index, "");
-		derived_ptr = LLVMBuildGEP(ctx->builder, ptr, &index, 1, "");
-		LLVMBuildStore(ctx->builder,
-			       to_integer(ctx, src), derived_ptr);
+		for (unsigned chan = 0; chan < 4; chan++) {
+			if (!(writemask & (1 << chan)))
+				continue;
+
+			LLVMValueRef index = LLVMConstInt(ctx->i32, chan, false);
+
+			if (get_llvm_num_components(src) == 1)
+				value = src;
+			else
+				value = LLVMBuildExtractElement(ctx->builder, src,
+								LLVMConstInt(ctx->i32,
+									     chan, false),
+								"");
+
+			if (indir_index)
+				index = LLVMBuildAdd(ctx->builder, index, indir_index, "");
+
+			derived_ptr = LLVMBuildGEP(ctx->builder, ptr, &index, 1, "");
+			LLVMBuildStore(ctx->builder,
+				       to_integer(ctx, value), derived_ptr);
+		}
 		break;
 	}
 	default:




More information about the mesa-commit mailing list