From 86e8d171fc1a637fb48e14818982bb6867fcf129 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 26 Jun 2025 12:59:11 +0200 Subject: [PATCH] radv: implement vkCmdBind{Resource,Sampler}HeapEXT() Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta.c | 4 +++ src/amd/vulkan/radv_cmd_buffer.c | 44 ++++++++++++++++++++++++++++++++ src/amd/vulkan/radv_cmd_buffer.h | 5 ++++ 3 files changed, 53 insertions(+) diff --git a/src/amd/vulkan/meta/radv_meta.c b/src/amd/vulkan/meta/radv_meta.c index bc9e3ce7dac..46115860275 100644 --- a/src/amd/vulkan/meta/radv_meta.c +++ b/src/amd/vulkan/meta/radv_meta.c @@ -149,6 +149,7 @@ radv_meta_save(struct radv_cmd_buffer *cmd_buffer, uint32_t flags) state->graphics_descriptors.old_descriptor_set0 = descriptors_state->sets[0]; state->graphics_descriptors.old_descriptor_set0_valid = !!(descriptors_state->valid & 0x1); state->graphics_descriptors.old_descriptor_buffer0 = descriptors_state->descriptor_buffers[0]; + state->graphics_descriptors.old_descriptor_heaps_dirty = descriptors_state->dirty_heaps; } if (save_flags & RADV_META_SAVE_COMPUTE_DESCRIPTORS) { @@ -158,6 +159,7 @@ radv_meta_save(struct radv_cmd_buffer *cmd_buffer, uint32_t flags) state->compute_descriptors.old_descriptor_set0 = descriptors_state->sets[0]; state->compute_descriptors.old_descriptor_set0_valid = !!(descriptors_state->valid & 0x1); state->compute_descriptors.old_descriptor_buffer0 = descriptors_state->descriptor_buffers[0]; + state->compute_descriptors.old_descriptor_heaps_dirty = descriptors_state->dirty_heaps; } if (save_flags & RADV_META_SAVE_CONSTANTS) @@ -220,6 +222,7 @@ radv_meta_end(struct radv_cmd_buffer *cmd_buffer) state->graphics_descriptors.old_descriptor_set0, 0); } descriptors_state->descriptor_buffers[0] = state->graphics_descriptors.old_descriptor_buffer0; + descriptors_state->dirty_heaps = state->graphics_descriptors.old_descriptor_heaps_dirty; } if (state->flags & RADV_META_SAVE_COMPUTE_DESCRIPTORS) { @@ -230,6 +233,7 @@ radv_meta_end(struct radv_cmd_buffer *cmd_buffer) state->compute_descriptors.old_descriptor_set0, 0); } descriptors_state->descriptor_buffers[0] = state->compute_descriptors.old_descriptor_buffer0; + descriptors_state->dirty_heaps = state->compute_descriptors.old_descriptor_heaps_dirty; } if (state->flags & RADV_META_SAVE_CONSTANTS) { diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 2343588a12e..1b809740696 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -1307,6 +1307,9 @@ radv_reset_cmd_buffer(struct vk_command_buffer *vk_cmd_buffer, UNUSED VkCommandB cmd_buffer->descriptors[i].dirty = 0; cmd_buffer->descriptors[i].valid = 0; cmd_buffer->descriptors[i].dirty_dynamic = false; + + cmd_buffer->descriptors[i].dirty_heaps = 0; + cmd_buffer->descriptors[i].valid_heaps = 0; } radv_cmd_buffer_reset_rendering(cmd_buffer); @@ -8440,6 +8443,8 @@ radv_mark_descriptors_dirty(struct radv_cmd_buffer *cmd_buffer, VkPipelineBindPo descriptors_state->dirty |= descriptors_state->valid; if (descriptors_state->dynamic_offset_count) descriptors_state->dirty_dynamic = true; + + descriptors_state->dirty_heaps |= descriptors_state->valid_heaps; } static void @@ -16272,3 +16277,42 @@ radv_CmdSetDepthClampRangeEXT(VkCommandBuffer commandBuffer, VkDepthClampModeEXT VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); radv_cmd_set_depth_clamp_range(cmd_buffer, depthClampMode, pDepthClampRange); } + +/* VK_EXT_descriptor_heap */ +static void +radv_bind_descriptor_heap(struct radv_cmd_buffer *cmd_buffer, uint32_t idx, uint64_t addr, + VkPipelineBindPoint bind_point) +{ + struct radv_descriptor_state *descriptors_state = radv_get_descriptors_state(cmd_buffer, bind_point); + + cmd_buffer->descriptor_heaps[idx] = addr; + + descriptors_state->valid_heaps |= (1u << idx); /* active heaps */ + descriptors_state->dirty_heaps |= (1u << idx); +} + +VKAPI_ATTR void VKAPI_CALL +radv_CmdBindSamplerHeapEXT(VkCommandBuffer commandBuffer, const VkBindHeapInfoEXT *pBindInfo) +{ + VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + + radv_bind_descriptor_heap(cmd_buffer, RADV_HEAP_SAMPLER, pBindInfo->heapRange.address, + VK_PIPELINE_BIND_POINT_COMPUTE); + radv_bind_descriptor_heap(cmd_buffer, RADV_HEAP_SAMPLER, pBindInfo->heapRange.address, + VK_PIPELINE_BIND_POINT_GRAPHICS); + radv_bind_descriptor_heap(cmd_buffer, RADV_HEAP_SAMPLER, pBindInfo->heapRange.address, + VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR); +} + +VKAPI_ATTR void VKAPI_CALL +radv_CmdBindResourceHeapEXT(VkCommandBuffer commandBuffer, const VkBindHeapInfoEXT *pBindInfo) +{ + VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + + radv_bind_descriptor_heap(cmd_buffer, RADV_HEAP_RESOURCE, pBindInfo->heapRange.address, + VK_PIPELINE_BIND_POINT_COMPUTE); + radv_bind_descriptor_heap(cmd_buffer, RADV_HEAP_RESOURCE, pBindInfo->heapRange.address, + VK_PIPELINE_BIND_POINT_GRAPHICS); + radv_bind_descriptor_heap(cmd_buffer, RADV_HEAP_RESOURCE, pBindInfo->heapRange.address, + VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR); +} diff --git a/src/amd/vulkan/radv_cmd_buffer.h b/src/amd/vulkan/radv_cmd_buffer.h index a6665713ae2..aaa467f5afe 100644 --- a/src/amd/vulkan/radv_cmd_buffer.h +++ b/src/amd/vulkan/radv_cmd_buffer.h @@ -253,6 +253,9 @@ struct radv_descriptor_state { uint64_t descriptor_buffers[MAX_SETS]; bool need_indirect_descriptors; uint64_t indirect_descriptor_sets_va; + + uint8_t dirty_heaps; + uint8_t valid_heaps; }; struct radv_push_constant_state { @@ -290,6 +293,7 @@ struct radv_meta_saved_descriptor_state { struct radv_descriptor_set *old_descriptor_set0; bool old_descriptor_set0_valid; uint64_t old_descriptor_buffer0; + uint8_t old_descriptor_heaps_dirty; }; struct radv_meta_saved_state { @@ -525,6 +529,7 @@ struct radv_cmd_buffer { struct radv_push_constant_state push_constant_state[MAX_BIND_POINTS]; uint64_t descriptor_buffers[MAX_SETS]; + uint64_t descriptor_heaps[RADV_MAX_HEAPS]; struct radv_cmd_buffer_upload upload;