diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index d3a5bcbe304..b2e002f681c 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -2798,8 +2798,12 @@ VkResult radv_CreateDevice( if (!device) return vk_error(physical_device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); - vk_device_init(&device->vk, pCreateInfo, - &physical_device->instance->alloc, pAllocator); + result = vk_device_init(&device->vk, pCreateInfo, + &physical_device->instance->alloc, pAllocator); + if (result != VK_SUCCESS) { + vk_free(&device->vk.alloc, device); + return result; + } device->instance = physical_device->instance; device->physical_device = physical_device; diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 80e1a2ed88c..7e67cb11cc8 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1579,8 +1579,12 @@ v3dv_CreateDevice(VkPhysicalDevice physicalDevice, if (!device) return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY); - vk_device_init(&device->vk, pCreateInfo, - &physical_device->instance->alloc, pAllocator); + result = vk_device_init(&device->vk, pCreateInfo, + &physical_device->instance->alloc, pAllocator); + if (result != VK_SUCCESS) { + vk_free(&device->vk.alloc, device); + return vk_error(instance, result); + } device->instance = instance; device->pdevice = physical_device; diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 155dec8c8a1..1fdd96de735 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -1041,8 +1041,13 @@ tu_CreateDevice(VkPhysicalDevice physicalDevice, if (!device) return vk_startup_errorf(physical_device->instance, VK_ERROR_OUT_OF_HOST_MEMORY, "OOM"); - vk_device_init(&device->vk, pCreateInfo, + result = vk_device_init(&device->vk, pCreateInfo, &physical_device->instance->alloc, pAllocator); + if (result != VK_SUCCESS) { + vk_free(&device->vk.alloc, device); + return vk_startup_errorf(physical_device->instance, result, + "vk_device_init failed"); + } device->instance = physical_device->instance; device->physical_device = physical_device; diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index da9d29029e5..4512a0d2728 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -937,8 +937,13 @@ VkResult lvp_CreateDevice( if (!device) return vk_error(physical_device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); - vk_device_init(&device->vk, pCreateInfo, - &physical_device->instance->alloc, pAllocator); + VkResult result = vk_device_init(&device->vk, pCreateInfo, + &physical_device->instance->alloc, + pAllocator); + if (result != VK_SUCCESS) { + vk_free(&device->vk.alloc, device); + return vk_error(physical_device->instance, result); + } device->instance = physical_device->instance; device->physical_device = physical_device; diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 698654050c4..022ec061bc1 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -2860,8 +2860,12 @@ VkResult anv_CreateDevice( if (!device) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); - vk_device_init(&device->vk, pCreateInfo, - &physical_device->instance->alloc, pAllocator); + result = vk_device_init(&device->vk, pCreateInfo, + &physical_device->instance->alloc, pAllocator); + if (result != VK_SUCCESS) { + vk_error(result); + goto fail_alloc; + } if (INTEL_DEBUG & DEBUG_BATCH) { const unsigned decode_flags = @@ -3239,6 +3243,7 @@ VkResult anv_CreateDevice( close(device->fd); fail_device: vk_device_finish(&device->vk); + fail_alloc: vk_free(&device->vk.alloc, device); return result; diff --git a/src/vulkan/util/vk_device.c b/src/vulkan/util/vk_device.c index 782f31b43d1..457169aac6e 100644 --- a/src/vulkan/util/vk_device.c +++ b/src/vulkan/util/vk_device.c @@ -26,7 +26,7 @@ #include "util/hash_table.h" #include "util/ralloc.h" -void +VkResult vk_device_init(struct vk_device *device, UNUSED const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *instance_alloc, @@ -44,6 +44,8 @@ vk_device_init(struct vk_device *device, mtx_init(&device->swapchain_private_mtx, mtx_plain); device->swapchain_private = NULL; #endif /* ANDROID */ + + return VK_SUCCESS; } void diff --git a/src/vulkan/util/vk_device.h b/src/vulkan/util/vk_device.h index 3a1188fd4b7..1a86e58fa07 100644 --- a/src/vulkan/util/vk_device.h +++ b/src/vulkan/util/vk_device.h @@ -42,11 +42,14 @@ struct vk_device { #endif }; -void vk_device_init(struct vk_device *device, - const VkDeviceCreateInfo *pCreateInfo, - const VkAllocationCallbacks *instance_alloc, - const VkAllocationCallbacks *device_alloc); -void vk_device_finish(struct vk_device *device); +VkResult MUST_CHECK +vk_device_init(struct vk_device *device, + const VkDeviceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *instance_alloc, + const VkAllocationCallbacks *device_alloc); + +void +vk_device_finish(struct vk_device *device); #ifdef __cplusplus }