OSDN Git Service

radv: fix shared memory load/stores.
authorDave Airlie <airlied@redhat.com>
Fri, 3 Feb 2017 03:26:13 +0000 (03:26 +0000)
committerEmil Velikov <emil.l.velikov@gmail.com>
Fri, 10 Feb 2017 11:05:58 +0000 (11:05 +0000)
If we have an indirect index here we need to scale it by attribute slots
e.g. is this is vec2[256] then we get an indir_index in the 0.255 range
but the vec2 are aligned inside vec4 slots. So scale the indir index,
then extract the channels.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Cc: "17.0" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
(cherry picked from commit 106a51440d018031b94c91758eecc7424a3bb5ee)
[Emil Velikov: resolve trivial conflicts]
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Conflicts:
src/amd/common/ac_nir_to_llvm.c

src/amd/common/ac_nir_to_llvm.c

index 68c385a..319bb3e 100644 (file)
@@ -2086,6 +2086,9 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx,
                LLVMValueRef ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
                LLVMValueRef derived_ptr;
 
+               if (indir_index)
+                       indir_index = LLVMBuildMul(ctx->builder, indir_index, LLVMConstInt(ctx->i32, 4, false), "");
+
                for (unsigned chan = 0; chan < ve; chan++) {
                        LLVMValueRef index = LLVMConstInt(ctx->i32, chan, false);
                        if (indir_index)
@@ -2190,6 +2193,9 @@ visit_store_var(struct nir_to_llvm_context *ctx,
                ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
                LLVMValueRef derived_ptr;
 
+               if (indir_index)
+                       indir_index = LLVMBuildMul(ctx->builder, indir_index, LLVMConstInt(ctx->i32, 4, false), "");
+
                for (unsigned chan = 0; chan < 4; chan++) {
                        if (!(writemask & (1 << chan)))
                                continue;