lavapipe: Use the common vk_enqueue_CmdBindDescriptorSets

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15329>
This commit is contained in:
Jason Ekstrand 2022-03-10 11:02:08 -06:00 committed by Marge Bot
parent ac58e93633
commit f7175bf416
3 changed files with 27 additions and 49 deletions

View File

@ -344,48 +344,6 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdPushDescriptorSetWithTemplateKHR(
}
}
VKAPI_ATTR void VKAPI_CALL lvp_CmdBindDescriptorSets(
VkCommandBuffer commandBuffer,
VkPipelineBindPoint pipelineBindPoint,
VkPipelineLayout _layout,
uint32_t firstSet,
uint32_t descriptorSetCount,
const VkDescriptorSet* pDescriptorSets,
uint32_t dynamicOffsetCount,
const uint32_t* pDynamicOffsets)
{
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
LVP_FROM_HANDLE(lvp_pipeline_layout, layout, _layout);
struct vk_cmd_queue_entry *cmd = vk_zalloc(cmd_buffer->vk.cmd_queue.alloc,
sizeof(*cmd), 8,
VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
if (!cmd)
return;
cmd->type = VK_CMD_BIND_DESCRIPTOR_SETS;
list_addtail(&cmd->cmd_link, &cmd_buffer->vk.cmd_queue.cmds);
/* _layout could have been destroyed by when this command executes */
struct lvp_descriptor_set_layout **set_layout = vk_zalloc(cmd_buffer->vk.cmd_queue.alloc, sizeof(*set_layout) * layout->num_sets, 8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
cmd->driver_data = set_layout;
for (unsigned i = 0; i < layout->num_sets; i++)
set_layout[i] = layout->set[i].layout;
cmd->u.bind_descriptor_sets.pipeline_bind_point = pipelineBindPoint;
cmd->u.bind_descriptor_sets.first_set = firstSet;
cmd->u.bind_descriptor_sets.descriptor_set_count = descriptorSetCount;
if (pDescriptorSets) {
cmd->u.bind_descriptor_sets.descriptor_sets = vk_zalloc(cmd_buffer->vk.cmd_queue.alloc, sizeof(*cmd->u.bind_descriptor_sets.descriptor_sets) * descriptorSetCount, 8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
memcpy(( VkDescriptorSet* )cmd->u.bind_descriptor_sets.descriptor_sets, pDescriptorSets, sizeof(*cmd->u.bind_descriptor_sets.descriptor_sets) * descriptorSetCount);
}
cmd->u.bind_descriptor_sets.dynamic_offset_count = dynamicOffsetCount;
if (pDynamicOffsets) {
cmd->u.bind_descriptor_sets.dynamic_offsets = vk_zalloc(cmd_buffer->vk.cmd_queue.alloc, sizeof(*cmd->u.bind_descriptor_sets.dynamic_offsets) * dynamicOffsetCount, 8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
memcpy(( uint32_t* )cmd->u.bind_descriptor_sets.dynamic_offsets, pDynamicOffsets, sizeof(*cmd->u.bind_descriptor_sets.dynamic_offsets) * dynamicOffsetCount);
}
}
VKAPI_ATTR void VKAPI_CALL lvp_CmdBeginRendering(VkCommandBuffer commandBuffer,
const VkRenderingInfoKHR* pRenderingInfo
)

View File

@ -1447,6 +1447,23 @@ lvp_queue_finish(struct lvp_queue *queue)
vk_queue_finish(&queue->vk);
}
static void
ref_pipeline_layout(struct vk_device *vk_device, VkPipelineLayout _layout)
{
LVP_FROM_HANDLE(lvp_pipeline_layout, layout, _layout);
lvp_pipeline_layout_ref(layout);
}
static void
unref_pipeline_layout(struct vk_device *vk_device, VkPipelineLayout _layout)
{
struct lvp_device *device = container_of(vk_device, struct lvp_device, vk);
LVP_FROM_HANDLE(lvp_pipeline_layout, layout, _layout);
lvp_pipeline_layout_unref(device, layout);
}
VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateDevice(
VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
@ -1488,6 +1505,9 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateDevice(
device->instance = (struct lvp_instance *)physical_device->vk.instance;
device->physical_device = physical_device;
device->vk.ref_pipeline_layout = ref_pipeline_layout;
device->vk.unref_pipeline_layout = unref_pipeline_layout;
device->pscreen = physical_device->pscreen;
assert(pCreateInfo->queueCreateInfoCount == 1);

View File

@ -1292,18 +1292,18 @@ static void handle_compute_descriptor_sets(struct vk_cmd_queue_entry *cmd,
struct rendering_state *state)
{
struct vk_cmd_bind_descriptor_sets *bds = &cmd->u.bind_descriptor_sets;
struct lvp_descriptor_set_layout **set_layout = cmd->driver_data;
LVP_FROM_HANDLE(lvp_pipeline_layout, layout, bds->layout);
int i;
for (i = 0; i < bds->first_set; i++) {
increment_dyn_info(dyn_info, set_layout[i], false);
increment_dyn_info(dyn_info, layout->set[i].layout, false);
}
for (i = 0; i < bds->descriptor_set_count; i++) {
const struct lvp_descriptor_set *set = lvp_descriptor_set_from_handle(bds->descriptor_sets[i]);
if (set->layout->shader_stages & VK_SHADER_STAGE_COMPUTE_BIT)
handle_set_stage(state, dyn_info, set, MESA_SHADER_COMPUTE, PIPE_SHADER_COMPUTE);
increment_dyn_info(dyn_info, set_layout[bds->first_set + i], true);
increment_dyn_info(dyn_info, layout->set[bds->first_set + i].layout, true);
}
}
@ -1311,7 +1311,7 @@ static void handle_descriptor_sets(struct vk_cmd_queue_entry *cmd,
struct rendering_state *state)
{
struct vk_cmd_bind_descriptor_sets *bds = &cmd->u.bind_descriptor_sets;
struct lvp_descriptor_set_layout **set_layout = cmd->driver_data;
LVP_FROM_HANDLE(lvp_pipeline_layout, layout, bds->layout);
int i;
struct dyn_info dyn_info;
@ -1326,7 +1326,7 @@ static void handle_descriptor_sets(struct vk_cmd_queue_entry *cmd,
}
for (i = 0; i < bds->first_set; i++) {
increment_dyn_info(&dyn_info, set_layout[i], false);
increment_dyn_info(&dyn_info, layout->set[i].layout, false);
}
for (i = 0; i < bds->descriptor_set_count; i++) {
@ -1353,7 +1353,7 @@ static void handle_descriptor_sets(struct vk_cmd_queue_entry *cmd,
if (set->layout->shader_stages & VK_SHADER_STAGE_FRAGMENT_BIT)
handle_set_stage(state, &dyn_info, set, MESA_SHADER_FRAGMENT, PIPE_SHADER_FRAGMENT);
increment_dyn_info(&dyn_info, set_layout[bds->first_set + i], true);
increment_dyn_info(&dyn_info, layout->set[bds->first_set + i].layout, true);
}
}
@ -3872,7 +3872,7 @@ void lvp_add_enqueue_cmd_entrypoints(struct vk_device_dispatch_table *disp)
ENQUEUE_CMD(CmdSetStencilCompareMask)
ENQUEUE_CMD(CmdSetStencilWriteMask)
ENQUEUE_CMD(CmdSetStencilReference)
// ENQUEUE_CMD(CmdBindDescriptorSets)
ENQUEUE_CMD(CmdBindDescriptorSets)
ENQUEUE_CMD(CmdBindIndexBuffer)
ENQUEUE_CMD(CmdBindVertexBuffers)
ENQUEUE_CMD(CmdBindVertexBuffers2)