diff --git a/vulkan/vulkan_application.cc b/vulkan/vulkan_application.cc index 7ba881b843181a4aa24aedebfb4fcc4301fbd209..eaba000274ca44bb8fcd9da73ec6684d5820a356 100644 --- a/vulkan/vulkan_application.cc +++ b/vulkan/vulkan_application.cc @@ -129,6 +129,10 @@ const VulkanHandle& VulkanApplication::GetInstance() const { return instance_; } +void VulkanApplication::ReleaseInstanceOwnership() { + instance_.ReleaseOwnership(); +} + std::vector VulkanApplication::GetPhysicalDevices() const { if (!IsValid()) { return {}; diff --git a/vulkan/vulkan_application.h b/vulkan/vulkan_application.h index 9274701f958019cdadb8a3a25ef9461f1524ae9c..a5f20c07f63ec003f083b6354c911b3b5a35ff75 100644 --- a/vulkan/vulkan_application.h +++ b/vulkan/vulkan_application.h @@ -38,6 +38,8 @@ class VulkanApplication { const VulkanHandle& GetInstance() const; + void ReleaseInstanceOwnership(); + std::unique_ptr AcquireFirstCompatibleLogicalDevice() const; private: diff --git a/vulkan/vulkan_device.cc b/vulkan/vulkan_device.cc index 745110ed70f2caae0aefafea8c7e21f87efb353e..bb6c2e8a1437c3f3b177bcee1608e968d1570c23 100644 --- a/vulkan/vulkan_device.cc +++ b/vulkan/vulkan_device.cc @@ -153,6 +153,10 @@ const VulkanHandle& VulkanDevice::GetHandle() const { return device_; } +void VulkanDevice::ReleaseDeviceOwnership() { + device_.ReleaseOwnership(); +} + const VulkanHandle& VulkanDevice::GetPhysicalDeviceHandle() const { return physical_device_; diff --git a/vulkan/vulkan_device.h b/vulkan/vulkan_device.h index e32f37d7ed57bc3af8e70402a873be7b728a8fa7..e9abf757f6a94d4f41631b8f113d373b4a30f761 100644 --- a/vulkan/vulkan_device.h +++ b/vulkan/vulkan_device.h @@ -35,6 +35,8 @@ class VulkanDevice { uint32_t GetGraphicsQueueIndex() const; + void ReleaseDeviceOwnership(); + FXL_WARN_UNUSED_RESULT bool GetSurfaceCapabilities(const VulkanSurface& surface, VkSurfaceCapabilitiesKHR* capabilities) const; diff --git a/vulkan/vulkan_handle.h b/vulkan/vulkan_handle.h index 32f1f938e25bb84980563a49cef7d84b8e388bc8..87f535e9b913231595ac10fd218fadfc9463c462 100644 --- a/vulkan/vulkan_handle.h +++ b/vulkan/vulkan_handle.h @@ -50,6 +50,11 @@ class VulkanHandle { operator Handle() const { return handle_; } + /// Relinquish responsibility of collecting the underlying handle when this + /// object is collected. It is the responsibility of the caller to ensure that + /// the lifetime of the handle extends past the lifetime of this object. + void ReleaseOwnership() { disposer_ = nullptr; } + void Reset() { DisposeIfNecessary(); } private: