mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-03 08:20:39 +01:00
ac/nir: Fix vector extraction if source vector has >4 elements.
v2: Add forgotten argument and start offset. Fixes:91074bb11b"radv/ac: Implement Float64 SSBO stores." Tested-by: Timothy Arceri <tarceri@itsqueeze.com> Acked-by: Timothy Arceri <tarceri@itsqueeze.com> (cherry picked from commit32170d87e3) Signed-off-by: Emil Velikov <emil.velikov@collabora.com> Conflicts: src/amd/common/ac_nir_to_llvm.c
This commit is contained in:
parent
022cdd4eaa
commit
4a79113e2b
1 changed files with 32 additions and 18 deletions
|
|
@ -2380,6 +2380,36 @@ static uint32_t widen_mask(uint32_t mask, unsigned multiplier)
|
|||
return new_mask;
|
||||
}
|
||||
|
||||
static LLVMValueRef extract_vector_range(struct ac_llvm_context *ctx, LLVMValueRef src,
|
||||
unsigned start, unsigned count)
|
||||
{
|
||||
LLVMTypeRef type = LLVMTypeOf(src);
|
||||
|
||||
if (LLVMGetTypeKind(type) != LLVMVectorTypeKind) {
|
||||
assert(start == 0);
|
||||
assert(count == 1);
|
||||
return src;
|
||||
}
|
||||
|
||||
unsigned src_elements = LLVMGetVectorSize(type);
|
||||
assert(start < src_elements);
|
||||
assert(start + count <= src_elements);
|
||||
|
||||
if (start == 0 && count == src_elements)
|
||||
return src;
|
||||
|
||||
if (count == 1)
|
||||
return LLVMBuildExtractElement(ctx->builder, src, LLVMConstInt(ctx->i32, start, false), "");
|
||||
|
||||
assert(count <= 8);
|
||||
LLVMValueRef indices[8];
|
||||
for (unsigned i = 0; i < count; ++i)
|
||||
indices[i] = LLVMConstInt(ctx->i32, start + i, false);
|
||||
|
||||
LLVMValueRef swizzle = LLVMConstVector(indices, count);
|
||||
return LLVMBuildShuffleVector(ctx->builder, src, src, swizzle, "");
|
||||
}
|
||||
|
||||
static void visit_store_ssbo(struct ac_nir_context *ctx,
|
||||
nir_intrinsic_instr *instr)
|
||||
{
|
||||
|
|
@ -2413,7 +2443,7 @@ static void visit_store_ssbo(struct ac_nir_context *ctx,
|
|||
int start, count;
|
||||
LLVMValueRef data;
|
||||
LLVMValueRef offset;
|
||||
LLVMValueRef tmp;
|
||||
|
||||
u_bit_scan_consecutive_range(&writemask, &start, &count);
|
||||
|
||||
/* Due to an LLVM limitation, split 3-element writes
|
||||
|
|
@ -2430,30 +2460,14 @@ static void visit_store_ssbo(struct ac_nir_context *ctx,
|
|||
|
||||
if (count == 4) {
|
||||
store_name = "llvm.amdgcn.buffer.store.v4f32";
|
||||
data = base_data;
|
||||
} else if (count == 2) {
|
||||
LLVMTypeRef v2f32 = LLVMVectorType(ctx->ac.f32, 2);
|
||||
|
||||
tmp = LLVMBuildExtractElement(ctx->ac.builder,
|
||||
base_data, LLVMConstInt(ctx->ac.i32, start, false), "");
|
||||
data = LLVMBuildInsertElement(ctx->ac.builder, LLVMGetUndef(v2f32), tmp,
|
||||
ctx->ac.i32_0, "");
|
||||
|
||||
tmp = LLVMBuildExtractElement(ctx->ac.builder,
|
||||
base_data, LLVMConstInt(ctx->ac.i32, start + 1, false), "");
|
||||
data = LLVMBuildInsertElement(ctx->ac.builder, data, tmp,
|
||||
ctx->ac.i32_1, "");
|
||||
store_name = "llvm.amdgcn.buffer.store.v2f32";
|
||||
|
||||
} else {
|
||||
assert(count == 1);
|
||||
if (get_llvm_num_components(base_data) > 1)
|
||||
data = LLVMBuildExtractElement(ctx->ac.builder, base_data,
|
||||
LLVMConstInt(ctx->ac.i32, start, false), "");
|
||||
else
|
||||
data = base_data;
|
||||
store_name = "llvm.amdgcn.buffer.store.f32";
|
||||
}
|
||||
data = extract_vector_range(&ctx->ac, base_data, start, count);
|
||||
|
||||
offset = base_offset;
|
||||
if (start != 0) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue