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:

committed by
Marge Bot

parent
0329070233
commit
b3cd3b0ed4
@@ -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,
|
||||
|
@@ -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 *
|
||||
|
@@ -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));
|
||||
}
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user