diff --git a/src/panfrost/vulkan/bifrost/panvk_cmd_desc_state.h b/src/panfrost/vulkan/bifrost/panvk_cmd_desc_state.h index 1ec98e473f6..e58ae6b2be4 100644 --- a/src/panfrost/vulkan/bifrost/panvk_cmd_desc_state.h +++ b/src/panfrost/vulkan/bifrost/panvk_cmd_desc_state.h @@ -45,10 +45,8 @@ void panvk_per_arch(cmd_desc_state_cleanup)( struct panvk_descriptor_state *compute_desc_state); void panvk_per_arch(cmd_desc_state_bind_sets)( - struct panvk_descriptor_state *desc_state, VkPipelineLayout layout, - uint32_t first_set, uint32_t desc_set_count, - const VkDescriptorSet *desc_sets, uint32_t dyn_offset_count, - const uint32_t *dyn_offsets); + struct panvk_descriptor_state *desc_state, + const VkBindDescriptorSetsInfoKHR *info); struct panvk_descriptor_set *panvk_per_arch(cmd_push_descriptors)( struct vk_command_buffer *cmdbuf, struct panvk_descriptor_state *desc_state, diff --git a/src/panfrost/vulkan/bifrost/panvk_vX_cmd_desc_state.c b/src/panfrost/vulkan/bifrost/panvk_vX_cmd_desc_state.c index 9a22aea30c2..76c4216a27e 100644 --- a/src/panfrost/vulkan/bifrost/panvk_vX_cmd_desc_state.c +++ b/src/panfrost/vulkan/bifrost/panvk_vX_cmd_desc_state.c @@ -48,15 +48,13 @@ panvk_per_arch(cmd_desc_state_cleanup)( void panvk_per_arch(cmd_desc_state_bind_sets)( - struct panvk_descriptor_state *desc_state, VkPipelineLayout layout, - uint32_t first_set, uint32_t desc_set_count, - const VkDescriptorSet *desc_sets, uint32_t dyn_offset_count, - const uint32_t *dyn_offsets) + struct panvk_descriptor_state *desc_state, + const VkBindDescriptorSetsInfoKHR *info) { unsigned dynoffset_idx = 0; - for (unsigned i = 0; i < desc_set_count; ++i) { - unsigned set_idx = i + first_set; - VK_FROM_HANDLE(panvk_descriptor_set, set, desc_sets[i]); + for (unsigned i = 0; i < info->descriptorSetCount; ++i) { + unsigned set_idx = i + info->firstSet; + VK_FROM_HANDLE(panvk_descriptor_set, set, info->pDescriptorSets[i]); /* Invalidate the push set. */ if (desc_state->sets[set_idx] && @@ -78,12 +76,12 @@ panvk_per_arch(cmd_desc_state_bind_sets)( unsigned dyn_buf_idx = set->layout->bindings[b].desc_idx; for (unsigned e = 0; e < set->layout->bindings[b].desc_count; e++) { desc_state->dyn_buf_offsets[set_idx][dyn_buf_idx++] = - dyn_offsets[dynoffset_idx++]; + info->pDynamicOffsets[dynoffset_idx++]; } } } - assert(dynoffset_idx == dyn_offset_count); + assert(dynoffset_idx == info->dynamicOffsetCount); } struct panvk_descriptor_set * diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c index 8625ef09d2e..e6d1d86fac5 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c @@ -454,47 +454,44 @@ panvk_per_arch(BeginCommandBuffer)(VkCommandBuffer commandBuffer, } VKAPI_ATTR void VKAPI_CALL -panvk_per_arch(CmdBindDescriptorSets)( - VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, - VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, - const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount, - const uint32_t *pDynamicOffsets) +panvk_per_arch(CmdBindDescriptorSets2KHR)( + VkCommandBuffer commandBuffer, + const VkBindDescriptorSetsInfoKHR *pBindDescriptorSetsInfo) { VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - struct panvk_descriptor_state *desc_state = - panvk_cmd_get_desc_state(cmdbuf, pipelineBindPoint); - - panvk_per_arch(cmd_desc_state_bind_sets)( - desc_state, layout, firstSet, descriptorSetCount, pDescriptorSets, - dynamicOffsetCount, pDynamicOffsets); - /* TODO: Invalidate only if the shader tables are disturbed */ - if (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) { + if (pBindDescriptorSetsInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) { + panvk_per_arch(cmd_desc_state_bind_sets)(&cmdbuf->state.gfx.desc_state, + pBindDescriptorSetsInfo); + memset(&cmdbuf->state.gfx.vs.desc, 0, sizeof(cmdbuf->state.gfx.vs.desc)); memset(&cmdbuf->state.gfx.fs.desc, 0, sizeof(cmdbuf->state.gfx.fs.desc)); - } else { + } + + if (pBindDescriptorSetsInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) { + panvk_per_arch(cmd_desc_state_bind_sets)( + &cmdbuf->state.compute.desc_state, pBindDescriptorSetsInfo); + memset(&cmdbuf->state.compute.cs.desc, 0, sizeof(cmdbuf->state.compute.cs.desc)); } } VKAPI_ATTR void VKAPI_CALL -panvk_per_arch(CmdPushConstants)(VkCommandBuffer commandBuffer, - VkPipelineLayout layout, - VkShaderStageFlags stageFlags, uint32_t offset, - uint32_t size, const void *pValues) +panvk_per_arch(CmdPushConstants2KHR)( + VkCommandBuffer commandBuffer, + const VkPushConstantsInfoKHR *pPushConstantsInfo) { VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - if (stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) + if (pPushConstantsInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) cmdbuf->state.gfx.push_uniforms = 0; - if (stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) + if (pPushConstantsInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) cmdbuf->state.compute.push_uniforms = 0; - panvk_cmd_push_constants(&cmdbuf->state.push_constants, stageFlags, offset, - size, pValues); + panvk_cmd_push_constants(&cmdbuf->state.push_constants, pPushConstantsInfo); } static void @@ -541,37 +538,51 @@ panvk_per_arch(cmd_bind_shaders)(struct vk_command_buffer *vk_cmd, } } -VKAPI_ATTR void VKAPI_CALL -panvk_per_arch(CmdPushDescriptorSetKHR)( - VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, - VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, - const VkWriteDescriptorSet *pDescriptorWrites) +static void +panvk_push_descriptor_set(struct panvk_cmd_buffer *cmd, + struct panvk_descriptor_state *desc, + const VkPushDescriptorSetInfoKHR *info) { - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - VK_FROM_HANDLE(vk_pipeline_layout, playout, layout); + VK_FROM_HANDLE(vk_pipeline_layout, playout, info->layout); + const struct panvk_descriptor_set_layout *set_layout = - to_panvk_descriptor_set_layout(playout->set_layouts[set]); - struct panvk_descriptor_state *desc_state = - panvk_cmd_get_desc_state(cmdbuf, pipelineBindPoint); + to_panvk_descriptor_set_layout(playout->set_layouts[info->set]); + struct panvk_descriptor_set *push_set = - panvk_per_arch(cmd_push_descriptors)(&cmdbuf->vk, desc_state, set); + panvk_per_arch(cmd_push_descriptors)(&cmd->vk, desc, info->set); if (!push_set) return; push_set->layout = set_layout; push_set->desc_count = set_layout->desc_count; - for (uint32_t i = 0; i < descriptorWriteCount; i++) - panvk_per_arch(descriptor_set_write)(push_set, &pDescriptorWrites[i], - true); + for (uint32_t i = 0; i < info->descriptorWriteCount; i++) + panvk_per_arch(descriptor_set_write)(push_set, + &info->pDescriptorWrites[i], true); push_set->descs.dev = 0; push_set->layout = NULL; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdPushDescriptorSet2KHR)( + VkCommandBuffer commandBuffer, + const VkPushDescriptorSetInfoKHR *pPushDescriptorSetInfo) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + + if (pPushDescriptorSetInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) { + panvk_push_descriptor_set(cmdbuf, &cmdbuf->state.gfx.desc_state, + pPushDescriptorSetInfo); - if (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) { memset(&cmdbuf->state.gfx.vs.desc, 0, sizeof(cmdbuf->state.gfx.vs.desc)); memset(&cmdbuf->state.gfx.fs.desc, 0, sizeof(cmdbuf->state.gfx.fs.desc)); - } else { + } + + if (pPushDescriptorSetInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) { + panvk_push_descriptor_set(cmdbuf, &cmdbuf->state.compute.desc_state, + pPushDescriptorSetInfo); + memset(&cmdbuf->state.compute.cs.desc, 0, sizeof(cmdbuf->state.compute.cs.desc)); } diff --git a/src/panfrost/vulkan/panvk_cmd_push_constant.h b/src/panfrost/vulkan/panvk_cmd_push_constant.h index 47e7bdfac25..397bff3d8ed 100644 --- a/src/panfrost/vulkan/panvk_cmd_push_constant.h +++ b/src/panfrost/vulkan/panvk_cmd_push_constant.h @@ -37,10 +37,9 @@ panvk_cmd_prepare_push_uniforms(struct pan_pool *desc_pool_base, static inline void panvk_cmd_push_constants(struct panvk_push_constant_state *push, - VkShaderStageFlags stages, uint32_t offset, - uint32_t size, const void *values) + const VkPushConstantsInfoKHR *info) { - memcpy(push->data + offset, values, size); + memcpy(push->data + info->offset, info->pValues, info->size); } #endif