summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2021-03-15 11:43:43 +1000
committerMarge Bot <eric+marge@anholt.net>2021-03-29 20:32:09 +0000
commit92eafe42af956c957859c20792986c014345f4b2 (patch)
tree362a3415169126792d0e07edd5aebb8c43fc9ab0
parentfa712d9e17448fc8fcaf5860973d123a672c40f7 (diff)
gallivm: add 64-bit atomic support for ssbo/shared.
This just fixes things up to handle bit-size Reviewed-by: Roland Scheidegger <sroland@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9591>
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_nir.c6
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_nir.h1
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c23
3 files changed, 20 insertions, 10 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c
index 9354d03fdd0..77d66d63796 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c
@@ -1281,10 +1281,11 @@ static void visit_ssbo_atomic(struct lp_build_nir_context *bld_base,
LLVMValueRef offset = get_src(bld_base, instr->src[1]);
LLVMValueRef val = get_src(bld_base, instr->src[2]);
LLVMValueRef val2 = NULL;
+ int bitsize = nir_src_bit_size(instr->src[2]);
if (instr->intrinsic == nir_intrinsic_ssbo_atomic_comp_swap)
val2 = get_src(bld_base, instr->src[3]);
- bld_base->atomic_mem(bld_base, instr->intrinsic, idx, offset, val, val2, &result[0]);
+ bld_base->atomic_mem(bld_base, instr->intrinsic, bitsize, idx, offset, val, val2, &result[0]);
}
@@ -1507,10 +1508,11 @@ static void visit_shared_atomic(struct lp_build_nir_context *bld_base,
LLVMValueRef offset = get_src(bld_base, instr->src[0]);
LLVMValueRef val = get_src(bld_base, instr->src[1]);
LLVMValueRef val2 = NULL;
+ int bitsize = nir_src_bit_size(instr->src[1]);
if (instr->intrinsic == nir_intrinsic_shared_atomic_comp_swap)
val2 = get_src(bld_base, instr->src[2]);
- bld_base->atomic_mem(bld_base, instr->intrinsic, NULL, offset, val, val2, &result[0]);
+ bld_base->atomic_mem(bld_base, instr->intrinsic, bitsize, NULL, offset, val, val2, &result[0]);
}
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.h b/src/gallium/auxiliary/gallivm/lp_bld_nir.h
index 27268672170..9c313828b5f 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_nir.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.h
@@ -100,6 +100,7 @@ struct lp_build_nir_context
void (*atomic_mem)(struct lp_build_nir_context *bld_base,
nir_intrinsic_op op,
+ unsigned bit_size,
LLVMValueRef index, LLVMValueRef offset,
LLVMValueRef val, LLVMValueRef val2,
LLVMValueRef *result);
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c
index 4a33becdedc..1320707a6be 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c
@@ -1160,6 +1160,7 @@ static void emit_store_mem(struct lp_build_nir_context *bld_base,
static void emit_atomic_mem(struct lp_build_nir_context *bld_base,
nir_intrinsic_op nir_op,
+ uint32_t bit_size,
LLVMValueRef index, LLVMValueRef offset,
LLVMValueRef val, LLVMValueRef val2,
LLVMValueRef *result)
@@ -1170,7 +1171,8 @@ static void emit_atomic_mem(struct lp_build_nir_context *bld_base,
LLVMValueRef ssbo_ptr;
struct lp_build_context *uint_bld = &bld_base->uint_bld;
LLVMValueRef ssbo_limit = NULL;
-
+ uint32_t shift_val = bit_size_to_shift_size(bit_size);
+ struct lp_build_context *atomic_bld = get_int_bld(bld_base, true, bit_size);
if (index) {
LLVMValueRef ssbo_size_ptr = lp_build_array_get(gallivm, bld->ssbo_sizes_ptr, LLVMBuildExtractElement(builder, index, lp_build_const_int32(gallivm, 0), ""));
ssbo_limit = LLVMBuildAShr(gallivm->builder, ssbo_size_ptr, lp_build_const_int32(gallivm, 2), "");
@@ -1179,9 +1181,9 @@ static void emit_atomic_mem(struct lp_build_nir_context *bld_base,
} else
ssbo_ptr = bld->shared_ptr;
- offset = lp_build_shr_imm(uint_bld, offset, 2);
+ offset = lp_build_shr_imm(uint_bld, offset, shift_val);
LLVMValueRef atom_res = lp_build_alloca(gallivm,
- uint_bld->vec_type, "");
+ atomic_bld->vec_type, "");
LLVMValueRef exec_mask = mask_vec(bld_base);
if (ssbo_limit) {
@@ -1194,13 +1196,17 @@ static void emit_atomic_mem(struct lp_build_nir_context *bld_base,
LLVMValueRef value_ptr = LLVMBuildExtractElement(gallivm->builder, val,
loop_state.counter, "");
- value_ptr = LLVMBuildBitCast(gallivm->builder, value_ptr, uint_bld->elem_type, "");
+ value_ptr = LLVMBuildBitCast(gallivm->builder, value_ptr, atomic_bld->elem_type, "");
offset = LLVMBuildExtractElement(gallivm->builder, offset,
loop_state.counter, "");
- LLVMValueRef scalar_ptr = LLVMBuildGEP(builder, ssbo_ptr,
- &offset, 1, "");
+ LLVMValueRef scalar_ptr;
+ if (bit_size != 32) {
+ LLVMValueRef ssbo_ptr2 = LLVMBuildBitCast(builder, ssbo_ptr, LLVMPointerType(atomic_bld->elem_type, 0), "");
+ scalar_ptr = LLVMBuildGEP(builder, ssbo_ptr2, &offset, 1, "");
+ } else
+ scalar_ptr = LLVMBuildGEP(builder, ssbo_ptr, &offset, 1, "");
struct lp_build_if_state ifthen;
LLVMValueRef cond, temp_res;
@@ -1212,7 +1218,7 @@ static void emit_atomic_mem(struct lp_build_nir_context *bld_base,
if (nir_op == nir_intrinsic_ssbo_atomic_comp_swap || nir_op == nir_intrinsic_shared_atomic_comp_swap) {
LLVMValueRef cas_src_ptr = LLVMBuildExtractElement(gallivm->builder, val2,
loop_state.counter, "");
- cas_src_ptr = LLVMBuildBitCast(gallivm->builder, cas_src_ptr, uint_bld->elem_type, "");
+ cas_src_ptr = LLVMBuildBitCast(gallivm->builder, cas_src_ptr, atomic_bld->elem_type, "");
scalar = LLVMBuildAtomicCmpXchg(builder, scalar_ptr, value_ptr,
cas_src_ptr,
LLVMAtomicOrderingSequentiallyConsistent,
@@ -1272,7 +1278,8 @@ static void emit_atomic_mem(struct lp_build_nir_context *bld_base,
LLVMBuildStore(builder, temp_res, atom_res);
lp_build_else(&ifthen);
temp_res = LLVMBuildLoad(builder, atom_res, "");
- temp_res = LLVMBuildInsertElement(builder, temp_res, lp_build_const_int32(gallivm, 0), loop_state.counter, "");
+ LLVMValueRef zero = bit_size == 64 ? lp_build_const_int64(gallivm, 0) : lp_build_const_int32(gallivm, 0);
+ temp_res = LLVMBuildInsertElement(builder, temp_res, zero, loop_state.counter, "");
LLVMBuildStore(builder, temp_res, atom_res);
lp_build_endif(&ifthen);