anv: enable ray queries
Only on platforms that support it. v3: Split out code setting up ray query shadow buffer (Caio) Don't forget to setup ray query globals even when no shadow buffer is used (Lionel) Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Caio Oliveira <caio.oliveira@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13719>
This commit is contained in:

committed by
Marge Bot

parent
c78be5da30
commit
5d3e419378
@@ -483,6 +483,78 @@ set_dirty_for_bind_map(struct anv_cmd_buffer *cmd_buffer,
|
||||
cmd_buffer->state.push_constants_dirty |= mesa_to_vk_shader_stage(stage);
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
ilog2_round_up(uint32_t value)
|
||||
{
|
||||
assert(value != 0);
|
||||
return 32 - __builtin_clz(value - 1);
|
||||
}
|
||||
|
||||
static void
|
||||
anv_cmd_buffer_set_ray_query_buffer(struct anv_cmd_buffer *cmd_buffer,
|
||||
struct anv_cmd_pipeline_state *pipeline_state,
|
||||
struct anv_pipeline *pipeline,
|
||||
VkShaderStageFlags stages)
|
||||
{
|
||||
struct anv_device *device = cmd_buffer->device;
|
||||
|
||||
uint64_t ray_shadow_size =
|
||||
align_u64(brw_rt_ray_queries_shadow_stacks_size(&device->info,
|
||||
pipeline->ray_queries),
|
||||
4096);
|
||||
if (ray_shadow_size > 0 &&
|
||||
(!cmd_buffer->state.ray_query_shadow_bo ||
|
||||
cmd_buffer->state.ray_query_shadow_bo->size < ray_shadow_size)) {
|
||||
unsigned shadow_size_log2 = MAX2(ilog2_round_up(ray_shadow_size), 16);
|
||||
unsigned bucket = shadow_size_log2 - 16;
|
||||
assert(bucket < ARRAY_SIZE(device->ray_query_shadow_bos));
|
||||
|
||||
struct anv_bo *bo = p_atomic_read(&device->ray_query_shadow_bos[bucket]);
|
||||
if (bo == NULL) {
|
||||
struct anv_bo *new_bo;
|
||||
VkResult result = anv_device_alloc_bo(device, "RT queries shadow",
|
||||
ray_shadow_size,
|
||||
ANV_BO_ALLOC_LOCAL_MEM, /* alloc_flags */
|
||||
0, /* explicit_address */
|
||||
&new_bo);
|
||||
if (result != VK_SUCCESS) {
|
||||
anv_batch_set_error(&cmd_buffer->batch, result);
|
||||
return;
|
||||
}
|
||||
|
||||
bo = p_atomic_cmpxchg(&device->ray_query_shadow_bos[bucket], NULL, new_bo);
|
||||
if (bo != NULL) {
|
||||
anv_device_release_bo(device, bo);
|
||||
} else {
|
||||
bo = new_bo;
|
||||
}
|
||||
}
|
||||
cmd_buffer->state.ray_query_shadow_bo = bo;
|
||||
|
||||
/* Add the ray query buffers to the batch list. */
|
||||
anv_reloc_list_add_bo(cmd_buffer->batch.relocs,
|
||||
cmd_buffer->batch.alloc,
|
||||
cmd_buffer->state.ray_query_shadow_bo);
|
||||
}
|
||||
|
||||
/* Add the HW buffer to the list of BO used. */
|
||||
anv_reloc_list_add_bo(cmd_buffer->batch.relocs,
|
||||
cmd_buffer->batch.alloc,
|
||||
device->ray_query_bo);
|
||||
|
||||
/* Fill the push constants & mark them dirty. */
|
||||
struct anv_state ray_query_global_state =
|
||||
anv_genX(&device->info, cmd_buffer_ray_query_globals)(cmd_buffer);
|
||||
|
||||
struct anv_address ray_query_globals_addr = (struct anv_address) {
|
||||
.bo = device->dynamic_state_pool.block_pool.bo,
|
||||
.offset = ray_query_global_state.offset,
|
||||
};
|
||||
pipeline_state->push_constants.ray_query_globals =
|
||||
anv_address_physical(ray_query_globals_addr);
|
||||
cmd_buffer->state.push_constants_dirty |= stages;
|
||||
}
|
||||
|
||||
void anv_CmdBindPipeline(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkPipelineBindPoint pipelineBindPoint,
|
||||
@@ -490,6 +562,8 @@ void anv_CmdBindPipeline(
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
ANV_FROM_HANDLE(anv_pipeline, pipeline, _pipeline);
|
||||
struct anv_cmd_pipeline_state *state;
|
||||
VkShaderStageFlags stages = 0;
|
||||
|
||||
switch (pipelineBindPoint) {
|
||||
case VK_PIPELINE_BIND_POINT_COMPUTE: {
|
||||
@@ -502,6 +576,9 @@ void anv_CmdBindPipeline(
|
||||
cmd_buffer->state.compute.pipeline_dirty = true;
|
||||
set_dirty_for_bind_map(cmd_buffer, MESA_SHADER_COMPUTE,
|
||||
&compute_pipeline->cs->bind_map);
|
||||
|
||||
state = &cmd_buffer->state.compute.base;
|
||||
stages = VK_SHADER_STAGE_COMPUTE_BIT;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -525,6 +602,9 @@ void anv_CmdBindPipeline(
|
||||
anv_dynamic_state_copy(&cmd_buffer->state.gfx.dynamic,
|
||||
&gfx_pipeline->dynamic_state,
|
||||
gfx_pipeline->dynamic_state_mask);
|
||||
|
||||
state = &cmd_buffer->state.gfx.base;
|
||||
stages = gfx_pipeline->active_stages;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -541,6 +621,8 @@ void anv_CmdBindPipeline(
|
||||
anv_CmdSetRayTracingPipelineStackSizeKHR(commandBuffer,
|
||||
rt_pipeline->stack_size);
|
||||
}
|
||||
|
||||
state = &cmd_buffer->state.rt.base;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -548,6 +630,9 @@ void anv_CmdBindPipeline(
|
||||
assert(!"invalid bind point");
|
||||
break;
|
||||
}
|
||||
|
||||
if (pipeline->ray_queries > 0)
|
||||
anv_cmd_buffer_set_ray_query_buffer(cmd_buffer, state, pipeline, stages);
|
||||
}
|
||||
|
||||
void anv_CmdSetRasterizerDiscardEnableEXT(
|
||||
@@ -1675,13 +1760,6 @@ void anv_CmdSetFragmentShadingRateKHR(
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
ilog2_round_up(uint32_t value)
|
||||
{
|
||||
assert(value != 0);
|
||||
return 32 - __builtin_clz(value - 1);
|
||||
}
|
||||
|
||||
void anv_CmdSetRayTracingPipelineStackSizeKHR(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t pipelineStackSize)
|
||||
|
Reference in New Issue
Block a user