From: Dave Airlie <airl...@redhat.com> This was seen in doom shaders, so handle it properly.
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