return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
VkResult result =
- vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, level);
+ vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, NULL, level);
if (result != VK_SUCCESS) {
vk_free(&cmd_buffer->pool->vk.alloc, cmd_buffer);
return result;
result = radv_reset_cmd_buffer(cmd_buffer);
vk_command_buffer_finish(&cmd_buffer->vk);
VkResult init_result =
- vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, pAllocateInfo->level);
+ vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, NULL, pAllocateInfo->level);
if (init_result != VK_SUCCESS)
result = init_result;
static void cmd_buffer_destroy(struct vk_command_buffer *cmd_buffer);
+static const struct vk_command_buffer_ops cmd_buffer_ops = {
+ .destroy = cmd_buffer_destroy,
+};
+
static VkResult
cmd_buffer_create(struct v3dv_device *device,
struct vk_command_pool *pool,
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
VkResult result;
- result = vk_command_buffer_init(pool, &cmd_buffer->vk, level);
+ result = vk_command_buffer_init(pool, &cmd_buffer->vk,
+ &cmd_buffer_ops, level);
if (result != VK_SUCCESS) {
vk_free(&pool->alloc, cmd_buffer);
return result;
}
- cmd_buffer->vk.destroy = cmd_buffer_destroy;
cmd_buffer_init(cmd_buffer, device);
*pCommandBuffer = v3dv_cmd_buffer_to_handle(cmd_buffer);
if (cmd_buffer == NULL)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
- VkResult result = vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, level);
+ VkResult result = vk_command_buffer_init(&pool->vk, &cmd_buffer->vk,
+ NULL, level);
if (result != VK_SUCCESS) {
vk_free2(&device->vk.alloc, NULL, cmd_buffer);
return result;
result = tu_reset_cmd_buffer(cmd_buffer);
vk_command_buffer_finish(&cmd_buffer->vk);
VkResult init_result =
- vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, pAllocateInfo->level);
+ vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, NULL,
+ pAllocateInfo->level);
if (init_result != VK_SUCCESS)
result = init_result;
if (cmd_buffer == NULL)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
- VkResult result = vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, level);
+ VkResult result = vk_command_buffer_init(&pool->vk, &cmd_buffer->vk,
+ NULL, level);
if (result != VK_SUCCESS) {
vk_free(&pool->vk.alloc, cmd_buffer);
return result;
result = lvp_reset_cmd_buffer(cmd_buffer);
vk_command_buffer_finish(&cmd_buffer->vk);
VkResult init_result =
- vk_command_buffer_init(&pool->vk, &cmd_buffer->vk,
+ vk_command_buffer_init(&pool->vk, &cmd_buffer->vk, NULL,
pAllocateInfo->level);
if (init_result != VK_SUCCESS)
result = init_result;
vk_free(&cmd_buffer->vk.pool->alloc, cmd_buffer);
}
+static const struct vk_command_buffer_ops cmd_buffer_ops = {
+ .destroy = pvr_cmd_buffer_destroy,
+};
+
static VkResult pvr_cmd_buffer_create(struct pvr_device *device,
struct vk_command_pool *pool,
VkCommandBufferLevel level,
if (!cmd_buffer)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
- result = vk_command_buffer_init(pool, &cmd_buffer->vk, level);
+ result = vk_command_buffer_init(pool, &cmd_buffer->vk,
+ &cmd_buffer_ops, level);
if (result != VK_SUCCESS) {
vk_free(&pool->alloc, cmd_buffer);
return result;
}
- cmd_buffer->vk.destroy = pvr_cmd_buffer_destroy;
cmd_buffer->device = device;
util_dynarray_init(&cmd_buffer->depth_bias_array, NULL);
static void anv_cmd_buffer_destroy(struct vk_command_buffer *vk_cmd_buffer);
+static const struct vk_command_buffer_ops cmd_buffer_ops = {
+ .destroy = anv_cmd_buffer_destroy,
+};
+
static VkResult anv_create_cmd_buffer(
struct anv_device * device,
struct vk_command_pool * pool,
if (cmd_buffer == NULL)
return vk_error(pool, VK_ERROR_OUT_OF_HOST_MEMORY);
- result = vk_command_buffer_init(pool, &cmd_buffer->vk, level);
+ result = vk_command_buffer_init(pool, &cmd_buffer->vk,
+ &cmd_buffer_ops, level);
if (result != VK_SUCCESS)
goto fail_alloc;
- cmd_buffer->vk.destroy = anv_cmd_buffer_destroy;
cmd_buffer->vk.dynamic_graphics_state.ms.sample_locations =
&cmd_buffer->state.gfx.sample_locations;
return memcmp(a, b, sizeof(struct dzn_cmd_buffer_dsv_key)) == 0;
}
+static const struct vk_command_buffer_ops cmd_buffer_ops = {
+ .destroy = dzn_cmd_buffer_destroy,
+};
+
static VkResult
dzn_cmd_buffer_create(const VkCommandBufferAllocateInfo *info,
VkCommandBuffer *out)
return vk_error(pool->base.device, VK_ERROR_OUT_OF_HOST_MEMORY);
VkResult result =
- vk_command_buffer_init(pool, &cmdbuf->vk, info->level);
+ vk_command_buffer_init(pool, &cmdbuf->vk, &cmd_buffer_ops, info->level);
if (result != VK_SUCCESS) {
vk_free(&pool->alloc, cmdbuf);
return result;
goto out;
}
- cmdbuf->vk.destroy = dzn_cmd_buffer_destroy;
-
if (FAILED(ID3D12Device1_CreateCommandAllocator(device->dev, type,
&IID_ID3D12CommandAllocator,
(void **)&cmdbuf->cmdalloc))) {
if (!cmdbuf)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
- VkResult result = vk_command_buffer_init(&pool->vk, &cmdbuf->vk, level);
+ VkResult result = vk_command_buffer_init(&pool->vk, &cmdbuf->vk,
+ NULL, level);
if (result != VK_SUCCESS) {
vk_free(&device->vk.alloc, cmdbuf);
return result;
list_addtail(&cmdbuf->pool_link, &pool->active_cmd_buffers);
vk_command_buffer_finish(&cmdbuf->vk);
- result = vk_command_buffer_init(&pool->vk, &cmdbuf->vk, pAllocateInfo->level);
+ result = vk_command_buffer_init(&pool->vk, &cmdbuf->vk, NULL,
+ pAllocateInfo->level);
} else {
result = panvk_create_cmdbuf(device, pool, pAllocateInfo->level, &cmdbuf);
}
VkResult
vk_command_buffer_init(struct vk_command_pool *pool,
struct vk_command_buffer *command_buffer,
+ const struct vk_command_buffer_ops *ops,
VkCommandBufferLevel level)
{
memset(command_buffer, 0, sizeof(*command_buffer));
command_buffer->pool = pool;
command_buffer->level = level;
+ command_buffer->ops = ops;
vk_dynamic_graphics_state_init(&command_buffer->dynamic_graphics_state);
command_buffer->record_result = VK_SUCCESS;
vk_cmd_queue_init(&command_buffer->cmd_queue, &pool->alloc);
VkClearValue clear_value;
};
+struct vk_command_buffer_ops {
+ /** Destroys the command buffer
+ *
+ * Used by the common command pool implementation. This function MUST
+ * call `vk_command_buffer_finish()`.
+ */
+ void (*destroy)(struct vk_command_buffer *);
+};
+
struct vk_command_buffer {
struct vk_object_base base;
/** VkCommandBufferAllocateInfo::level */
VkCommandBufferLevel level;
+ const struct vk_command_buffer_ops *ops;
+
struct vk_dynamic_graphics_state dynamic_graphics_state;
/** Command buffer recording error state. */
/** Link in vk_command_pool::command_buffers if pool != NULL */
struct list_head pool_link;
- /** Destroys the command buffer
- *
- * Used by the common command pool implementation. This function MUST
- * call vk_command_buffer_finish().
- */
- void (*destroy)(struct vk_command_buffer *);
-
/** Command list for emulated secondary command buffers */
struct vk_cmd_queue cmd_queue;
VkResult MUST_CHECK
vk_command_buffer_init(struct vk_command_pool *pool,
struct vk_command_buffer *command_buffer,
+ const struct vk_command_buffer_ops *ops,
VkCommandBufferLevel level);
void
{
list_for_each_entry_safe(struct vk_command_buffer, cmd_buffer,
&pool->command_buffers, pool_link) {
- cmd_buffer->destroy(cmd_buffer);
+ cmd_buffer->ops->destroy(cmd_buffer);
}
assert(list_is_empty(&pool->command_buffers));
if (cmd_buffer == NULL)
continue;
- cmd_buffer->destroy(cmd_buffer);
+ cmd_buffer->ops->destroy(cmd_buffer);
}
}