aco: Implement bvh64_intersect_ray_amd intrinsic.

Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10818>
This commit is contained in:
Bas Nieuwenhuizen
2021-04-06 11:33:38 +02:00
parent 2d6a6469b8
commit c7904b5b9b
4 changed files with 40 additions and 1 deletions

View File

@@ -427,7 +427,8 @@ void emit_instruction(asm_context& ctx, std::vector<uint32_t>& out, Instruction*
MIMG_instruction& mimg = instr->mimg();
uint32_t encoding = (0b111100 << 26);
encoding |= mimg.slc ? 1 << 25 : 0;
encoding |= opcode << 18;
encoding |= (opcode & 0x7f) << 18;
encoding |= (opcode >> 7) & 1;
encoding |= mimg.lwe ? 1 << 17 : 0;
encoding |= mimg.tfe ? 1 << 16 : 0;
encoding |= mimg.glc ? 1 << 13 : 0;

View File

@@ -5598,6 +5598,39 @@ static MIMG_instruction *emit_mimg(Builder& bld, aco_opcode op,
return res;
}
void visit_bvh64_intersect_ray_amd(isel_context *ctx, nir_intrinsic_instr *instr)
{
Builder bld(ctx->program, ctx->block);
Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
Temp resource = get_ssa_temp(ctx, instr->src[0].ssa);
Temp node = get_ssa_temp(ctx, instr->src[1].ssa);
Temp tmax = get_ssa_temp(ctx, instr->src[2].ssa);
Temp origin = get_ssa_temp(ctx, instr->src[3].ssa);
Temp dir = get_ssa_temp(ctx, instr->src[4].ssa);
Temp inv_dir = get_ssa_temp(ctx, instr->src[5].ssa);
std::vector<Temp> args;
args.push_back(emit_extract_vector(ctx, node, 0, v1));
args.push_back(emit_extract_vector(ctx, node, 1, v1));
args.push_back(as_vgpr(ctx, tmax));
args.push_back(emit_extract_vector(ctx, origin, 0, v1));
args.push_back(emit_extract_vector(ctx, origin, 1, v1));
args.push_back(emit_extract_vector(ctx, origin, 2, v1));
args.push_back(emit_extract_vector(ctx, dir, 0, v1));
args.push_back(emit_extract_vector(ctx, dir, 1, v1));
args.push_back(emit_extract_vector(ctx, dir, 2, v1));
args.push_back(emit_extract_vector(ctx, inv_dir, 0, v1));
args.push_back(emit_extract_vector(ctx, inv_dir, 1, v1));
args.push_back(emit_extract_vector(ctx, inv_dir, 2, v1));
MIMG_instruction *mimg = emit_mimg(bld, aco_opcode::image_bvh64_intersect_ray,
Definition(dst), resource, Operand(s4), args);
mimg->dim = ac_image_1d;
mimg->dmask = 0xf;
mimg->unrm = true;
mimg->r128 = true;
}
/* Adjust the sample index according to FMASK.
*
* For uncompressed MSAA surfaces, FMASK should return 0x76543210,
@@ -8515,6 +8548,9 @@ void visit_intrinsic(isel_context *ctx, nir_intrinsic_instr *instr)
case nir_intrinsic_load_sbt_amd:
visit_load_sbt_amd(ctx, instr);
break;
case nir_intrinsic_bvh64_intersect_ray_amd:
visit_bvh64_intersect_ray_amd(ctx, instr);
break;
default:
isel_err(&instr->instr, "Unimplemented intrinsic instr");
abort();

View File

@@ -805,6 +805,7 @@ void init_context(isel_context *ctx, nir_shader *shader)
case nir_intrinsic_load_packed_passthrough_primitive_amd:
case nir_intrinsic_gds_atomic_add_amd:
case nir_intrinsic_load_sbt_amd:
case nir_intrinsic_bvh64_intersect_ray_amd:
type = RegType::vgpr;
break;
case nir_intrinsic_shuffle:

View File

@@ -1509,6 +1509,7 @@ IMAGE_GATHER4 = {
for (code, name) in IMAGE_GATHER4:
opcode(name, code, code, code, Format.MIMG, InstrClass.VMem)
opcode("image_bvh64_intersect_ray", -1, -1, 231, Format.MIMG, InstrClass.VMem)
FLAT = {
#GFX7, GFX8_9, GFX10