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);
|
&const_index, &indir_index);
|
||||||
LLVMValueRef ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
|
LLVMValueRef ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
|
||||||
LLVMValueRef derived_ptr;
|
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, ""));
|
for (unsigned chan = 0; chan < ve; chan++) {
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -2345,14 +2347,29 @@ visit_store_var(struct nir_to_llvm_context *ctx,
|
||||||
&const_index, &indir_index);
|
&const_index, &indir_index);
|
||||||
|
|
||||||
ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
|
ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
|
||||||
LLVMValueRef index = ctx->i32zero;
|
|
||||||
LLVMValueRef derived_ptr;
|
LLVMValueRef derived_ptr;
|
||||||
|
|
||||||
if (indir_index)
|
for (unsigned chan = 0; chan < 4; chan++) {
|
||||||
index = LLVMBuildAdd(ctx->builder, index, indir_index, "");
|
if (!(writemask & (1 << chan)))
|
||||||
derived_ptr = LLVMBuildGEP(ctx->builder, ptr, &index, 1, "");
|
continue;
|
||||||
LLVMBuildStore(ctx->builder,
|
|
||||||
to_integer(ctx, src), derived_ptr);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue