From a427d22cdee4a5166e000b0a1f540c52b42afa13 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 31 Oct 2023 16:05:14 +0100 Subject: [dxvk] Add Vulkan instance flag for D3D9 apps --- src/d3d11/d3d11_main.cpp | 4 ++-- src/d3d9/d3d9_interface.cpp | 2 +- src/dxgi/dxgi_factory.cpp | 2 +- src/dxvk/dxvk_instance.cpp | 11 ++++++----- src/dxvk/dxvk_instance.h | 25 ++++++++++++++++++++++--- 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 = new DxvkInstance(instanceInfo); + Rc dxvkInstance = new DxvkInstance(instanceInfo, 0); // Find adapter by physical device handle Rc 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 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 @@ -20,6 +20,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; + + /** * \brief DXVK instance * @@ -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 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 acquire() { + template + Rc acquire(Args... constantArgs) { std::lock_guard lock(m_mutex); if (!(m_useCount++)) - m_object = new T(); + m_object = new T(constantArgs...); return m_object; } -- cgit v1.2.3