nir,ac/llvm: add nir_buffer_atomic_add_amd
Used by radeonsi for lower nir_atomic_add_gen/xfb_prim_count_amd. Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Signed-off-by: Qiang Yu <yuq825@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18010>
This commit is contained in:
@@ -4315,6 +4315,26 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
|
|||||||
ac_build_atomic_rmw(&ctx->ac, LLVMAtomicRMWBinOpAdd, gds_base, store_val, "workgroup-one-as");
|
ac_build_atomic_rmw(&ctx->ac, LLVMAtomicRMWBinOpAdd, gds_base, store_val, "workgroup-one-as");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case nir_intrinsic_buffer_atomic_add_amd: {
|
||||||
|
LLVMValueRef desc = get_src(ctx, instr->src[0]);
|
||||||
|
LLVMValueRef data = get_src(ctx, instr->src[1]);
|
||||||
|
unsigned base = nir_intrinsic_base(instr);
|
||||||
|
LLVMTypeRef return_type = LLVMTypeOf(data);
|
||||||
|
|
||||||
|
LLVMValueRef args[] = {
|
||||||
|
data, desc,
|
||||||
|
LLVMConstInt(ctx->ac.i32, base, false),
|
||||||
|
ctx->ac.i32_0, /* soffset */
|
||||||
|
ctx->ac.i32_0, /* cachepolicy */
|
||||||
|
};
|
||||||
|
|
||||||
|
char name[64], type[8];
|
||||||
|
ac_build_type_name_for_intr(return_type, type, sizeof(type));
|
||||||
|
snprintf(name, sizeof(name), "llvm.amdgcn.raw.buffer.atomic.add.%s", type);
|
||||||
|
|
||||||
|
result = ac_build_intrinsic(&ctx->ac, name, return_type, args, 5, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case nir_intrinsic_export_vertex_amd:
|
case nir_intrinsic_export_vertex_amd:
|
||||||
ctx->abi->export_vertex(ctx->abi);
|
ctx->abi->export_vertex(ctx->abi);
|
||||||
break;
|
break;
|
||||||
|
@@ -652,6 +652,7 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
|
|||||||
case nir_intrinsic_load_packed_passthrough_primitive_amd:
|
case nir_intrinsic_load_packed_passthrough_primitive_amd:
|
||||||
case nir_intrinsic_load_initial_edgeflags_amd:
|
case nir_intrinsic_load_initial_edgeflags_amd:
|
||||||
case nir_intrinsic_gds_atomic_add_amd:
|
case nir_intrinsic_gds_atomic_add_amd:
|
||||||
|
case nir_intrinsic_buffer_atomic_add_amd:
|
||||||
case nir_intrinsic_load_rt_arg_scratch_offset_amd:
|
case nir_intrinsic_load_rt_arg_scratch_offset_amd:
|
||||||
case nir_intrinsic_load_intersection_opaque_amd:
|
case nir_intrinsic_load_intersection_opaque_amd:
|
||||||
case nir_intrinsic_load_vector_arg_amd:
|
case nir_intrinsic_load_vector_arg_amd:
|
||||||
|
@@ -1332,6 +1332,9 @@ store("global_amd", [1, 1], indices=[BASE, ACCESS, ALIGN_MUL, ALIGN_OFFSET, WRIT
|
|||||||
# Same as shared_atomic_add, but with GDS. src[] = {store_val, gds_addr, m0}
|
# Same as shared_atomic_add, but with GDS. src[] = {store_val, gds_addr, m0}
|
||||||
intrinsic("gds_atomic_add_amd", src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
|
intrinsic("gds_atomic_add_amd", src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
|
||||||
|
|
||||||
|
# src[] = { descriptor, add_value }
|
||||||
|
intrinsic("buffer_atomic_add_amd", src_comp=[4, 1], dest_comp=1, indices=[BASE])
|
||||||
|
|
||||||
# src[] = { sample_id, num_samples }
|
# src[] = { sample_id, num_samples }
|
||||||
intrinsic("load_sample_positions_amd", src_comp=[1, 1], dest_comp=2, flags=[CAN_ELIMINATE, CAN_REORDER])
|
intrinsic("load_sample_positions_amd", src_comp=[1, 1], dest_comp=2, flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user