radv: handle multi-component shared load/stores.
This was seen in doom shaders, so handle it properly. Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Signed-off-by: Dave AIrlie <airlied@redhat.com>
This commit is contained in:
parent
d9fef848a6
commit
4813c9ade7
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue