diff options
author | Samuel Pitoiset <[email protected]> | 2019-04-16 10:38:23 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2019-04-17 21:59:54 +0200 |
commit | d118e382dd037696ff904e230b11028abf214e80 (patch) | |
tree | e2eeff146424bbc511a50a09f3f4569814f0153f /src | |
parent | 78c551aca1c785470e3c0480e33a072b0b5f8928 (diff) |
ac/nir: add 64-bit SSBO atomic operations support
Except compare&swap which is still buggy.
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index de2a9ed8f67..3890aebc982 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -1643,8 +1643,9 @@ static void visit_store_ssbo(struct ac_nir_context *ctx, static LLVMValueRef visit_atomic_ssbo(struct ac_nir_context *ctx, const nir_intrinsic_instr *instr) { + LLVMTypeRef return_type = LLVMTypeOf(get_src(ctx, instr->src[2])); const char *op; - char name[64]; + char name[64], type[8]; LLVMValueRef params[6]; int arg_count = 0; @@ -1697,18 +1698,21 @@ static LLVMValueRef visit_atomic_ssbo(struct ac_nir_context *ctx, params[arg_count++] = ctx->ac.i32_0; /* soffset */ params[arg_count++] = ctx->ac.i32_0; /* slc */ + ac_build_type_name_for_intr(return_type, type, sizeof(type)); snprintf(name, sizeof(name), - "llvm.amdgcn.raw.buffer.atomic.%s.i32", op); + "llvm.amdgcn.raw.buffer.atomic.%s.%s", op, type); } else { params[arg_count++] = ctx->ac.i32_0; /* vindex */ params[arg_count++] = get_src(ctx, instr->src[1]); /* voffset */ params[arg_count++] = ctx->ac.i1false; /* slc */ + assert(return_type == ctx->ac.i32); snprintf(name, sizeof(name), "llvm.amdgcn.buffer.atomic.%s", op); } - return ac_build_intrinsic(&ctx->ac, name, ctx->ac.i32, params, arg_count, 0); + return ac_build_intrinsic(&ctx->ac, name, return_type, params, + arg_count, 0); } static LLVMValueRef visit_load_buffer(struct ac_nir_context *ctx, |