diff options
author | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2023-10-31 18:05:14 +0300 |
---|---|---|
committer | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2023-10-31 18:05:58 +0300 |
commit | a427d22cdee4a5166e000b0a1f540c52b42afa13 (patch) | |
tree | e20424cb4ca841f9d8dfd6ca50fb063b817a707e | |
parent | 22c2abb9b7dff7d062fd1ce3fba4468acce4df0b (diff) |
[dxvk] Add Vulkan instance flag for D3D9 apps
-rw-r--r-- | src/d3d11/d3d11_main.cpp | 4 | ||||
-rw-r--r-- | src/d3d9/d3d9_interface.cpp | 2 | ||||
-rw-r--r-- | src/dxgi/dxgi_factory.cpp | 2 | ||||
-rw-r--r-- | src/dxvk/dxvk_instance.cpp | 11 | ||||
-rw-r--r-- | src/dxvk/dxvk_instance.h | 25 | ||||
-rw-r--r-- | src/util/util_singleton.h | 5 |
6 files changed, 35 insertions, 14 deletions
diff --git a/src/d3d11/d3d11_main.cpp b/src/d3d11/d3d11_main.cpp index 4bcbec05..8ae32c00 100644 --- a/src/d3d11/d3d11_main.cpp +++ b/src/d3d11/d3d11_main.cpp @@ -38,7 +38,7 @@ extern "C" { DXGI_ADAPTER_DESC desc; pAdapter->GetDesc(&desc); - dxvkInstance = new DxvkInstance(); + dxvkInstance = new DxvkInstance(0); dxvkAdapter = dxvkInstance->findAdapterByLuid(&desc.AdapterLuid); if (dxvkAdapter == nullptr) @@ -376,7 +376,7 @@ extern "C" { instanceInfo.extensionCount = instanceExtensions.size(); instanceInfo.extensionNames = instanceExtensions.data(); - Rc<DxvkInstance> dxvkInstance = new DxvkInstance(instanceInfo); + Rc<DxvkInstance> dxvkInstance = new DxvkInstance(instanceInfo, 0); // Find adapter by physical device handle Rc<DxvkAdapter> dxvkAdapter; diff --git a/src/d3d9/d3d9_interface.cpp b/src/d3d9/d3d9_interface.cpp index 690e16d1..8e6b12d2 100644 --- a/src/d3d9/d3d9_interface.cpp +++ b/src/d3d9/d3d9_interface.cpp @@ -14,7 +14,7 @@ namespace dxvk { Singleton<DxvkInstance> g_dxvkInstance; D3D9InterfaceEx::D3D9InterfaceEx(bool bExtended) - : m_instance ( g_dxvkInstance.acquire() ) + : m_instance ( g_dxvkInstance.acquire(DxvkInstanceFlag::ClientApiIsD3D9) ) , m_d3d8Bridge ( this ) , m_extended ( bExtended ) , m_d3d9Options ( nullptr, m_instance->config() ) diff --git a/src/dxgi/dxgi_factory.cpp b/src/dxgi/dxgi_factory.cpp index d14ace5d..24824c9d 100644 --- a/src/dxgi/dxgi_factory.cpp +++ b/src/dxgi/dxgi_factory.cpp @@ -79,7 +79,7 @@ namespace dxvk { DxgiFactory::DxgiFactory(UINT Flags) - : m_instance (g_dxvkInstance.acquire()), + : m_instance (g_dxvkInstance.acquire(0)), m_interop (this), m_options (m_instance->config()), m_monitorInfo (this, m_options), diff --git a/src/dxvk/dxvk_instance.cpp b/src/dxvk/dxvk_instance.cpp index cffde93b..01688182 100644 --- a/src/dxvk/dxvk_instance.cpp +++ b/src/dxvk/dxvk_instance.cpp @@ -10,13 +10,13 @@ namespace dxvk { - DxvkInstance::DxvkInstance() - : DxvkInstance(DxvkInstanceImportInfo()) { + DxvkInstance::DxvkInstance(DxvkInstanceFlags flags) + : DxvkInstance(DxvkInstanceImportInfo(), flags) { } - DxvkInstance::DxvkInstance(const DxvkInstanceImportInfo& args) { + DxvkInstance::DxvkInstance(const DxvkInstanceImportInfo& args, DxvkInstanceFlags flags) { Logger::info(str::format("Game: ", env::getExeName())); Logger::info(str::format("DXVK: ", DXVK_VERSION)); @@ -46,7 +46,7 @@ namespace dxvk { for (const auto& provider : m_extProviders) provider->initInstanceExtensions(); - createInstanceLoader(args); + createInstanceLoader(args, flags); m_adapters = this->queryAdapters(); for (const auto& provider : m_extProviders) @@ -106,7 +106,7 @@ namespace dxvk { } - void DxvkInstance::createInstanceLoader(const DxvkInstanceImportInfo& args) { + void DxvkInstance::createInstanceLoader(const DxvkInstanceImportInfo& args, DxvkInstanceFlags flags) { DxvkNameList layerList; DxvkNameList extensionList; DxvkNameSet extensionSet; @@ -175,6 +175,7 @@ namespace dxvk { VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO }; appInfo.pApplicationName = appName.c_str(); + appInfo.applicationVersion = flags.raw(); appInfo.pEngineName = "DXVK"; appInfo.engineVersion = VK_MAKE_VERSION(2, 3, 0); appInfo.apiVersion = VK_MAKE_VERSION(1, 3, 0); diff --git a/src/dxvk/dxvk_instance.h b/src/dxvk/dxvk_instance.h index 8335d23c..cc0071e2 100644 --- a/src/dxvk/dxvk_instance.h +++ b/src/dxvk/dxvk_instance.h @@ -21,6 +21,21 @@ namespace dxvk { /** + * \brief Instance creation flags + * + * These flags will be passed to the app version field of the Vulkan + * instance, so that drivers can adjust behaviour for some edge cases + * that are not implementable with Vulkan itself. + */ + enum class DxvkInstanceFlag : uint32_t { + /** Enforce D3D9 behaviour for texture coordinate snapping */ + ClientApiIsD3D9, + }; + + using DxvkInstanceFlags = Flags<DxvkInstanceFlag>; + + + /** * \brief DXVK instance * * Manages a Vulkan instance and stores a list @@ -33,14 +48,17 @@ namespace dxvk { /** * \brief Creates new Vulkan instance + * \param [in] flags Instance flags */ - DxvkInstance(); + explicit DxvkInstance(DxvkInstanceFlags flags); /** * \brief Imports existing Vulkan instance + * \param [in] flags Instance flags */ explicit DxvkInstance( - const DxvkInstanceImportInfo& args); + const DxvkInstanceImportInfo& args, + DxvkInstanceFlags flags); ~DxvkInstance(); @@ -145,7 +163,8 @@ namespace dxvk { const DxvkInstanceImportInfo& args); void createInstanceLoader( - const DxvkInstanceImportInfo& args); + const DxvkInstanceImportInfo& args, + DxvkInstanceFlags flags); std::vector<DxvkExt*> getExtensionList( DxvkInstanceExtensions& ext, diff --git a/src/util/util_singleton.h b/src/util/util_singleton.h index 08cd1562..ee5fe56d 100644 --- a/src/util/util_singleton.h +++ b/src/util/util_singleton.h @@ -16,11 +16,12 @@ class Singleton { public: - Rc<T> acquire() { + template<typename... Args> + Rc<T> acquire(Args... constantArgs) { std::lock_guard lock(m_mutex); if (!(m_useCount++)) - m_object = new T(); + m_object = new T(constantArgs...); return m_object; } |