From f68d64dac01505560a53aabe2b8616685cace0c2 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 6 Aug 2020 22:53:06 -0500 Subject: [PATCH] anv: Add support for vkCmdSetRayTracingPipelineStackSizeKHR Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_cmd_buffer.c | 57 +++++++++++++++++++++++++++++++++++++++ src/intel/vulkan/anv_device.c | 8 ++++++ src/intel/vulkan/anv_private.h | 7 +++++ 3 files changed, 72 insertions(+) diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index db7f8c7..3ebaa48 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -518,6 +518,11 @@ void anv_CmdBindPipeline( cmd_buffer->state.rt.pipeline = rt_pipeline; cmd_buffer->state.rt.pipeline_dirty = true; + + if (rt_pipeline->stack_size > 0) { + anv_CmdSetRayTracingPipelineStackSizeKHR(commandBuffer, + rt_pipeline->stack_size); + } break; } @@ -1591,8 +1596,60 @@ void anv_CmdSetFragmentShadingRateKHR( cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE; } +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) { + ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); + struct anv_cmd_ray_tracing_state *rt = &cmd_buffer->state.rt; + struct anv_device *device = cmd_buffer->device; + + if (anv_batch_has_error(&cmd_buffer->batch)) + return; + + uint32_t stack_ids_per_dss = 2048; /* TODO */ + + unsigned stack_size_log2 = ilog2_round_up(pipelineStackSize); + if (stack_size_log2 < 10) + stack_size_log2 = 10; + + if (rt->scratch.layout.total_size == 1 << stack_size_log2) + return; + + brw_rt_compute_scratch_layout(&rt->scratch.layout, &device->info, + stack_ids_per_dss, 1 << stack_size_log2); + + unsigned bucket = stack_size_log2 - 10; + assert(bucket < ARRAY_SIZE(device->rt_scratch_bos)); + + struct anv_bo *bo = p_atomic_read(&device->rt_scratch_bos[bucket]); + if (bo == NULL) { + struct anv_bo *new_bo; + VkResult result = anv_device_alloc_bo(device, "RT scratch", + rt->scratch.layout.total_size, + 0, /* alloc_flags */ + 0, /* explicit_address */ + &new_bo); + if (result != VK_SUCCESS) { + rt->scratch.layout.total_size = 0; + anv_batch_set_error(&cmd_buffer->batch, result); + return; + } + + bo = p_atomic_cmpxchg(&device->rt_scratch_bos[bucket], NULL, new_bo); + if (bo != NULL) { + anv_device_release_bo(device, bo); + } else { + bo = new_bo; + } + } + + rt->scratch.bo = bo; } diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index d177614d..9809950 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -3344,6 +3344,9 @@ VkResult anv_CreateDevice( anv_scratch_pool_init(device, &device->scratch_pool); + /* TODO(RT): Do we want some sort of data structure for this? */ + memset(device->rt_scratch_bos, 0, sizeof(device->rt_scratch_bos)); + result = anv_genX(&device->info, init_device_state)(device); if (result != VK_SUCCESS) goto fail_trivial_batch_bo_and_scratch_pool; @@ -3436,6 +3439,11 @@ void anv_DestroyDevice( anv_state_pool_free(&device->dynamic_state_pool, device->slice_hash); #endif + for (unsigned i = 0; i < ARRAY_SIZE(device->rt_scratch_bos); i++) { + if (device->rt_scratch_bos[i] != NULL) + anv_device_release_bo(device, device->rt_scratch_bos[i]); + } + anv_scratch_pool_finish(device, &device->scratch_pool); anv_device_release_bo(device, device->workaround_bo); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index b3a3265..ca9a087 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -51,6 +51,7 @@ #include "dev/intel_device_info.h" #include "blorp/blorp.h" #include "compiler/brw_compiler.h" +#include "compiler/brw_rt.h" #include "util/bitset.h" #include "util/bitscan.h" #include "util/macros.h" @@ -1238,6 +1239,7 @@ struct anv_device { struct anv_queue * queues; struct anv_scratch_pool scratch_pool; + struct anv_bo *rt_scratch_bos[16]; pthread_mutex_t mutex; pthread_cond_t queue_submit; @@ -2937,6 +2939,11 @@ struct anv_cmd_ray_tracing_state { struct anv_ray_tracing_pipeline *pipeline; bool pipeline_dirty; + + struct { + struct anv_bo *bo; + struct brw_rt_scratch_layout layout; + } scratch; }; /** State required while building cmd buffer */ -- 2.7.4