diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 079ade23f..43314c991 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -278,7 +278,7 @@ namespace dxvk { throw DxvkError("DxvkAdapter: Failed to create device"); Rc result = new DxvkDevice(this, - new vk::DeviceFn(m_vki->instance(), device), + new vk::DeviceFn(true, m_vki->instance(), device), devExtensions, enabledFeatures); result->initResources(); return result; diff --git a/src/dxvk/dxvk_instance.cpp b/src/dxvk/dxvk_instance.cpp index 36b18731f..48a8664cb 100644 --- a/src/dxvk/dxvk_instance.cpp +++ b/src/dxvk/dxvk_instance.cpp @@ -18,7 +18,7 @@ namespace dxvk { g_vrInstance.initInstanceExtensions(); m_vkl = new vk::LibraryFn(); - m_vki = new vk::InstanceFn(this->createInstance()); + m_vki = new vk::InstanceFn(true, this->createInstance()); m_adapters = this->queryAdapters(); g_vrInstance.initDeviceExtensions(this); diff --git a/src/dxvk/vulkan/dxvk_vulkan_loader.cpp b/src/dxvk/vulkan/dxvk_vulkan_loader.cpp index d3a1ca11e..3a14c366f 100644 --- a/src/dxvk/vulkan/dxvk_vulkan_loader.cpp +++ b/src/dxvk/vulkan/dxvk_vulkan_loader.cpp @@ -19,8 +19,8 @@ namespace dxvk::vk { } - InstanceLoader::InstanceLoader(VkInstance instance) - : m_instance(instance) { } + InstanceLoader::InstanceLoader(bool owned, VkInstance instance) + : m_instance(instance), m_owned(owned) { } PFN_vkVoidFunction InstanceLoader::sym(const char* name) const { @@ -28,10 +28,10 @@ namespace dxvk::vk { } - DeviceLoader::DeviceLoader(VkInstance instance, VkDevice device) + DeviceLoader::DeviceLoader(bool owned, VkInstance instance, VkDevice device) : m_getDeviceProcAddr(reinterpret_cast( dxvk::vk::GetInstanceProcAddr(instance, "vkGetDeviceProcAddr"))), - m_device(device) { } + m_device(device), m_owned(owned) { } PFN_vkVoidFunction DeviceLoader::sym(const char* name) const { @@ -43,17 +43,19 @@ namespace dxvk::vk { LibraryFn::~LibraryFn() { } - InstanceFn::InstanceFn(VkInstance instance) - : InstanceLoader(instance) { } + InstanceFn::InstanceFn(bool owned, VkInstance instance) + : InstanceLoader(owned, instance) { } InstanceFn::~InstanceFn() { - this->vkDestroyInstance(m_instance, nullptr); + if (m_owned) + this->vkDestroyInstance(m_instance, nullptr); } - DeviceFn::DeviceFn(VkInstance instance, VkDevice device) - : DeviceLoader(instance, device) { } + DeviceFn::DeviceFn(bool owned, VkInstance instance, VkDevice device) + : DeviceLoader(owned, instance, device) { } DeviceFn::~DeviceFn() { - this->vkDestroyDevice(m_device, nullptr); + if (m_owned) + this->vkDestroyDevice(m_device, nullptr); } } \ No newline at end of file diff --git a/src/dxvk/vulkan/dxvk_vulkan_loader.h b/src/dxvk/vulkan/dxvk_vulkan_loader.h index 8a9b8508f..eb93f3beb 100644 --- a/src/dxvk/vulkan/dxvk_vulkan_loader.h +++ b/src/dxvk/vulkan/dxvk_vulkan_loader.h @@ -25,11 +25,12 @@ namespace dxvk::vk { * called for a specific instance. */ struct InstanceLoader : public RcObject { - InstanceLoader(VkInstance instance); + InstanceLoader(bool owned, VkInstance instance); PFN_vkVoidFunction sym(const char* name) const; VkInstance instance() const { return m_instance; } protected: const VkInstance m_instance; + const bool m_owned; }; @@ -40,12 +41,13 @@ namespace dxvk::vk { * specific device. */ struct DeviceLoader : public RcObject { - DeviceLoader(VkInstance instance, VkDevice device); + DeviceLoader(bool owned, VkInstance instance, VkDevice device); PFN_vkVoidFunction sym(const char* name) const; VkDevice device() const { return m_device; } protected: const PFN_vkGetDeviceProcAddr m_getDeviceProcAddr; const VkDevice m_device; + const bool m_owned; }; @@ -72,7 +74,7 @@ namespace dxvk::vk { * are independent of any Vulkan devices. */ struct InstanceFn : InstanceLoader { - InstanceFn(VkInstance instance); + InstanceFn(bool owned, VkInstance instance); ~InstanceFn(); VULKAN_FN(vkCreateDevice); @@ -141,7 +143,7 @@ namespace dxvk::vk { * This ensures that no slow dispatch code is executed. */ struct DeviceFn : DeviceLoader { - DeviceFn(VkInstance instance, VkDevice device); + DeviceFn(bool owned, VkInstance instance, VkDevice device); ~DeviceFn(); VULKAN_FN(vkDestroyDevice);