diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index a02f497f..dbff583d 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -2814,7 +2814,7 @@ namespace dxvk { uint32_t flLo = (uint32_t(FeatureLevel) >> 8) & 0x7; std::string apiName = str::format("D3D11 FL ", flHi, "_", flLo); - return m_dxvkAdapter->createDevice(apiName, deviceFeatures); + return m_dxvkAdapter->createDevice(m_dxvkInstance, apiName, deviceFeatures); } } diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 8f35de6a..6566f16a 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -242,7 +242,10 @@ namespace dxvk { } - Rc DxvkAdapter::createDevice(std::string clientApi, DxvkDeviceFeatures enabledFeatures) { + Rc DxvkAdapter::createDevice( + const Rc& instance, + std::string clientApi, + DxvkDeviceFeatures enabledFeatures) { DxvkDeviceExtensions devExtensions; std::array devExtensionList = {{ @@ -390,7 +393,7 @@ namespace dxvk { if (m_vki->vkCreateDevice(m_handle, &info, nullptr, &device) != VK_SUCCESS) throw DxvkError("DxvkAdapter: Failed to create device"); - Rc result = new DxvkDevice(clientApi, this, + Rc result = new DxvkDevice(clientApi, instance, this, new vk::DeviceFn(true, m_vki->instance(), device), devExtensions, enabledFeatures); result->initResources(); diff --git a/src/dxvk/dxvk_adapter.h b/src/dxvk/dxvk_adapter.h index 6e3d6216..3b94332f 100644 --- a/src/dxvk/dxvk_adapter.h +++ b/src/dxvk/dxvk_adapter.h @@ -199,11 +199,13 @@ namespace dxvk { * \brief Creates a DXVK device * * Creates a logical device for this adapter. + * \param [in] instance Parent instance * \param [in] clientApi Name of the client API * \param [in] enabledFeatures Device features * \returns Device handle */ Rc createDevice( + const Rc& instance, std::string clientApi, DxvkDeviceFeatures enabledFeatures); diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index faa6f2a1..a9bc68e5 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -5,12 +5,14 @@ namespace dxvk { DxvkDevice::DxvkDevice( std::string clientApi, + const Rc& instance, const Rc& adapter, const Rc& vkd, const DxvkDeviceExtensions& extensions, const DxvkDeviceFeatures& features) : m_clientApi (clientApi), - m_options (adapter->instance()->options()), + m_options (instance->options()), + m_instance (instance), m_adapter (adapter), m_vkd (vkd), m_extensions (extensions), diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index 4154824f..ef0115f1 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -8,6 +8,7 @@ #include "dxvk_extensions.h" #include "dxvk_framebuffer.h" #include "dxvk_image.h" +#include "dxvk_instance.h" #include "dxvk_memory.h" #include "dxvk_meta_clear.h" #include "dxvk_objects.h" @@ -79,6 +80,7 @@ namespace dxvk { DxvkDevice( std::string clientApi, + const Rc& instance, const Rc& adapter, const Rc& vkd, const DxvkDeviceExtensions& extensions, @@ -138,6 +140,16 @@ namespace dxvk { != m_queues.graphics.queueHandle; } + /** + * \brief The instance + * + * The DXVK instance that created this device. + * \returns Instance + */ + Rc instance() const { + return m_instance; + } + /** * \brief The adapter * @@ -456,6 +468,7 @@ namespace dxvk { std::string m_clientApi; DxvkOptions m_options; + Rc m_instance; Rc m_adapter; Rc m_vkd; DxvkDeviceExtensions m_extensions; diff --git a/src/dxvk/dxvk_instance.h b/src/dxvk/dxvk_instance.h index b23c971f..389bff03 100644 --- a/src/dxvk/dxvk_instance.h +++ b/src/dxvk/dxvk_instance.h @@ -3,8 +3,8 @@ #include "../util/config/config.h" #include "dxvk_adapter.h" -#include "dxvk_device.h" #include "dxvk_device_filter.h" +#include "dxvk_options.h" namespace dxvk {