Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2023-10-31 18:05:14 +0300
committerPhilip Rebohle <philip.rebohle@tu-dortmund.de>2023-10-31 18:05:58 +0300
commita427d22cdee4a5166e000b0a1f540c52b42afa13 (patch)
treee20424cb4ca841f9d8dfd6ca50fb063b817a707e
parent22c2abb9b7dff7d062fd1ce3fba4468acce4df0b (diff)
[dxvk] Add Vulkan instance flag for D3D9 apps
-rw-r--r--src/d3d11/d3d11_main.cpp4
-rw-r--r--src/d3d9/d3d9_interface.cpp2
-rw-r--r--src/dxgi/dxgi_factory.cpp2
-rw-r--r--src/dxvk/dxvk_instance.cpp11
-rw-r--r--src/dxvk/dxvk_instance.h25
-rw-r--r--src/util/util_singleton.h5
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;
}