anv: Add support for vkCmdSetRayTracingPipelineStackSizeKHR
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8637>
This commit is contained in:

committed by
Marge Bot

parent
02f7964a13
commit
f68d64dac0
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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 */
|
||||
|
Reference in New Issue
Block a user