Mesa (main): radv/winsys: Return vulkan errors for buffer creation.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jul 5 17:52:16 UTC 2021


Module: Mesa
Branch: main
Commit: 8025b4120f3870ebe964d199ced3e7c111cefd2b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8025b4120f3870ebe964d199ced3e7c111cefd2b

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Wed Apr 28 02:10:57 2021 +0200

radv/winsys: Return vulkan errors for buffer creation.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10570>

---

 src/amd/vulkan/radv_android.c                 |   7 +-
 src/amd/vulkan/radv_cmd_buffer.c              |  15 ++--
 src/amd/vulkan/radv_debug.c                   |  16 ++--
 src/amd/vulkan/radv_descriptor_set.c          |   8 +-
 src/amd/vulkan/radv_device.c                  | 111 +++++++++++++-------------
 src/amd/vulkan/radv_image.c                   |   8 +-
 src/amd/vulkan/radv_query.c                   |  10 +--
 src/amd/vulkan/radv_radeon_winsys.h           |  14 ++--
 src/amd/vulkan/radv_shader.c                  |   6 +-
 src/amd/vulkan/radv_sqtt.c                    |   8 +-
 src/amd/vulkan/si_cmd_buffer.c                |   6 +-
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c |  94 ++++++++++++++++------
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c |  29 ++++---
 src/amd/vulkan/winsys/null/radv_null_bo.c     |  14 ++--
 14 files changed, 199 insertions(+), 147 deletions(-)

diff --git a/src/amd/vulkan/radv_android.c b/src/amd/vulkan/radv_android.c
index 3864bf15efa..066cae971e6 100644
--- a/src/amd/vulkan/radv_android.c
+++ b/src/amd/vulkan/radv_android.c
@@ -747,9 +747,10 @@ radv_import_ahb_memory(struct radv_device *device, struct radv_device_memory *me
       return VK_ERROR_INVALID_EXTERNAL_HANDLE;
 
    uint64_t alloc_size = 0;
-   mem->bo = device->ws->buffer_from_fd(device->ws, dma_buf, priority, &alloc_size);
-   if (!mem->bo)
-      return VK_ERROR_OUT_OF_HOST_MEMORY;
+   VkResult result =
+      device->ws->buffer_from_fd(device->ws, dma_buf, priority, &mem->bo, &alloc_size);
+   if (result != VK_SUCCESS)
+      return result;
 
    if (mem->image) {
       struct radeon_bo_metadata metadata;
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 276dd685154..11818b8c4de 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -511,20 +511,21 @@ static bool
 radv_cmd_buffer_resize_upload_buf(struct radv_cmd_buffer *cmd_buffer, uint64_t min_needed)
 {
    uint64_t new_size;
-   struct radeon_winsys_bo *bo;
+   struct radeon_winsys_bo *bo = NULL;
    struct radv_cmd_buffer_upload *upload;
    struct radv_device *device = cmd_buffer->device;
 
    new_size = MAX2(min_needed, 16 * 1024);
    new_size = MAX2(new_size, 2 * cmd_buffer->upload.size);
 
-   bo = device->ws->buffer_create(device->ws, new_size, 4096, device->ws->cs_domain(device->ws),
-                                  RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING |
-                                     RADEON_FLAG_32BIT | RADEON_FLAG_GTT_WC,
-                                  RADV_BO_PRIORITY_UPLOAD_BUFFER);
+   VkResult result =
+      device->ws->buffer_create(device->ws, new_size, 4096, device->ws->cs_domain(device->ws),
+                                RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING |
+                                   RADEON_FLAG_32BIT | RADEON_FLAG_GTT_WC,
+                                RADV_BO_PRIORITY_UPLOAD_BUFFER, &bo);
 
-   if (!bo) {
-      cmd_buffer->record_result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
+   if (result != VK_SUCCESS) {
+      cmd_buffer->record_result = result;
       return false;
    }
 
diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c
index ba3328ca101..d1c2ef0c9c8 100644
--- a/src/amd/vulkan/radv_debug.c
+++ b/src/amd/vulkan/radv_debug.c
@@ -67,11 +67,11 @@ radv_init_trace(struct radv_device *device)
    struct radeon_winsys *ws = device->ws;
    VkResult result;
 
-   device->trace_bo = ws->buffer_create(
+   result = ws->buffer_create(
       ws, TRACE_BO_SIZE, 8, RADEON_DOMAIN_VRAM,
       RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_ZERO_VRAM,
-      RADV_BO_PRIORITY_UPLOAD_BUFFER);
-   if (!device->trace_bo)
+      RADV_BO_PRIORITY_UPLOAD_BUFFER, &device->trace_bo);
+   if (result != VK_SUCCESS)
       return false;
 
    result = ws->buffer_make_resident(ws, device->trace_bo, true);
@@ -836,11 +836,11 @@ radv_trap_handler_init(struct radv_device *device)
    if (result != VK_SUCCESS)
       return false;
 
-   device->tma_bo = ws->buffer_create(ws, TMA_BO_SIZE, 256, RADEON_DOMAIN_VRAM,
-                                      RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING |
-                                         RADEON_FLAG_ZERO_VRAM | RADEON_FLAG_32BIT,
-                                      RADV_BO_PRIORITY_SCRATCH);
-   if (!device->tma_bo)
+   result = ws->buffer_create(ws, TMA_BO_SIZE, 256, RADEON_DOMAIN_VRAM,
+                              RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING |
+                                 RADEON_FLAG_ZERO_VRAM | RADEON_FLAG_32BIT,
+                              RADV_BO_PRIORITY_SCRATCH, &device->tma_bo);
+   if (result != VK_SUCCESS)
       return false;
 
    result = ws->buffer_make_resident(ws, device->tma_bo, true);
diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c
index 409145ed025..efe58fc1c25 100644
--- a/src/amd/vulkan/radv_descriptor_set.c
+++ b/src/amd/vulkan/radv_descriptor_set.c
@@ -801,13 +801,13 @@ radv_CreateDescriptorPool(VkDevice _device, const VkDescriptorPoolCreateInfo *pC
 
    if (bo_size) {
       if (!(pCreateInfo->flags & VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE)) {
-         pool->bo = device->ws->buffer_create(
+         VkResult result = device->ws->buffer_create(
             device->ws, bo_size, 32, RADEON_DOMAIN_VRAM,
             RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_READ_ONLY | RADEON_FLAG_32BIT,
-            RADV_BO_PRIORITY_DESCRIPTOR);
-         if (!pool->bo) {
+            RADV_BO_PRIORITY_DESCRIPTOR, &pool->bo);
+         if (result != VK_SUCCESS) {
             radv_destroy_descriptor_pool(device, pAllocator, pool);
-            return vk_error(device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+            return vk_error(device->instance, result);
          }
          pool->mapped_ptr = (uint8_t *)device->ws->buffer_map(pool->bo);
          if (!pool->mapped_ptr) {
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 2b3119e68b3..a6b2f0e4f10 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -2758,13 +2758,13 @@ radv_device_init_border_color(struct radv_device *device)
 {
    VkResult result;
 
-   device->border_color_data.bo = device->ws->buffer_create(
+   result = device->ws->buffer_create(
       device->ws, RADV_BORDER_COLOR_BUFFER_SIZE, 4096, RADEON_DOMAIN_VRAM,
       RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_READ_ONLY | RADEON_FLAG_NO_INTERPROCESS_SHARING,
-      RADV_BO_PRIORITY_SHADER);
+      RADV_BO_PRIORITY_SHADER, &device->border_color_data.bo);
 
-   if (device->border_color_data.bo == NULL)
-      return vk_error(device->physical_device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+   if (result != VK_SUCCESS)
+      return vk_error(device->physical_device->instance, result);
 
    result = device->ws->buffer_make_resident(device->ws, device->border_color_data.bo, true);
    if (result != VK_SUCCESS)
@@ -3766,6 +3766,7 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
    unsigned hs_offchip_param = 0;
    unsigned tess_offchip_ring_offset;
    uint32_t ring_bo_flags = RADEON_FLAG_NO_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING;
+   VkResult result = VK_SUCCESS;
    if (!queue->has_tess_rings) {
       if (needs_tess_rings)
          add_tess_rings = true;
@@ -3821,10 +3822,10 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
    uint32_t scratch_size = scratch_size_per_wave * scratch_waves;
    uint32_t queue_scratch_size = queue->scratch_size_per_wave * queue->scratch_waves;
    if (scratch_size > queue_scratch_size) {
-      scratch_bo =
+      result =
          queue->device->ws->buffer_create(queue->device->ws, scratch_size, 4096, RADEON_DOMAIN_VRAM,
-                                          ring_bo_flags, RADV_BO_PRIORITY_SCRATCH);
-      if (!scratch_bo)
+                                          ring_bo_flags, RADV_BO_PRIORITY_SCRATCH, &scratch_bo);
+      if (result != VK_SUCCESS)
          goto fail;
    } else
       scratch_bo = queue->scratch_bo;
@@ -3833,20 +3834,20 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
    uint32_t compute_queue_scratch_size =
       queue->compute_scratch_size_per_wave * queue->compute_scratch_waves;
    if (compute_scratch_size > compute_queue_scratch_size) {
-      compute_scratch_bo = queue->device->ws->buffer_create(queue->device->ws, compute_scratch_size,
-                                                            4096, RADEON_DOMAIN_VRAM, ring_bo_flags,
-                                                            RADV_BO_PRIORITY_SCRATCH);
-      if (!compute_scratch_bo)
+      result = queue->device->ws->buffer_create(queue->device->ws, compute_scratch_size, 4096,
+                                                RADEON_DOMAIN_VRAM, ring_bo_flags,
+                                                RADV_BO_PRIORITY_SCRATCH, &compute_scratch_bo);
+      if (result != VK_SUCCESS)
          goto fail;
 
    } else
       compute_scratch_bo = queue->compute_scratch_bo;
 
    if (esgs_ring_size > queue->esgs_ring_size) {
-      esgs_ring_bo = queue->device->ws->buffer_create(queue->device->ws, esgs_ring_size, 4096,
-                                                      RADEON_DOMAIN_VRAM, ring_bo_flags,
-                                                      RADV_BO_PRIORITY_SCRATCH);
-      if (!esgs_ring_bo)
+      result = queue->device->ws->buffer_create(queue->device->ws, esgs_ring_size, 4096,
+                                                RADEON_DOMAIN_VRAM, ring_bo_flags,
+                                                RADV_BO_PRIORITY_SCRATCH, &esgs_ring_bo);
+      if (result != VK_SUCCESS)
          goto fail;
    } else {
       esgs_ring_bo = queue->esgs_ring_bo;
@@ -3854,10 +3855,10 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
    }
 
    if (gsvs_ring_size > queue->gsvs_ring_size) {
-      gsvs_ring_bo = queue->device->ws->buffer_create(queue->device->ws, gsvs_ring_size, 4096,
-                                                      RADEON_DOMAIN_VRAM, ring_bo_flags,
-                                                      RADV_BO_PRIORITY_SCRATCH);
-      if (!gsvs_ring_bo)
+      result = queue->device->ws->buffer_create(queue->device->ws, gsvs_ring_size, 4096,
+                                                RADEON_DOMAIN_VRAM, ring_bo_flags,
+                                                RADV_BO_PRIORITY_SCRATCH, &gsvs_ring_bo);
+      if (result != VK_SUCCESS)
          goto fail;
    } else {
       gsvs_ring_bo = queue->gsvs_ring_bo;
@@ -3865,10 +3866,10 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
    }
 
    if (add_tess_rings) {
-      tess_rings_bo = queue->device->ws->buffer_create(
+      result = queue->device->ws->buffer_create(
          queue->device->ws, tess_offchip_ring_offset + tess_offchip_ring_size, 256,
-         RADEON_DOMAIN_VRAM, ring_bo_flags, RADV_BO_PRIORITY_SCRATCH);
-      if (!tess_rings_bo)
+         RADEON_DOMAIN_VRAM, ring_bo_flags, RADV_BO_PRIORITY_SCRATCH, &tess_rings_bo);
+      if (result != VK_SUCCESS)
          goto fail;
    } else {
       tess_rings_bo = queue->tess_rings_bo;
@@ -3880,9 +3881,9 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
       /* 4 streamout GDS counters.
        * We need 256B (64 dw) of GDS, otherwise streamout hangs.
        */
-      gds_bo = queue->device->ws->buffer_create(queue->device->ws, 256, 4, RADEON_DOMAIN_GDS,
-                                                ring_bo_flags, RADV_BO_PRIORITY_SCRATCH);
-      if (!gds_bo)
+      result = queue->device->ws->buffer_create(queue->device->ws, 256, 4, RADEON_DOMAIN_GDS,
+                                                ring_bo_flags, RADV_BO_PRIORITY_SCRATCH, &gds_bo);
+      if (result != VK_SUCCESS)
          goto fail;
    } else {
       gds_bo = queue->gds_bo;
@@ -3891,9 +3892,10 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
    if (add_gds_oa) {
       assert(queue->device->physical_device->rad_info.chip_class >= GFX10);
 
-      gds_oa_bo = queue->device->ws->buffer_create(queue->device->ws, 4, 1, RADEON_DOMAIN_OA,
-                                                   ring_bo_flags, RADV_BO_PRIORITY_SCRATCH);
-      if (!gds_oa_bo)
+      result =
+         queue->device->ws->buffer_create(queue->device->ws, 4, 1, RADEON_DOMAIN_OA, ring_bo_flags,
+                                          RADV_BO_PRIORITY_SCRATCH, &gds_oa_bo);
+      if (result != VK_SUCCESS)
          goto fail;
    } else {
       gds_oa_bo = queue->gds_oa_bo;
@@ -3910,11 +3912,11 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
       } else if (scratch_bo)
          size = 8; /* 2 dword */
 
-      descriptor_bo = queue->device->ws->buffer_create(
+      result = queue->device->ws->buffer_create(
          queue->device->ws, size, 4096, RADEON_DOMAIN_VRAM,
          RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_READ_ONLY,
-         RADV_BO_PRIORITY_DESCRIPTOR);
-      if (!descriptor_bo)
+         RADV_BO_PRIORITY_DESCRIPTOR, &descriptor_bo);
+      if (result != VK_SUCCESS)
          goto fail;
    } else
       descriptor_bo = queue->descriptor_bo;
@@ -3944,8 +3946,10 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
       struct radeon_cmdbuf *cs = NULL;
       cs = queue->device->ws->cs_create(queue->device->ws,
                                         queue->queue_family_index ? RING_COMPUTE : RING_GFX);
-      if (!cs)
+      if (!cs) {
+         result = VK_ERROR_OUT_OF_HOST_MEMORY;
          goto fail;
+      }
 
       dest_cs[i] = cs;
 
@@ -4006,7 +4010,8 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
                                 &sqtt_flush_bits, 0);
       }
 
-      if (queue->device->ws->cs_finalize(cs) != VK_SUCCESS)
+      result = queue->device->ws->cs_finalize(cs);
+      if (result != VK_SUCCESS)
          goto fail;
    }
 
@@ -4105,7 +4110,7 @@ fail:
    if (gds_oa_bo && gds_oa_bo != queue->gds_oa_bo)
       queue->device->ws->buffer_destroy(queue->device->ws, gds_oa_bo);
 
-   return vk_error(queue->device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+   return vk_error(queue->device->instance, result);
 }
 
 static VkResult
@@ -5312,9 +5317,8 @@ radv_alloc_memory(struct radv_device *device, const VkMemoryAllocateInfo *pAlloc
    } else if (import_info) {
       assert(import_info->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
              import_info->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
-      mem->bo = device->ws->buffer_from_fd(device->ws, import_info->fd, priority, NULL);
-      if (!mem->bo) {
-         result = VK_ERROR_INVALID_EXTERNAL_HANDLE;
+      result = device->ws->buffer_from_fd(device->ws, import_info->fd, priority, &mem->bo, NULL);
+      if (result != VK_SUCCESS) {
          goto fail;
       } else {
          close(import_info->fd);
@@ -5340,10 +5344,9 @@ radv_alloc_memory(struct radv_device *device, const VkMemoryAllocateInfo *pAlloc
       }
    } else if (host_ptr_info) {
       assert(host_ptr_info->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT);
-      mem->bo = device->ws->buffer_from_ptr(device->ws, host_ptr_info->pHostPointer,
-                                            pAllocateInfo->allocationSize, priority);
-      if (!mem->bo) {
-         result = VK_ERROR_INVALID_EXTERNAL_HANDLE;
+      result = device->ws->buffer_from_ptr(device->ws, host_ptr_info->pHostPointer,
+                                           pAllocateInfo->allocationSize, priority, &mem->bo);
+      if (result != VK_SUCCESS) {
          goto fail;
       } else {
          mem->user_ptr = host_ptr_info->pHostPointer;
@@ -5379,17 +5382,16 @@ radv_alloc_memory(struct radv_device *device, const VkMemoryAllocateInfo *pAlloc
          mtx_unlock(&device->overallocation_mutex);
       }
 
-      mem->bo = device->ws->buffer_create(device->ws, alloc_size,
-                                          device->physical_device->rad_info.max_alignment, domain,
-                                          flags, priority);
+      result = device->ws->buffer_create(device->ws, alloc_size,
+                                         device->physical_device->rad_info.max_alignment, domain,
+                                         flags, priority, &mem->bo);
 
-      if (!mem->bo) {
+      if (result != VK_SUCCESS) {
          if (device->overallocation_disallowed) {
             mtx_lock(&device->overallocation_mutex);
             device->allocated_memory_size[heap_index] -= alloc_size;
             mtx_unlock(&device->overallocation_mutex);
          }
-         result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
          goto fail;
       }
 
@@ -6278,13 +6280,13 @@ radv_CreateEvent(VkDevice _device, const VkEventCreateInfo *pCreateInfo,
 
    vk_object_base_init(&device->vk, &event->base, VK_OBJECT_TYPE_EVENT);
 
-   event->bo = device->ws->buffer_create(
+   VkResult result = device->ws->buffer_create(
       device->ws, 8, 8, RADEON_DOMAIN_GTT,
       RADEON_FLAG_VA_UNCACHED | RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING,
-      RADV_BO_PRIORITY_FENCE);
-   if (!event->bo) {
+      RADV_BO_PRIORITY_FENCE, &event->bo);
+   if (result != VK_SUCCESS) {
       radv_destroy_event(device, pAllocator, event);
-      return vk_error(device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+      return vk_error(device->instance, result);
    }
 
    event->map = (uint64_t *)device->ws->buffer_map(event->bo);
@@ -6382,11 +6384,12 @@ radv_CreateBuffer(VkDevice _device, const VkBufferCreateInfo *pCreateInfo,
       vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_MEMORY_BUFFER_CREATE_INFO) != NULL;
 
    if (pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
-      buffer->bo = device->ws->buffer_create(device->ws, align64(buffer->size, 4096), 4096, 0,
-                                             RADEON_FLAG_VIRTUAL, RADV_BO_PRIORITY_VIRTUAL);
-      if (!buffer->bo) {
+      VkResult result =
+         device->ws->buffer_create(device->ws, align64(buffer->size, 4096), 4096, 0,
+                                   RADEON_FLAG_VIRTUAL, RADV_BO_PRIORITY_VIRTUAL, &buffer->bo);
+      if (result != VK_SUCCESS) {
          radv_destroy_buffer(device, pAllocator, buffer);
-         return vk_error(device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+         return vk_error(device->instance, result);
       }
    }
 
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 9a11e013542..6f88bcf2549 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -1700,11 +1700,11 @@ radv_image_create(VkDevice _device, const struct radv_image_create_info *create_
       image->size = align64(image->size, image->alignment);
       image->offset = 0;
 
-      image->bo = device->ws->buffer_create(device->ws, image->size, image->alignment, 0,
-                                            RADEON_FLAG_VIRTUAL, RADV_BO_PRIORITY_VIRTUAL);
-      if (!image->bo) {
+      result = device->ws->buffer_create(device->ws, image->size, image->alignment, 0,
+                                         RADEON_FLAG_VIRTUAL, RADV_BO_PRIORITY_VIRTUAL, &image->bo);
+      if (result != VK_SUCCESS) {
          radv_destroy_image(device, alloc, image);
-         return vk_error(device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+         return vk_error(device->instance, result);
       }
    }
    image->l2_coherent = radv_image_is_l2_coherent(device, image);
diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
index 583d534d1b8..26d3a541b09 100644
--- a/src/amd/vulkan/radv_query.c
+++ b/src/amd/vulkan/radv_query.c
@@ -976,12 +976,12 @@ radv_CreateQueryPool(VkDevice _device, const VkQueryPoolCreateInfo *pCreateInfo,
    if (pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS)
       pool->size += 4 * pCreateInfo->queryCount;
 
-   pool->bo =
-      device->ws->buffer_create(device->ws, pool->size, 64, RADEON_DOMAIN_GTT,
-                                RADEON_FLAG_NO_INTERPROCESS_SHARING, RADV_BO_PRIORITY_QUERY_POOL);
-   if (!pool->bo) {
+   VkResult result = device->ws->buffer_create(device->ws, pool->size, 64, RADEON_DOMAIN_GTT,
+                                               RADEON_FLAG_NO_INTERPROCESS_SHARING,
+                                               RADV_BO_PRIORITY_QUERY_POOL, &pool->bo);
+   if (result != VK_SUCCESS) {
       radv_destroy_query_pool(device, pAllocator, pool);
-      return vk_error(device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+      return vk_error(device->instance, result);
    }
 
    pool->ptr = device->ws->buffer_map(pool->bo);
diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
index e607f49aae7..b0771c7f43a 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -222,18 +222,18 @@ struct radeon_winsys {
 
    const char *(*get_chip_name)(struct radeon_winsys *ws);
 
-   struct radeon_winsys_bo *(*buffer_create)(struct radeon_winsys *ws, uint64_t size,
-                                             unsigned alignment, enum radeon_bo_domain domain,
-                                             enum radeon_bo_flag flags, unsigned priority);
+   VkResult (*buffer_create)(struct radeon_winsys *ws, uint64_t size, unsigned alignment,
+                             enum radeon_bo_domain domain, enum radeon_bo_flag flags,
+                             unsigned priority, struct radeon_winsys_bo **out_bo);
 
    void (*buffer_destroy)(struct radeon_winsys *ws, struct radeon_winsys_bo *bo);
    void *(*buffer_map)(struct radeon_winsys_bo *bo);
 
-   struct radeon_winsys_bo *(*buffer_from_ptr)(struct radeon_winsys *ws, void *pointer,
-                                               uint64_t size, unsigned priority);
+   VkResult (*buffer_from_ptr)(struct radeon_winsys *ws, void *pointer, uint64_t size,
+                               unsigned priority, struct radeon_winsys_bo **out_bo);
 
-   struct radeon_winsys_bo *(*buffer_from_fd)(struct radeon_winsys *ws, int fd, unsigned priority,
-                                              uint64_t *alloc_size);
+   VkResult (*buffer_from_fd)(struct radeon_winsys *ws, int fd, unsigned priority,
+                              struct radeon_winsys_bo **out_bo, uint64_t *alloc_size);
 
    bool (*buffer_get_fd)(struct radeon_winsys *ws, struct radeon_winsys_bo *bo, int *fd);
 
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 2960008eb30..f848abfd156 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -918,13 +918,13 @@ radv_alloc_shader_memory(struct radv_device *device, struct radv_shader_variant
    struct radv_shader_slab *slab = calloc(1, sizeof(struct radv_shader_slab));
 
    slab->size = MAX2(256 * 1024, shader->code_size);
-   slab->bo = device->ws->buffer_create(
+   VkResult result = device->ws->buffer_create(
       device->ws, slab->size, 256, RADEON_DOMAIN_VRAM,
       RADEON_FLAG_NO_INTERPROCESS_SHARING |
          (device->physical_device->rad_info.cpdma_prefetch_writes_memory ? 0
                                                                          : RADEON_FLAG_READ_ONLY),
-      RADV_BO_PRIORITY_SHADER);
-   if (!slab->bo) {
+      RADV_BO_PRIORITY_SHADER, &slab->bo);
+   if (result != VK_SUCCESS) {
       free(slab);
       return NULL;
    }
diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c
index 2d3cdd58e38..6f16261169a 100644
--- a/src/amd/vulkan/radv_sqtt.c
+++ b/src/amd/vulkan/radv_sqtt.c
@@ -381,11 +381,13 @@ radv_thread_trace_init_bo(struct radv_device *device)
    size = align64(sizeof(struct ac_thread_trace_info) * max_se, 1 << SQTT_BUFFER_ALIGN_SHIFT);
    size += device->thread_trace.buffer_size * (uint64_t)max_se;
 
-   device->thread_trace.bo = ws->buffer_create(
+   struct radeon_winsys_bo *bo = NULL;
+   VkResult result = ws->buffer_create(
       ws, size, 4096, RADEON_DOMAIN_VRAM,
       RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_ZERO_VRAM,
-      RADV_BO_PRIORITY_SCRATCH);
-   if (!device->thread_trace.bo)
+      RADV_BO_PRIORITY_SCRATCH, &bo);
+   device->thread_trace.bo = bo;
+   if (result != VK_SUCCESS)
       return false;
 
    device->thread_trace.ptr = ws->buffer_map(device->thread_trace.bo);
diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c
index 8395889d2a9..ecda58d7f66 100644
--- a/src/amd/vulkan/si_cmd_buffer.c
+++ b/src/amd/vulkan/si_cmd_buffer.c
@@ -628,12 +628,12 @@ cik_create_gfx_config(struct radv_device *device)
          radeon_emit(cs, PKT3_NOP_PAD);
    }
 
-   device->gfx_init =
+   VkResult result =
       device->ws->buffer_create(device->ws, cs->cdw * 4, 4096, device->ws->cs_domain(device->ws),
                                 RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING |
                                    RADEON_FLAG_READ_ONLY | RADEON_FLAG_GTT_WC,
-                                RADV_BO_PRIORITY_CS);
-   if (!device->gfx_init)
+                                RADV_BO_PRIORITY_CS, &device->gfx_init);
+   if (result != VK_SUCCESS)
       goto fail;
 
    void *map = device->ws->buffer_map(device->gfx_init);
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
index e612dd579dc..dcaada3681b 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
@@ -391,10 +391,10 @@ radv_amdgpu_winsys_bo_destroy(struct radeon_winsys *_ws, struct radeon_winsys_bo
    FREE(bo);
 }
 
-static struct radeon_winsys_bo *
+static VkResult
 radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned alignment,
                              enum radeon_bo_domain initial_domain, enum radeon_bo_flag flags,
-                             unsigned priority)
+                             unsigned priority, struct radeon_winsys_bo **out_bo)
 {
    struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
    struct radv_amdgpu_winsys_bo *bo;
@@ -404,9 +404,15 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned
    uint64_t va = 0;
    amdgpu_va_handle va_handle;
    int r;
+   VkResult result = VK_SUCCESS;
+
+   /* Just be robust for callers that might use NULL-ness for determining if things should be freed.
+    */
+   *out_bo = NULL;
+
    bo = CALLOC_STRUCT(radv_amdgpu_winsys_bo);
    if (!bo) {
-      return NULL;
+      return VK_ERROR_OUT_OF_HOST_MEMORY;
    }
 
    unsigned virt_alignment = alignment;
@@ -416,8 +422,10 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned
    r = amdgpu_va_range_alloc(
       ws->dev, amdgpu_gpu_va_range_general, size, virt_alignment, 0, &va, &va_handle,
       (flags & RADEON_FLAG_32BIT ? AMDGPU_VA_RANGE_32_BIT : 0) | AMDGPU_VA_RANGE_HIGH);
-   if (r)
+   if (r) {
+      result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
       goto error_va_alloc;
+   }
 
    bo->base.va = va;
    bo->va_handle = va_handle;
@@ -427,8 +435,10 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned
 
    if (flags & RADEON_FLAG_VIRTUAL) {
       ranges = realloc(NULL, sizeof(struct radv_amdgpu_map_range));
-      if (!ranges)
+      if (!ranges) {
+         result = VK_ERROR_OUT_OF_HOST_MEMORY;
          goto error_ranges_alloc;
+      }
 
       bo->ranges = ranges;
       bo->range_count = 1;
@@ -442,7 +452,8 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned
       radv_amdgpu_winsys_virtual_map(ws, bo, bo->ranges);
       radv_amdgpu_log_bo(ws, bo, false);
 
-      return (struct radeon_winsys_bo *)bo;
+      *out_bo = (struct radeon_winsys_bo *)bo;
+      return VK_SUCCESS;
    }
 
    request.alloc_size = size;
@@ -504,12 +515,15 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned
       fprintf(stderr, "amdgpu:    size      : %" PRIu64 " bytes\n", size);
       fprintf(stderr, "amdgpu:    alignment : %u bytes\n", alignment);
       fprintf(stderr, "amdgpu:    domains   : %u\n", initial_domain);
+      result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
       goto error_bo_alloc;
    }
 
    r = radv_amdgpu_bo_va_op(ws, buf_handle, 0, size, va, flags, 0, AMDGPU_VA_OP_MAP);
-   if (r)
+   if (r) {
+      result = VK_ERROR_UNKNOWN;
       goto error_va_map;
+   }
 
    bo->bo = buf_handle;
    bo->base.initial_domain = initial_domain;
@@ -543,7 +557,8 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned
       radv_amdgpu_global_bo_list_add(ws, bo);
    radv_amdgpu_log_bo(ws, bo, false);
 
-   return (struct radeon_winsys_bo *)bo;
+   *out_bo = (struct radeon_winsys_bo *)bo;
+   return VK_SUCCESS;
 error_va_map:
    amdgpu_bo_free(buf_handle);
 
@@ -555,7 +570,7 @@ error_ranges_alloc:
 
 error_va_alloc:
    FREE(bo);
-   return NULL;
+   return result;
 }
 
 static void *
@@ -599,9 +614,9 @@ radv_amdgpu_get_optimal_vm_alignment(struct radv_amdgpu_winsys *ws, uint64_t siz
    return vm_alignment;
 }
 
-static struct radeon_winsys_bo *
+static VkResult
 radv_amdgpu_winsys_bo_from_ptr(struct radeon_winsys *_ws, void *pointer, uint64_t size,
-                               unsigned priority)
+                               unsigned priority, struct radeon_winsys_bo **out_bo)
 {
    struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
    amdgpu_bo_handle buf_handle;
@@ -609,13 +624,20 @@ radv_amdgpu_winsys_bo_from_ptr(struct radeon_winsys *_ws, void *pointer, uint64_
    uint64_t va;
    amdgpu_va_handle va_handle;
    uint64_t vm_alignment;
+   VkResult result = VK_SUCCESS;
+
+   /* Just be robust for callers that might use NULL-ness for determining if things should be freed.
+    */
+   *out_bo = NULL;
 
    bo = CALLOC_STRUCT(radv_amdgpu_winsys_bo);
    if (!bo)
-      return NULL;
+      return VK_ERROR_OUT_OF_HOST_MEMORY;
 
-   if (amdgpu_create_bo_from_user_mem(ws->dev, pointer, size, &buf_handle))
+   if (amdgpu_create_bo_from_user_mem(ws->dev, pointer, size, &buf_handle)) {
+      result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
       goto error;
+   }
 
    /* Using the optimal VM alignment also fixes GPU hangs for buffers that
     * are imported.
@@ -623,11 +645,15 @@ radv_amdgpu_winsys_bo_from_ptr(struct radeon_winsys *_ws, void *pointer, uint64_
    vm_alignment = radv_amdgpu_get_optimal_vm_alignment(ws, size, ws->info.gart_page_size);
 
    if (amdgpu_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size, vm_alignment, 0, &va,
-                             &va_handle, AMDGPU_VA_RANGE_HIGH))
+                             &va_handle, AMDGPU_VA_RANGE_HIGH)) {
+      result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
       goto error_va_alloc;
+   }
 
-   if (amdgpu_bo_va_op(buf_handle, 0, size, va, 0, AMDGPU_VA_OP_MAP))
+   if (amdgpu_bo_va_op(buf_handle, 0, size, va, 0, AMDGPU_VA_OP_MAP)) {
+      result = VK_ERROR_UNKNOWN;
       goto error_va_map;
+   }
 
    /* Initialize it */
    bo->base.va = va;
@@ -648,7 +674,8 @@ radv_amdgpu_winsys_bo_from_ptr(struct radeon_winsys *_ws, void *pointer, uint64_
       radv_amdgpu_global_bo_list_add(ws, bo);
    radv_amdgpu_log_bo(ws, bo, false);
 
-   return (struct radeon_winsys_bo *)bo;
+   *out_bo = (struct radeon_winsys_bo *)bo;
+   return VK_SUCCESS;
 
 error_va_map:
    amdgpu_va_range_free(va_handle);
@@ -658,12 +685,12 @@ error_va_alloc:
 
 error:
    FREE(bo);
-   return NULL;
+   return result;
 }
 
-static struct radeon_winsys_bo *
+static VkResult
 radv_amdgpu_winsys_bo_from_fd(struct radeon_winsys *_ws, int fd, unsigned priority,
-                              uint64_t *alloc_size)
+                              struct radeon_winsys_bo **out_bo, uint64_t *alloc_size)
 {
    struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
    struct radv_amdgpu_winsys_bo *bo;
@@ -674,17 +701,27 @@ radv_amdgpu_winsys_bo_from_fd(struct radeon_winsys *_ws, int fd, unsigned priori
    struct amdgpu_bo_info info = {0};
    enum radeon_bo_domain initial = 0;
    int r;
+   VkResult vk_result = VK_SUCCESS;
+
+   /* Just be robust for callers that might use NULL-ness for determining if things should be freed.
+    */
+   *out_bo = NULL;
+
    bo = CALLOC_STRUCT(radv_amdgpu_winsys_bo);
    if (!bo)
-      return NULL;
+      return VK_ERROR_OUT_OF_HOST_MEMORY;
 
    r = amdgpu_bo_import(ws->dev, type, fd, &result);
-   if (r)
+   if (r) {
+      vk_result = VK_ERROR_INVALID_EXTERNAL_HANDLE;
       goto error;
+   }
 
    r = amdgpu_bo_query_info(result.buf_handle, &info);
-   if (r)
+   if (r) {
+      vk_result = VK_ERROR_UNKNOWN;
       goto error_query;
+   }
 
    if (alloc_size) {
       *alloc_size = info.alloc_size;
@@ -692,13 +729,17 @@ radv_amdgpu_winsys_bo_from_fd(struct radeon_winsys *_ws, int fd, unsigned priori
 
    r = amdgpu_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, result.alloc_size, 1 << 20, 0,
                              &va, &va_handle, AMDGPU_VA_RANGE_HIGH);
-   if (r)
+   if (r) {
+      vk_result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
       goto error_query;
+   }
 
    r =
       radv_amdgpu_bo_va_op(ws, result.buf_handle, 0, result.alloc_size, va, 0, 0, AMDGPU_VA_OP_MAP);
-   if (r)
+   if (r) {
+      vk_result = VK_ERROR_UNKNOWN;
       goto error_va_map;
+   }
 
    if (info.preferred_heap & AMDGPU_GEM_DOMAIN_VRAM)
       initial |= RADEON_DOMAIN_VRAM;
@@ -727,7 +768,8 @@ radv_amdgpu_winsys_bo_from_fd(struct radeon_winsys *_ws, int fd, unsigned priori
       radv_amdgpu_global_bo_list_add(ws, bo);
    radv_amdgpu_log_bo(ws, bo, false);
 
-   return (struct radeon_winsys_bo *)bo;
+   *out_bo = (struct radeon_winsys_bo *)bo;
+   return VK_SUCCESS;
 error_va_map:
    amdgpu_va_range_free(va_handle);
 
@@ -736,7 +778,7 @@ error_query:
 
 error:
    FREE(bo);
-   return NULL;
+   return vk_result;
 }
 
 static bool
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index d06ca764fb7..dc206755613 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -209,12 +209,12 @@ radv_amdgpu_cs_create(struct radeon_winsys *ws, enum ring_type ring_type)
    radv_amdgpu_init_cs(cs, ring_type);
 
    if (cs->ws->use_ib_bos) {
-      cs->ib_buffer =
+      VkResult result =
          ws->buffer_create(ws, ib_size, 0, radv_amdgpu_cs_domain(ws),
                            RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING |
                               RADEON_FLAG_READ_ONLY | RADEON_FLAG_GTT_WC,
-                           RADV_BO_PRIORITY_CS);
-      if (!cs->ib_buffer) {
+                           RADV_BO_PRIORITY_CS, &cs->ib_buffer);
+      if (result != VK_SUCCESS) {
          free(cs);
          return NULL;
       }
@@ -330,13 +330,13 @@ radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size)
    cs->old_ib_buffers[cs->num_old_ib_buffers].bo = cs->ib_buffer;
    cs->old_ib_buffers[cs->num_old_ib_buffers++].cdw = cs->base.cdw;
 
-   cs->ib_buffer =
+   VkResult result =
       cs->ws->base.buffer_create(&cs->ws->base, ib_size, 0, radv_amdgpu_cs_domain(&cs->ws->base),
                                  RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING |
                                     RADEON_FLAG_READ_ONLY | RADEON_FLAG_GTT_WC,
-                                 RADV_BO_PRIORITY_CS);
+                                 RADV_BO_PRIORITY_CS, &cs->ib_buffer);
 
-   if (!cs->ib_buffer) {
+   if (result != VK_SUCCESS) {
       cs->base.cdw = 0;
       cs->status = VK_ERROR_OUT_OF_DEVICE_MEMORY;
       cs->ib_buffer = cs->old_ib_buffers[--cs->num_old_ib_buffers].bo;
@@ -1033,10 +1033,10 @@ radv_amdgpu_winsys_cs_submit_sysmem(struct radeon_winsys_ctx *_ctx, int queue_id
                pad_words++;
             }
 
-            bos[j] = ws->buffer_create(
+            ws->buffer_create(
                ws, 4 * size, 4096, radv_amdgpu_cs_domain(ws),
                RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_READ_ONLY,
-               RADV_BO_PRIORITY_CS);
+               RADV_BO_PRIORITY_CS, &bos[j]);
             ptr = ws->buffer_map(bos[j]);
 
             if (needs_preamble) {
@@ -1076,10 +1076,10 @@ radv_amdgpu_winsys_cs_submit_sysmem(struct radeon_winsys_ctx *_ctx, int queue_id
          }
          assert(cnt);
 
-         bos[0] = ws->buffer_create(
+         ws->buffer_create(
             ws, 4 * size, 4096, radv_amdgpu_cs_domain(ws),
             RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_READ_ONLY,
-            RADV_BO_PRIORITY_CS);
+            RADV_BO_PRIORITY_CS, &bos[0]);
          ptr = ws->buffer_map(bos[0]);
 
          if (preamble_cs) {
@@ -1262,11 +1262,10 @@ radv_amdgpu_ctx_create(struct radeon_winsys *_ws, enum radeon_ctx_priority prior
    ctx->ws = ws;
 
    assert(AMDGPU_HW_IP_NUM * MAX_RINGS_PER_TYPE * sizeof(uint64_t) <= 4096);
-   ctx->fence_bo = ws->base.buffer_create(
-      &ws->base, 4096, 8, RADEON_DOMAIN_GTT,
-      RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING, RADV_BO_PRIORITY_CS);
-   if (!ctx->fence_bo) {
-      result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
+   result = ws->base.buffer_create(&ws->base, 4096, 8, RADEON_DOMAIN_GTT,
+                                   RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING,
+                                   RADV_BO_PRIORITY_CS, &ctx->fence_bo);
+   if (result != VK_SUCCESS) {
       goto fail_alloc;
    }
 
diff --git a/src/amd/vulkan/winsys/null/radv_null_bo.c b/src/amd/vulkan/winsys/null/radv_null_bo.c
index 3c8d12431a7..f1775797426 100644
--- a/src/amd/vulkan/winsys/null/radv_null_bo.c
+++ b/src/amd/vulkan/winsys/null/radv_null_bo.c
@@ -28,25 +28,29 @@
 #include "radv_null_bo.h"
 #include "util/u_memory.h"
 
-static struct radeon_winsys_bo *
+static VkResult
 radv_null_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned alignment,
                            enum radeon_bo_domain initial_domain, enum radeon_bo_flag flags,
-                           unsigned priority)
+                           unsigned priority, struct radeon_winsys_bo **out_bo)
 {
    struct radv_null_winsys_bo *bo;
 
+   /* Courtesy for users using NULL to check if they need to destroy the BO. */
+   *out_bo = NULL;
+
    bo = CALLOC_STRUCT(radv_null_winsys_bo);
    if (!bo)
-      return NULL;
+      return VK_ERROR_OUT_OF_HOST_MEMORY;
 
    bo->ptr = malloc(size);
    if (!bo->ptr)
       goto error_ptr_alloc;
 
-   return (struct radeon_winsys_bo *)bo;
+   *out_bo = (struct radeon_winsys_bo *)bo;
+   return VK_SUCCESS;
 error_ptr_alloc:
    FREE(bo);
-   return NULL;
+   return VK_ERROR_OUT_OF_HOST_MEMORY;
 }
 
 static void *



More information about the mesa-commit mailing list