panvk: Implement CmdBindDescriptorSets2KHR, CmdPushConstants2KHR and CmdPushDescriptorSet2KHR

Those are part of maintenance6.

Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30293>
This commit is contained in:
Mary Guillemard
2024-07-19 11:12:11 +02:00
committed by Marge Bot
parent 0329070233
commit b3cd3b0ed4
4 changed files with 60 additions and 54 deletions

View File

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

View File

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

View File

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

View File

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