On Fri, Dec 23, 2016 at 6:42 AM, Dave Airlie <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@redhat.com> > > This was seen in doom shaders, so handle it properly.
I was trying to just change the type and keep a single load/store. Turns out that has some issues indeed, and is not that helpful for shared accesses anyway, as LLVM can merge them. Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> > > Signed-off-by: Dave AIrlie <airl...@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 44696b0..cbad8d2 100644 > --- a/src/amd/common/ac_nir_to_llvm.c > +++ b/src/amd/common/ac_nir_to_llvm.c > @@ -2253,13 +2253,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; > @@ -2354,14 +2356,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: > -- > 2.7.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev