}
}
-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
)
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,
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);
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);
}
}
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;
}
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++) {
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);
}
}
ENQUEUE_CMD(CmdSetStencilCompareMask)
ENQUEUE_CMD(CmdSetStencilWriteMask)
ENQUEUE_CMD(CmdSetStencilReference)
-// ENQUEUE_CMD(CmdBindDescriptorSets)
+ ENQUEUE_CMD(CmdBindDescriptorSets)
ENQUEUE_CMD(CmdBindIndexBuffer)
ENQUEUE_CMD(CmdBindVertexBuffers)
ENQUEUE_CMD(CmdBindVertexBuffers2)