bug-14258: Make descriptor pools and command pools more consistent
diff --git a/icd/intel/cmd.c b/icd/intel/cmd.c
index 46dd12b..6258fbc 100644
--- a/icd/intel/cmd.c
+++ b/icd/intel/cmd.c
@@ -259,7 +259,7 @@
 }
 
 VkResult intel_cmd_create(struct intel_dev *dev,
-                            const VkCmdBufferCreateInfo *info,
+                            const VkCmdBufferAllocInfo *info,
                             struct intel_cmd **cmd_ret)
 {
     int pipeline_select;
@@ -495,24 +495,50 @@
     return VK_SUCCESS;
 }
 
-ICD_EXPORT VkResult VKAPI vkCreateCommandBuffer(
-    VkDevice                                  device,
-    const VkCmdBufferCreateInfo*              pCreateInfo,
-    VkCmdBuffer*                              pCmdBuffer)
+void intel_free_cmd_buffers(
+    struct intel_cmd_pool              *cmd_pool,
+    uint32_t                            count,
+    const VkCmdBuffer                  *cmd_bufs)
 {
-    struct intel_dev *dev = intel_dev(device);
+    for (uint32_t i = 0; i < count; i++) {
+        struct intel_obj *obj = intel_obj((uint64_t)cmd_bufs[i]);
 
-    return intel_cmd_create(dev, pCreateInfo,
-            (struct intel_cmd **) pCmdBuffer);
+        obj->destroy(obj);
+    }
 }
 
-ICD_EXPORT void VKAPI vkDestroyCommandBuffer(
-    VkDevice                                device,
-    VkCmdBuffer                             cmdBuffer)
+ICD_EXPORT VkResult VKAPI vkAllocCommandBuffers(
+    VkDevice                            device,
+    const VkCmdBufferAllocInfo*         pAllocInfo,
+    VkCmdBuffer*                        pCmdBuffers)
 {
-    struct intel_obj *obj = intel_obj((uint64_t)cmdBuffer);
+    struct intel_dev *dev = intel_dev(device);
+    struct intel_cmd_pool *pool = intel_cmd_pool(pAllocInfo->cmdPool);
+    uint32_t num_allocated = 0;
+    VkResult res;
 
-    obj->destroy(obj);
+    for (uint32_t i = 0; i < pAllocInfo->count; i++) {
+        res = intel_cmd_create(dev, pAllocInfo,
+            (struct intel_cmd **) &pCmdBuffers[i]);
+        if (res != VK_SUCCESS) {
+            intel_free_cmd_buffers(pool,
+                                   num_allocated,
+                                   pCmdBuffers);
+            return res;
+        }
+        num_allocated++;
+    }
+
+    return VK_SUCCESS;
+}
+
+ICD_EXPORT void VKAPI vkFreeCommandBuffers(
+    VkDevice                            device,
+    VkCmdPool                           cmdPool,
+    uint32_t                            count,
+    const VkCmdBuffer*                  pCmdBuffers)
+{
+    intel_free_cmd_buffers(intel_cmd_pool(cmdPool), count, pCmdBuffers);
 }
 
 ICD_EXPORT VkResult VKAPI vkBeginCommandBuffer(