anv: intel: use anv_image's computed size for importing a BO
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Wed, 11 Oct 2017 16:24:37 +0000 (17:24 +0100)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Wed, 11 Oct 2017 21:29:55 +0000 (22:29 +0100)
Rather than relying on size = stride * height, we can rely on
anv_image's total size.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Acked-by: Daniel Stone <daniels@collabora.com>
src/intel/vulkan/anv_intel.c

index d4ef3beb7434bfdf5728a095ad89dd6f2e1ddcdc..9f8cd927345d2c12259d61e23d1c84e2ae725c7c 100644 (file)
@@ -49,17 +49,7 @@ VkResult anv_CreateDmaBufImageINTEL(
    if (mem == NULL)
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
 
-   uint64_t size = (uint64_t)pCreateInfo->strideInBytes * pCreateInfo->extent.height;
-
-   result = anv_bo_cache_import(device, &device->bo_cache,
-                                pCreateInfo->fd, size, &mem->bo);
-   if (result != VK_SUCCESS)
-      goto fail;
-
-   if (device->instance->physicalDevice.supports_48bit_addresses)
-      mem->bo->flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
-
-   anv_image_create(_device,
+   result = anv_image_create(_device,
       &(struct anv_image_create_info) {
          .isl_tiling_flags = ISL_TILING_X_BIT,
          .stride = pCreateInfo->strideInBytes,
@@ -78,8 +68,19 @@ VkResult anv_CreateDmaBufImageINTEL(
          .flags = 0,
       }},
       pAllocator, &image_h);
+   if (result != VK_SUCCESS)
+      goto fail;
 
    image = anv_image_from_handle(image_h);
+
+   result = anv_bo_cache_import(device, &device->bo_cache,
+                                pCreateInfo->fd, image->size, &mem->bo);
+   if (result != VK_SUCCESS)
+      goto fail_import;
+
+   if (device->instance->physicalDevice.supports_48bit_addresses)
+      mem->bo->flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
+
    image->planes[0].bo = mem->bo;
    image->planes[0].bo_offset = 0;
 
@@ -92,6 +93,9 @@ VkResult anv_CreateDmaBufImageINTEL(
 
    return VK_SUCCESS;
 
+ fail_import:
+   vk_free2(&device->alloc, pAllocator, image);
+
  fail:
    vk_free2(&device->alloc, pAllocator, mem);