vk/0.210.0: We now allocate command buffers; not create them
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 2 Dec 2015 11:48:58 +0000 (03:48 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 3 Dec 2015 21:43:53 +0000 (13:43 -0800)
include/vulkan/vulkan.h
src/vulkan/anv_cmd_buffer.c
src/vulkan/anv_dump.c

index 7f62b391972752ef7e5b96a7761afbc74196d759..9e73888e6b3aeb34f11107d3abfa07649ec1b0d0 100644 (file)
@@ -140,7 +140,7 @@ typedef enum VkStructureType {
     VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 6,
     VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 7,
     VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 8,
-    VK_STRUCTURE_TYPE_COMMAND_BUFFER_CREATE_INFO = 9,
+    VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = 9,
     VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 10,
     VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 11,
     VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 12,
@@ -1997,13 +1997,13 @@ typedef struct VkCommandPoolCreateInfo {
     uint32_t                                    queueFamilyIndex;
 } VkCommandPoolCreateInfo;
 
-typedef struct {
+typedef struct VkCommandBufferAllocateInfo {
     VkStructureType                             sType;
     const void*                                 pNext;
     VkCommandPool                               commandPool;
     VkCommandBufferLevel                        level;
-    VkCommandBufferCreateFlags                  flags;
-} VkCommandBufferCreateInfo;
+    uint32_t                                    bufferCount;
+} VkCommandBufferAllocateInfo;
 
 typedef struct VkCommandBufferBeginInfo {
     VkStructureType                             sType;
@@ -2243,8 +2243,8 @@ typedef void (VKAPI_PTR *PFN_vkGetRenderAreaGranularity)(VkDevice device, VkRend
 typedef VkResult (VKAPI_PTR *PFN_vkCreateCommandPool)(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool);
 typedef void (VKAPI_PTR *PFN_vkDestroyCommandPool)(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator);
 typedef VkResult (VKAPI_PTR *PFN_vkResetCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags);
-typedef VkResult (VKAPI_PTR *PFN_vkCreateCommandBuffer)(VkDevice device, const VkCommandBufferCreateInfo* pCreateInfo, VkCommandBuffer* pCommandBuffer);
-typedef void (VKAPI_PTR *PFN_vkDestroyCommandBuffer)(VkDevice device, VkCommandBuffer commandBuffer);
+typedef VkResult (VKAPI_PTR *PFN_vkAllocateCommandBuffers)(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers);
+typedef void (VKAPI_PTR *PFN_vkFreeCommandBuffers)(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers);
 typedef VkResult (VKAPI_PTR *PFN_vkBeginCommandBuffer)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo);
 typedef VkResult (VKAPI_PTR *PFN_vkEndCommandBuffer)(VkCommandBuffer commandBuffer);
 typedef VkResult (VKAPI_PTR *PFN_vkResetCommandBuffer)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags);
@@ -2782,14 +2782,16 @@ VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(
     VkCommandPool                               commandPool,
     VkCommandPoolResetFlags                     flags);
 
-VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandBuffer(
+VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(
     VkDevice                                    device,
-    const VkCommandBufferCreateInfo*            pCreateInfo,
-    VkCommandBuffer*                            pCommandBuffer);
+    const VkCommandBufferAllocateInfo*          pAllocateInfo,
+    VkCommandBuffer*                            pCommandBuffers);
 
-VKAPI_ATTR void VKAPI_CALL vkDestroyCommandBuffer(
+VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(
     VkDevice                                    device,
-    VkCommandBuffer                             commandBuffer);
+    VkCommandPool                               commandPool,
+    uint32_t                                    commandBufferCount,
+    const VkCommandBuffer*                      pCommandBuffers);
 
 VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(
     VkCommandBuffer                             commandBuffer,
index 48711b6032b5ccf6d81c3cbde0a3a8fa720f5d27..125b078413b8d2ebd2b7193ff1dff28520effeb5 100644 (file)
@@ -154,13 +154,12 @@ anv_cmd_buffer_ensure_push_constants_size(struct anv_cmd_buffer *cmd_buffer,
       (offsetof(struct anv_push_constants, field) + \
        sizeof(cmd_buffer->state.push_constants[0]->field)))
 
-VkResult anv_CreateCommandBuffer(
-    VkDevice                                    _device,
-    const VkCommandBufferCreateInfo*            pCreateInfo,
+static VkResult anv_create_cmd_buffer(
+    struct anv_device *                         device,
+    struct anv_cmd_pool *                       pool,
+    VkCommandBufferLevel                        level,
     VkCommandBuffer*                            pCommandBuffer)
 {
-   ANV_FROM_HANDLE(anv_device, device, _device);
-   ANV_FROM_HANDLE(anv_cmd_pool, pool, pCreateInfo->commandPool);
    struct anv_cmd_buffer *cmd_buffer;
    VkResult result;
 
@@ -182,7 +181,7 @@ VkResult anv_CreateCommandBuffer(
    anv_state_stream_init(&cmd_buffer->dynamic_state_stream,
                          &device->dynamic_state_block_pool);
 
-   cmd_buffer->level = pCreateInfo->level;
+   cmd_buffer->level = level;
    cmd_buffer->usage_flags = 0;
 
    anv_cmd_state_init(&cmd_buffer->state);
@@ -206,12 +205,34 @@ VkResult anv_CreateCommandBuffer(
    return result;
 }
 
-void anv_DestroyCommandBuffer(
+VkResult anv_AllocateCommandBuffers(
     VkDevice                                    _device,
-    VkCommandBuffer                             _cmd_buffer)
+    const VkCommandBufferAllocateInfo*          pAllocateInfo,
+    VkCommandBuffer*                            pCommandBuffers)
 {
-   ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, _cmd_buffer);
+   ANV_FROM_HANDLE(anv_device, device, _device);
+   ANV_FROM_HANDLE(anv_cmd_pool, pool, pAllocateInfo->commandPool);
 
+   VkResult result = VK_SUCCESS;
+   uint32_t i;
+
+   for (i = 0; i < pAllocateInfo->bufferCount; i++) {
+      result = anv_create_cmd_buffer(device, pool, pAllocateInfo->level,
+                                     &pCommandBuffers[i]);
+      if (result != VK_SUCCESS)
+         break;
+   }
+
+   if (result != VK_SUCCESS)
+      anv_FreeCommandBuffers(_device, pAllocateInfo->commandPool,
+                             i, pCommandBuffers);
+
+   return result;
+}
+
+static void
+anv_cmd_buffer_destroy(struct anv_cmd_buffer *cmd_buffer)
+{
    list_del(&cmd_buffer->pool_link);
 
    anv_cmd_buffer_fini_batch_bo_chain(cmd_buffer);
@@ -222,6 +243,19 @@ void anv_DestroyCommandBuffer(
    anv_free(&cmd_buffer->pool->alloc, cmd_buffer);
 }
 
+void anv_FreeCommandBuffers(
+    VkDevice                                    device,
+    VkCommandPool                               commandPool,
+    uint32_t                                    commandBufferCount,
+    const VkCommandBuffer*                      pCommandBuffers)
+{
+   for (uint32_t i = 0; i < commandBufferCount; i++) {
+      ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, pCommandBuffers[i]);
+
+      anv_cmd_buffer_destroy(cmd_buffer);
+   }
+}
+
 VkResult anv_ResetCommandBuffer(
     VkCommandBuffer                             commandBuffer,
     VkCommandBufferResetFlags                   flags)
@@ -939,7 +973,7 @@ VkResult anv_ResetCommandPool(
 
    list_for_each_entry_safe(struct anv_cmd_buffer, cmd_buffer,
                             &pool->cmd_buffers, pool_link) {
-      anv_DestroyCommandBuffer(device, anv_cmd_buffer_to_handle(cmd_buffer));
+      anv_cmd_buffer_destroy(cmd_buffer);
    }
 
    return VK_SUCCESS;
index 62ed4fb4861fe45f4fca6230ee3f0ec8a5e29907..4db7c2539e15bd130b95852447342072ac152f9b 100644 (file)
@@ -82,12 +82,12 @@ anv_dump_image_to_ppm(struct anv_device *device,
    assert(result == VK_SUCCESS);
 
    VkCommandBuffer cmd;
-   result = anv_CreateCommandBuffer(vk_device,
-      &(VkCommandBufferCreateInfo) {
-         .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_CREATE_INFO,
+   result = anv_AllocateCommandBuffers(vk_device,
+      &(VkCommandBufferAllocateInfo) {
+         .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
          .commandPool = commandPool,
          .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
-         .flags = 0,
+         .bufferCount = 1,
       }, &cmd);
    assert(result == VK_SUCCESS);