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

Author: Dave Airlie <[email protected]>
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 <[email protected]>
Signed-off-by: Dave AIrlie <[email protected]>

---

 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:

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to