intel/fs: Add and implement intel-specific ray-tracing intrinsics
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7356>
This commit is contained in:

committed by
Marge Bot

parent
1f6ae809ef
commit
75209d5bd1
@@ -1103,6 +1103,11 @@ intrinsic("btd_resume_intel", indices=[BASE, RANGE])
|
|||||||
# src[] = { }
|
# src[] = { }
|
||||||
intrinsic("btd_retire_intel")
|
intrinsic("btd_retire_intel")
|
||||||
|
|
||||||
|
# Intel-specific ray-tracing intrinsics
|
||||||
|
intrinsic("trace_ray_initial_intel")
|
||||||
|
intrinsic("trace_ray_commit_intel")
|
||||||
|
intrinsic("trace_ray_continue_intel")
|
||||||
|
|
||||||
# System values used for ray-tracing on Intel
|
# System values used for ray-tracing on Intel
|
||||||
system_value("ray_base_mem_addr_intel", 1, bit_sizes=[64])
|
system_value("ray_base_mem_addr_intel", 1, bit_sizes=[64])
|
||||||
system_value("ray_hw_stack_size_intel", 1)
|
system_value("ray_hw_stack_size_intel", 1)
|
||||||
|
@@ -315,6 +315,7 @@ static const char *const gen6_sfid[16] = {
|
|||||||
[GEN7_SFID_PIXEL_INTERPOLATOR] = "pixel interp",
|
[GEN7_SFID_PIXEL_INTERPOLATOR] = "pixel interp",
|
||||||
[HSW_SFID_DATAPORT_DATA_CACHE_1] = "dp data 1",
|
[HSW_SFID_DATAPORT_DATA_CACHE_1] = "dp data 1",
|
||||||
[HSW_SFID_CRE] = "cre",
|
[HSW_SFID_CRE] = "cre",
|
||||||
|
[GEN_RT_SFID_RAY_TRACE_ACCELERATOR] = "rt accel",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const gen7_gateway_subfuncid[8] = {
|
static const char *const gen7_gateway_subfuncid[8] = {
|
||||||
@@ -2102,6 +2103,14 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
|
|||||||
}
|
}
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
|
|
||||||
|
case GEN_RT_SFID_RAY_TRACE_ACCELERATOR:
|
||||||
|
if (devinfo->has_ray_tracing) {
|
||||||
|
format(file, " SIMD%d,",
|
||||||
|
brw_rt_trace_ray_desc_exec_size(devinfo, imm_desc));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
format(file, "unsupported shared function ID %d", sfid);
|
format(file, "unsupported shared function ID %d", sfid);
|
||||||
break;
|
break;
|
||||||
|
@@ -1050,6 +1050,24 @@ brw_btd_spawn_exec_size(const struct gen_device_info *devinfo,
|
|||||||
return brw_mdc_sm2_exec_size(GET_BITS(desc, 8, 8));
|
return brw_mdc_sm2_exec_size(GET_BITS(desc, 8, 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
brw_rt_trace_ray_desc(const struct gen_device_info *devinfo,
|
||||||
|
unsigned exec_size)
|
||||||
|
{
|
||||||
|
assert(devinfo->has_ray_tracing);
|
||||||
|
|
||||||
|
return SET_BITS(0, 19, 19) | /* No header */
|
||||||
|
SET_BITS(0, 17, 14) | /* Message type */
|
||||||
|
SET_BITS(brw_mdc_sm2(exec_size), 8, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
brw_rt_trace_ray_desc_exec_size(const struct gen_device_info *devinfo,
|
||||||
|
uint32_t desc)
|
||||||
|
{
|
||||||
|
return brw_mdc_sm2_exec_size(GET_BITS(desc, 8, 8));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a message descriptor immediate with the specified pixel
|
* Construct a message descriptor immediate with the specified pixel
|
||||||
* interpolator function controls.
|
* interpolator function controls.
|
||||||
|
@@ -797,6 +797,8 @@ enum opcode {
|
|||||||
SHADER_OPCODE_GET_DSS_ID,
|
SHADER_OPCODE_GET_DSS_ID,
|
||||||
SHADER_OPCODE_BTD_SPAWN_LOGICAL,
|
SHADER_OPCODE_BTD_SPAWN_LOGICAL,
|
||||||
SHADER_OPCODE_BTD_RETIRE_LOGICAL,
|
SHADER_OPCODE_BTD_RETIRE_LOGICAL,
|
||||||
|
|
||||||
|
RT_OPCODE_TRACE_RAY_LOGICAL,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum brw_urb_write_flags {
|
enum brw_urb_write_flags {
|
||||||
@@ -1236,6 +1238,7 @@ enum brw_message_target {
|
|||||||
HSW_SFID_CRE = 13,
|
HSW_SFID_CRE = 13,
|
||||||
|
|
||||||
GEN_RT_SFID_BINDLESS_THREAD_DISPATCH = 7,
|
GEN_RT_SFID_BINDLESS_THREAD_DISPATCH = 7,
|
||||||
|
GEN_RT_SFID_RAY_TRACE_ACCELERATOR = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define GEN7_MESSAGE_TARGET_DP_DATA_CACHE 10
|
#define GEN7_MESSAGE_TARGET_DP_DATA_CACHE 10
|
||||||
@@ -1630,4 +1633,14 @@ enum PACKED brw_rnd_mode {
|
|||||||
|
|
||||||
#define GEN_RT_BTD_MESSAGE_SPAWN 1
|
#define GEN_RT_BTD_MESSAGE_SPAWN 1
|
||||||
|
|
||||||
|
#define GEN_RT_TRACE_RAY_INITAL 0
|
||||||
|
#define GEN_RT_TRACE_RAY_INSTANCE 1
|
||||||
|
#define GEN_RT_TRACE_RAY_COMMIT 2
|
||||||
|
#define GEN_RT_TRACE_RAY_CONTINUE 3
|
||||||
|
|
||||||
|
#define GEN_RT_BTD_SHADER_TYPE_ANY_HIT 0
|
||||||
|
#define GEN_RT_BTD_SHADER_TYPE_CLOSEST_HIT 1
|
||||||
|
#define GEN_RT_BTD_SHADER_TYPE_MISS 2
|
||||||
|
#define GEN_RT_BTD_SHADER_TYPE_INTERSECTION 3
|
||||||
|
|
||||||
#endif /* BRW_EU_DEFINES_H */
|
#endif /* BRW_EU_DEFINES_H */
|
||||||
|
@@ -6103,6 +6103,54 @@ lower_btd_logical_send(const fs_builder &bld, fs_inst *inst)
|
|||||||
inst->src[3] = payload;
|
inst->src[3] = payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lower_trace_ray_logical_send(const fs_builder &bld, fs_inst *inst)
|
||||||
|
{
|
||||||
|
const gen_device_info *devinfo = bld.shader->devinfo;
|
||||||
|
const fs_reg &bvh_level = inst->src[0];
|
||||||
|
assert(inst->src[1].file == BRW_IMMEDIATE_VALUE);
|
||||||
|
const uint32_t trace_ray_control = inst->src[1].ud;
|
||||||
|
|
||||||
|
const unsigned mlen = 1;
|
||||||
|
const fs_builder ubld = bld.exec_all().group(8, 0);
|
||||||
|
fs_reg header = ubld.vgrf(BRW_REGISTER_TYPE_UD);
|
||||||
|
ubld.MOV(header, brw_imm_ud(0));
|
||||||
|
ubld.group(2, 0).MOV(header,
|
||||||
|
retype(brw_vec2_grf(2, 0), BRW_REGISTER_TYPE_UD));
|
||||||
|
/* TODO: Bit 128 is ray_query */
|
||||||
|
|
||||||
|
const unsigned ex_mlen = inst->exec_size / 8;
|
||||||
|
fs_reg payload = bld.vgrf(BRW_REGISTER_TYPE_UD);
|
||||||
|
const uint32_t trc_bits = SET_BITS(trace_ray_control, 9, 8);
|
||||||
|
if (bvh_level.file == BRW_IMMEDIATE_VALUE) {
|
||||||
|
bld.MOV(payload, brw_imm_ud(trc_bits | (bvh_level.ud & 0x7)));
|
||||||
|
} else {
|
||||||
|
bld.AND(payload, bvh_level, brw_imm_ud(0x7));
|
||||||
|
if (trc_bits != 0)
|
||||||
|
bld.OR(payload, payload, brw_imm_ud(trc_bits));
|
||||||
|
}
|
||||||
|
bld.AND(subscript(payload, BRW_REGISTER_TYPE_UW, 1),
|
||||||
|
retype(brw_vec8_grf(1, 0), BRW_REGISTER_TYPE_UW),
|
||||||
|
brw_imm_uw(0x7ff));
|
||||||
|
|
||||||
|
/* Update the original instruction. */
|
||||||
|
inst->opcode = SHADER_OPCODE_SEND;
|
||||||
|
inst->mlen = mlen;
|
||||||
|
inst->ex_mlen = ex_mlen;
|
||||||
|
inst->header_size = 0; /* HW docs require has_header = false */
|
||||||
|
inst->send_has_side_effects = true;
|
||||||
|
inst->send_is_volatile = false;
|
||||||
|
|
||||||
|
/* Set up SFID and descriptors */
|
||||||
|
inst->sfid = GEN_RT_SFID_RAY_TRACE_ACCELERATOR;
|
||||||
|
inst->desc = brw_rt_trace_ray_desc(devinfo, inst->exec_size);
|
||||||
|
inst->resize_sources(4);
|
||||||
|
inst->src[0] = brw_imm_ud(0); /* desc */
|
||||||
|
inst->src[1] = brw_imm_ud(0); /* ex_desc */
|
||||||
|
inst->src[2] = header;
|
||||||
|
inst->src[3] = payload;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
fs_visitor::lower_logical_sends()
|
fs_visitor::lower_logical_sends()
|
||||||
{
|
{
|
||||||
@@ -6252,6 +6300,10 @@ fs_visitor::lower_logical_sends()
|
|||||||
lower_btd_logical_send(ibld, inst);
|
lower_btd_logical_send(ibld, inst);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RT_OPCODE_TRACE_RAY_LOGICAL:
|
||||||
|
lower_trace_ray_logical_send(ibld, inst);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,7 @@
|
|||||||
#include "compiler/glsl/ir.h"
|
#include "compiler/glsl/ir.h"
|
||||||
#include "brw_fs.h"
|
#include "brw_fs.h"
|
||||||
#include "brw_nir.h"
|
#include "brw_nir.h"
|
||||||
|
#include "brw_rt.h"
|
||||||
#include "brw_eu.h"
|
#include "brw_eu.h"
|
||||||
#include "nir_search_helpers.h"
|
#include "nir_search_helpers.h"
|
||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
@@ -3898,6 +3899,27 @@ fs_visitor::nir_emit_bs_intrinsic(const fs_builder &bld,
|
|||||||
bld.MOV(dest, retype(brw_vec1_grf(2, 2), dest.type));
|
bld.MOV(dest, retype(brw_vec1_grf(2, 2), dest.type));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case nir_intrinsic_trace_ray_initial_intel:
|
||||||
|
bld.emit(RT_OPCODE_TRACE_RAY_LOGICAL,
|
||||||
|
bld.null_reg_ud(),
|
||||||
|
brw_imm_ud(BRW_RT_BVH_LEVEL_WORLD),
|
||||||
|
brw_imm_ud(GEN_RT_TRACE_RAY_INITAL));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case nir_intrinsic_trace_ray_commit_intel:
|
||||||
|
bld.emit(RT_OPCODE_TRACE_RAY_LOGICAL,
|
||||||
|
bld.null_reg_ud(),
|
||||||
|
brw_imm_ud(BRW_RT_BVH_LEVEL_OBJECT),
|
||||||
|
brw_imm_ud(GEN_RT_TRACE_RAY_COMMIT));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case nir_intrinsic_trace_ray_continue_intel:
|
||||||
|
bld.emit(RT_OPCODE_TRACE_RAY_LOGICAL,
|
||||||
|
bld.null_reg_ud(),
|
||||||
|
brw_imm_ud(BRW_RT_BVH_LEVEL_OBJECT),
|
||||||
|
brw_imm_ud(GEN_RT_TRACE_RAY_CONTINUE));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
nir_emit_intrinsic(bld, instr);
|
nir_emit_intrinsic(bld, instr);
|
||||||
break;
|
break;
|
||||||
|
@@ -1089,6 +1089,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case GEN_RT_SFID_BINDLESS_THREAD_DISPATCH:
|
case GEN_RT_SFID_BINDLESS_THREAD_DISPATCH:
|
||||||
|
case GEN_RT_SFID_RAY_TRACE_ACCELERATOR:
|
||||||
return calculate_desc(info, unit_spawner, 2, 0, 0, 0 /* XXX */, 0,
|
return calculate_desc(info, unit_spawner, 2, 0, 0, 0 /* XXX */, 0,
|
||||||
10 /* XXX */, 0, 0, 0, 0, 0);
|
10 /* XXX */, 0, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
@@ -525,6 +525,7 @@ schedule_node::set_latency_gen7(bool is_haswell)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GEN_RT_SFID_BINDLESS_THREAD_DISPATCH:
|
case GEN_RT_SFID_BINDLESS_THREAD_DISPATCH:
|
||||||
|
case GEN_RT_SFID_RAY_TRACE_ACCELERATOR:
|
||||||
/* TODO.
|
/* TODO.
|
||||||
*
|
*
|
||||||
* We'll assume for the moment that this is pretty quick as it
|
* We'll assume for the moment that this is pretty quick as it
|
||||||
|
@@ -543,6 +543,9 @@ brw_instruction_name(const struct gen_device_info *devinfo, enum opcode op)
|
|||||||
case TES_OPCODE_GET_PRIMITIVE_ID:
|
case TES_OPCODE_GET_PRIMITIVE_ID:
|
||||||
return "tes_get_primitive_id";
|
return "tes_get_primitive_id";
|
||||||
|
|
||||||
|
case RT_OPCODE_TRACE_RAY_LOGICAL:
|
||||||
|
return "rt_trace_ray_logical";
|
||||||
|
|
||||||
case SHADER_OPCODE_RND_MODE:
|
case SHADER_OPCODE_RND_MODE:
|
||||||
return "rnd_mode";
|
return "rnd_mode";
|
||||||
case SHADER_OPCODE_FLOAT_CONTROL_MODE:
|
case SHADER_OPCODE_FLOAT_CONTROL_MODE:
|
||||||
@@ -1112,6 +1115,8 @@ backend_instruction::has_side_effects() const
|
|||||||
case SHADER_OPCODE_A64_OWORD_BLOCK_WRITE_LOGICAL:
|
case SHADER_OPCODE_A64_OWORD_BLOCK_WRITE_LOGICAL:
|
||||||
case SHADER_OPCODE_BTD_SPAWN_LOGICAL:
|
case SHADER_OPCODE_BTD_SPAWN_LOGICAL:
|
||||||
case SHADER_OPCODE_BTD_RETIRE_LOGICAL:
|
case SHADER_OPCODE_BTD_RETIRE_LOGICAL:
|
||||||
|
case RT_OPCODE_TRACE_RAY_LOGICAL:
|
||||||
|
case FS_OPCODE_DISCARD_JUMP:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return eot;
|
return eot;
|
||||||
|
Reference in New Issue
Block a user