panvk: Move Cmd{Bind,Push}DescriptorSets implementation to cmd_desc_state.c
Turns out the panvk_cmd_buffer for CSF/JM have enough similarities to make it possible to have a generic implementation in panvk_vX_cmd_desc_state.c. Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Rebecca Mckeever <rebecca.mckeever@collabora.com> Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com> Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com> Reviewed-by: John Anthony <john.anthony@arm.com> Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30969>
This commit is contained in:
committed by
Marge Bot
parent
aedb00ca08
commit
0426c14c7a
@@ -441,31 +441,6 @@ panvk_per_arch(BeginCommandBuffer)(VkCommandBuffer commandBuffer,
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
panvk_per_arch(CmdBindDescriptorSets2KHR)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const VkBindDescriptorSetsInfoKHR *pBindDescriptorSetsInfo)
|
||||
{
|
||||
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
|
||||
|
||||
/* TODO: Invalidate only if the shader tables are disturbed */
|
||||
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));
|
||||
}
|
||||
|
||||
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(CmdPushConstants2KHR)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
@@ -525,91 +500,3 @@ panvk_per_arch(cmd_bind_shaders)(struct vk_command_buffer *vk_cmd,
|
||||
panvk_cmd_bind_shader(cmd, stages[i], shader);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
panvk_push_descriptor_set(struct panvk_cmd_buffer *cmd,
|
||||
struct panvk_descriptor_state *desc,
|
||||
const VkPushDescriptorSetInfoKHR *info)
|
||||
{
|
||||
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[info->set]);
|
||||
|
||||
struct panvk_descriptor_set *push_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 < 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);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
panvk_per_arch(CmdPushDescriptorSetWithTemplate2KHR)(
|
||||
VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfoKHR
|
||||
*pPushDescriptorSetWithTemplateInfo)
|
||||
{
|
||||
VK_FROM_HANDLE(vk_descriptor_update_template, template,
|
||||
pPushDescriptorSetWithTemplateInfo->descriptorUpdateTemplate);
|
||||
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
|
||||
VK_FROM_HANDLE(vk_pipeline_layout, playout,
|
||||
pPushDescriptorSetWithTemplateInfo->layout);
|
||||
const uint32_t set = pPushDescriptorSetWithTemplateInfo->set;
|
||||
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, template->bind_point);
|
||||
struct panvk_descriptor_set *push_set =
|
||||
panvk_per_arch(cmd_push_descriptors)(&cmdbuf->vk, desc_state, set);
|
||||
if (!push_set)
|
||||
return;
|
||||
|
||||
push_set->layout = set_layout;
|
||||
push_set->desc_count = set_layout->desc_count;
|
||||
|
||||
panvk_per_arch(descriptor_set_write_template)(
|
||||
push_set, template, pPushDescriptorSetWithTemplateInfo->pData, true);
|
||||
|
||||
push_set->descs.dev = 0;
|
||||
push_set->layout = NULL;
|
||||
|
||||
if (template->bind_point == 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 {
|
||||
memset(&cmdbuf->state.compute.cs.desc, 0,
|
||||
sizeof(cmdbuf->state.compute.cs.desc));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,14 +52,6 @@ struct panvk_descriptor_state {
|
||||
uint32_t dyn_buf_offsets[MAX_SETS][MAX_DYNAMIC_BUFFERS];
|
||||
};
|
||||
|
||||
void panvk_per_arch(cmd_desc_state_bind_sets)(
|
||||
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,
|
||||
uint32_t set);
|
||||
|
||||
#if PAN_ARCH <= 7
|
||||
void panvk_per_arch(cmd_prepare_dyn_ssbos)(
|
||||
struct pan_pool *desc_pool, const struct panvk_descriptor_state *desc_state,
|
||||
|
||||
@@ -24,10 +24,9 @@
|
||||
#include "vk_command_buffer.h"
|
||||
#include "vk_command_pool.h"
|
||||
|
||||
void
|
||||
panvk_per_arch(cmd_desc_state_bind_sets)(
|
||||
struct panvk_descriptor_state *desc_state,
|
||||
const VkBindDescriptorSetsInfoKHR *info)
|
||||
static void
|
||||
cmd_desc_state_bind_sets(struct panvk_descriptor_state *desc_state,
|
||||
const VkBindDescriptorSetsInfoKHR *info)
|
||||
{
|
||||
unsigned dynoffset_idx = 0;
|
||||
for (unsigned i = 0; i < info->descriptorSetCount; ++i) {
|
||||
@@ -62,10 +61,10 @@ panvk_per_arch(cmd_desc_state_bind_sets)(
|
||||
assert(dynoffset_idx == info->dynamicOffsetCount);
|
||||
}
|
||||
|
||||
struct panvk_descriptor_set *
|
||||
panvk_per_arch(cmd_push_descriptors)(struct vk_command_buffer *vk_cmdbuf,
|
||||
struct panvk_descriptor_state *desc_state,
|
||||
uint32_t set_idx)
|
||||
static struct panvk_descriptor_set *
|
||||
cmd_get_push_desc_set(struct vk_command_buffer *vk_cmdbuf,
|
||||
struct panvk_descriptor_state *desc_state,
|
||||
uint32_t set_idx)
|
||||
{
|
||||
struct panvk_cmd_buffer *cmdbuf =
|
||||
container_of(vk_cmdbuf, struct panvk_cmd_buffer, vk);
|
||||
@@ -311,3 +310,116 @@ panvk_per_arch(cmd_prepare_push_descs)(struct pan_pool *desc_pool,
|
||||
push_set->desc_count * PANVK_DESCRIPTOR_SIZE, PANVK_DESCRIPTOR_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
panvk_per_arch(CmdBindDescriptorSets2KHR)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const VkBindDescriptorSetsInfoKHR *pBindDescriptorSetsInfo)
|
||||
{
|
||||
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
|
||||
|
||||
/* TODO: Invalidate only if the shader tables are disturbed */
|
||||
if (pBindDescriptorSetsInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) {
|
||||
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));
|
||||
}
|
||||
|
||||
if (pBindDescriptorSetsInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) {
|
||||
cmd_desc_state_bind_sets(&cmdbuf->state.compute.desc_state,
|
||||
pBindDescriptorSetsInfo);
|
||||
|
||||
memset(&cmdbuf->state.compute.cs.desc, 0,
|
||||
sizeof(cmdbuf->state.compute.cs.desc));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
push_desc_set_write(struct panvk_cmd_buffer *cmd,
|
||||
struct panvk_descriptor_state *desc,
|
||||
const VkPushDescriptorSetInfoKHR *info)
|
||||
{
|
||||
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[info->set]);
|
||||
|
||||
struct panvk_descriptor_set *push_set =
|
||||
cmd_get_push_desc_set(&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 < 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) {
|
||||
push_desc_set_write(cmdbuf, &cmdbuf->state.gfx.desc_state,
|
||||
pPushDescriptorSetInfo);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
if (pPushDescriptorSetInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) {
|
||||
push_desc_set_write(cmdbuf, &cmdbuf->state.compute.desc_state,
|
||||
pPushDescriptorSetInfo);
|
||||
|
||||
memset(&cmdbuf->state.compute.cs.desc, 0,
|
||||
sizeof(cmdbuf->state.compute.cs.desc));
|
||||
}
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
panvk_per_arch(CmdPushDescriptorSetWithTemplate2KHR)(
|
||||
VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfoKHR
|
||||
*pPushDescriptorSetWithTemplateInfo)
|
||||
{
|
||||
VK_FROM_HANDLE(vk_descriptor_update_template, template,
|
||||
pPushDescriptorSetWithTemplateInfo->descriptorUpdateTemplate);
|
||||
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
|
||||
VK_FROM_HANDLE(vk_pipeline_layout, playout,
|
||||
pPushDescriptorSetWithTemplateInfo->layout);
|
||||
const uint32_t set = pPushDescriptorSetWithTemplateInfo->set;
|
||||
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, template->bind_point);
|
||||
struct panvk_descriptor_set *push_set =
|
||||
cmd_get_push_desc_set(&cmdbuf->vk, desc_state, set);
|
||||
if (!push_set)
|
||||
return;
|
||||
|
||||
push_set->layout = set_layout;
|
||||
push_set->desc_count = set_layout->desc_count;
|
||||
|
||||
panvk_per_arch(descriptor_set_write_template)(
|
||||
push_set, template, pPushDescriptorSetWithTemplateInfo->pData, true);
|
||||
|
||||
push_set->descs.dev = 0;
|
||||
push_set->layout = NULL;
|
||||
|
||||
if (template->bind_point == 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 {
|
||||
memset(&cmdbuf->state.compute.cs.desc, 0,
|
||||
sizeof(cmdbuf->state.compute.cs.desc));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user