CLONE
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 29 Jul 2015 21:05:06 +0000 (14:05 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 30 Jul 2015 15:24:02 +0000 (08:24 -0700)
src/vulkan/anv_cmd_buffer.c

index a0a67af676cc40a5153f98c70ceacea143f84d37..5126f4a981cd0028cc4d3a6114e90ff3775cd2fa 100644 (file)
  * Functions related to anv_reloc_list
  *-----------------------------------------------------------------------*/
 
-VkResult
-anv_reloc_list_init(struct anv_reloc_list *list, struct anv_device *device)
+static VkResult
+anv_reloc_list_init_clone(struct anv_reloc_list *list,
+                          struct anv_device *device,
+                          const struct anv_reloc_list *other_list)
 {
-   list->num_relocs = 0;
-   list->array_length = 256;
+   if (other_list) {
+      list->num_relocs = other_list->num_relocs;
+      list->array_length = other_list->array_length;
+   } else {
+      list->num_relocs = 0;
+      list->array_length = 256;
+   }
+
    list->relocs =
       anv_device_alloc(device, list->array_length * sizeof(*list->relocs), 8,
                        VK_SYSTEM_ALLOC_TYPE_INTERNAL);
@@ -58,14 +66,27 @@ anv_reloc_list_init(struct anv_reloc_list *list, struct anv_device *device)
       anv_device_alloc(device, list->array_length * sizeof(*list->reloc_bos), 8,
                        VK_SYSTEM_ALLOC_TYPE_INTERNAL);
 
-   if (list->relocs == NULL) {
+   if (list->reloc_bos == NULL) {
       anv_device_free(device, list->relocs);
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
    }
 
+   if (other_list) {
+      memcpy(list->relocs, other_list->relocs,
+             list->array_length * sizeof(*list->relocs));
+      memcpy(list->reloc_bos, other_list->reloc_bos,
+             list->array_length * sizeof(*list->reloc_bos));
+   }
+
    return VK_SUCCESS;
 }
 
+VkResult
+anv_reloc_list_init(struct anv_reloc_list *list, struct anv_device *device)
+{
+   return anv_reloc_list_init_clone(list, device, NULL);
+}
+
 void
 anv_reloc_list_finish(struct anv_reloc_list *list, struct anv_device *device)
 {
@@ -236,6 +257,41 @@ anv_batch_bo_create(struct anv_device *device, struct anv_batch_bo **bbo_out)
    return result;
 }
 
+static VkResult
+anv_batch_bo_clone(struct anv_device *device,
+                   const struct anv_batch_bo *other_bbo,
+                   struct anv_batch_bo **bbo_out)
+{
+   VkResult result;
+
+   struct anv_batch_bo *bbo =
+      anv_device_alloc(device, sizeof(*bbo), 8, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
+   if (bbo == NULL)
+      return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
+
+   result = anv_bo_pool_alloc(&device->batch_bo_pool, &bbo->bo);
+   if (result != VK_SUCCESS)
+      goto fail_alloc;
+
+   result = anv_reloc_list_init_clone(&bbo->relocs, device, &other_bbo->relocs);
+   if (result != VK_SUCCESS)
+      goto fail_bo_alloc;
+
+   bbo->length = other_bbo->length;
+   memcpy(bbo->bo.map, other_bbo->bo.map, other_bbo->length);
+
+   *bbo_out = bbo;
+
+   return VK_SUCCESS;
+
+ fail_bo_alloc:
+   anv_bo_pool_free(&device->batch_bo_pool, &bbo->bo);
+ fail_alloc:
+   anv_device_free(device, bbo);
+
+   return result;
+}
+
 static void
 anv_batch_bo_start(struct anv_batch_bo *bbo, struct anv_batch *batch,
                    size_t batch_padding)