radv: implement vkCmdBind{Resource,Sampler}HeapEXT()

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39483>
This commit is contained in:
Samuel Pitoiset 2025-06-26 12:59:11 +02:00 committed by Marge Bot
parent 7e63a2050b
commit 86e8d171fc
3 changed files with 53 additions and 0 deletions

View file

@ -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) {

View file

@ -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);
}

View file

@ -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;