mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Implement extension provider system
This change introduces a new system for providing extra instance/device extensions. This consolidates platform-specific and vr-related to its' own thing for potential future cross-platform/native Linux work.
This commit is contained in:
parent
27898ebbfc
commit
dbf2407fd3
17
src/dxvk/dxvk_extension_provider.cpp
Normal file
17
src/dxvk/dxvk_extension_provider.cpp
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "dxvk_extension_provider.h"
|
||||||
|
|
||||||
|
#include "dxvk_openvr.h"
|
||||||
|
#include "dxvk_platform_exts.h"
|
||||||
|
|
||||||
|
namespace dxvk {
|
||||||
|
|
||||||
|
DxvkExtensionProviderList DxvkExtensionProvider::s_extensionProviders = {
|
||||||
|
&g_platformInstance,
|
||||||
|
&g_vrInstance
|
||||||
|
};
|
||||||
|
|
||||||
|
const DxvkExtensionProviderList& DxvkExtensionProvider::getExtensionProviders() {
|
||||||
|
return s_extensionProviders;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
78
src/dxvk/dxvk_extension_provider.h
Normal file
78
src/dxvk/dxvk_extension_provider.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "dxvk_include.h"
|
||||||
|
#include "dxvk_extensions.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace dxvk {
|
||||||
|
|
||||||
|
class DxvkInstance;
|
||||||
|
class DxvkExtensionProvider;
|
||||||
|
|
||||||
|
using DxvkExtensionProviderList = std::vector<DxvkExtensionProvider*>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Extension provider base
|
||||||
|
*
|
||||||
|
* Abstract interface for extension
|
||||||
|
* providers
|
||||||
|
*/
|
||||||
|
class DxvkExtensionProvider {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Extension provider name
|
||||||
|
* \returns The extension provider's name
|
||||||
|
*/
|
||||||
|
virtual std::string_view getName() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Query instance extensions
|
||||||
|
* \returns Instance extensions
|
||||||
|
*/
|
||||||
|
virtual DxvkNameSet getInstanceExtensions() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Query device extensions
|
||||||
|
*
|
||||||
|
* Retrieves the extensions required for a specific
|
||||||
|
* physical device. The adapter index should remain
|
||||||
|
* the same across multiple Vulkan instances.
|
||||||
|
* \param [in] adapterId Adapter index
|
||||||
|
*/
|
||||||
|
virtual DxvkNameSet getDeviceExtensions(
|
||||||
|
uint32_t adapterId) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initializes instance extension set
|
||||||
|
*
|
||||||
|
* Should be called before creating
|
||||||
|
* the first Vulkan instance.
|
||||||
|
*/
|
||||||
|
virtual void initInstanceExtensions() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initializes device extension sets
|
||||||
|
*
|
||||||
|
* Should be called after setting
|
||||||
|
* up the Vulkan physical devices.
|
||||||
|
* \param [in] instance DXVK instance
|
||||||
|
*/
|
||||||
|
virtual void initDeviceExtensions(
|
||||||
|
const DxvkInstance* instance) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get list of ptrs to the extension providers
|
||||||
|
*/
|
||||||
|
static const DxvkExtensionProviderList& getExtensionProviders();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
static DxvkExtensionProviderList s_extensionProviders;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -294,7 +294,6 @@ namespace dxvk {
|
|||||||
struct DxvkInstanceExtensions {
|
struct DxvkInstanceExtensions {
|
||||||
DxvkExt khrGetPhysicalDeviceProperties2 = { VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, DxvkExtMode::Required };
|
DxvkExt khrGetPhysicalDeviceProperties2 = { VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, DxvkExtMode::Required };
|
||||||
DxvkExt khrSurface = { VK_KHR_SURFACE_EXTENSION_NAME, DxvkExtMode::Required };
|
DxvkExt khrSurface = { VK_KHR_SURFACE_EXTENSION_NAME, DxvkExtMode::Required };
|
||||||
DxvkExt khrWin32Surface = { VK_KHR_WIN32_SURFACE_EXTENSION_NAME, DxvkExtMode::Required };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
#include <version.h>
|
#include <version.h>
|
||||||
|
|
||||||
#include "dxvk_instance.h"
|
#include "dxvk_instance.h"
|
||||||
#include "dxvk_openvr.h"
|
#include "dxvk_extension_provider.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
@ -15,17 +15,28 @@ namespace dxvk {
|
|||||||
m_config.merge(Config::getAppConfig(env::getExePath()));
|
m_config.merge(Config::getAppConfig(env::getExePath()));
|
||||||
m_config.logOptions();
|
m_config.logOptions();
|
||||||
|
|
||||||
g_vrInstance.initInstanceExtensions();
|
const auto& extProviders = DxvkExtensionProvider::getExtensionProviders();
|
||||||
|
|
||||||
|
Logger::info("Built-in extension providers:");
|
||||||
|
for (const auto& provider : extProviders)
|
||||||
|
Logger::info(str::format(" ", provider->getName()));
|
||||||
|
|
||||||
|
for (const auto& provider : extProviders)
|
||||||
|
provider->initInstanceExtensions();
|
||||||
|
|
||||||
m_vkl = new vk::LibraryFn();
|
m_vkl = new vk::LibraryFn();
|
||||||
m_vki = new vk::InstanceFn(true, this->createInstance());
|
m_vki = new vk::InstanceFn(true, this->createInstance());
|
||||||
|
|
||||||
m_adapters = this->queryAdapters();
|
m_adapters = this->queryAdapters();
|
||||||
g_vrInstance.initDeviceExtensions(this);
|
|
||||||
|
for (const auto& provider : extProviders)
|
||||||
|
provider->initDeviceExtensions(this);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < m_adapters.size(); i++) {
|
for (uint32_t i = 0; i < m_adapters.size(); i++) {
|
||||||
m_adapters[i]->enableExtensions(
|
for (const auto& provider : extProviders) {
|
||||||
g_vrInstance.getDeviceExtensions(i));
|
m_adapters[i]->enableExtensions(
|
||||||
|
provider->getDeviceExtensions(i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_options = DxvkOptions(m_config);
|
m_options = DxvkOptions(m_config);
|
||||||
@ -72,10 +83,9 @@ namespace dxvk {
|
|||||||
VkInstance DxvkInstance::createInstance() {
|
VkInstance DxvkInstance::createInstance() {
|
||||||
DxvkInstanceExtensions insExtensions;
|
DxvkInstanceExtensions insExtensions;
|
||||||
|
|
||||||
std::array<DxvkExt*, 3> insExtensionList = {{
|
std::array<DxvkExt*, 2> insExtensionList = {{
|
||||||
&insExtensions.khrGetPhysicalDeviceProperties2,
|
&insExtensions.khrGetPhysicalDeviceProperties2,
|
||||||
&insExtensions.khrSurface,
|
&insExtensions.khrSurface,
|
||||||
&insExtensions.khrWin32Surface,
|
|
||||||
}};
|
}};
|
||||||
|
|
||||||
DxvkNameSet extensionsEnabled;
|
DxvkNameSet extensionsEnabled;
|
||||||
@ -86,9 +96,12 @@ namespace dxvk {
|
|||||||
insExtensionList.data(),
|
insExtensionList.data(),
|
||||||
extensionsEnabled))
|
extensionsEnabled))
|
||||||
throw DxvkError("DxvkInstance: Failed to create instance");
|
throw DxvkError("DxvkInstance: Failed to create instance");
|
||||||
|
|
||||||
|
const auto& extProviders = DxvkExtensionProvider::getExtensionProviders();
|
||||||
|
|
||||||
// Enable additional extensions if necessary
|
// Enable additional extensions if necessary
|
||||||
extensionsEnabled.merge(g_vrInstance.getInstanceExtensions());
|
for (const auto& provider : extProviders)
|
||||||
|
extensionsEnabled.merge(provider->getInstanceExtensions());
|
||||||
DxvkNameList extensionNameList = extensionsEnabled.toNameList();
|
DxvkNameList extensionNameList = extensionsEnabled.toNameList();
|
||||||
|
|
||||||
Logger::info("Enabled instance extensions:");
|
Logger::info("Enabled instance extensions:");
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#include "dxvk_adapter.h"
|
#include "dxvk_adapter.h"
|
||||||
#include "dxvk_device.h"
|
#include "dxvk_device.h"
|
||||||
#include "dxvk_device_filter.h"
|
#include "dxvk_device_filter.h"
|
||||||
#include "dxvk_openvr.h"
|
|
||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
|
@ -36,6 +36,11 @@ namespace dxvk {
|
|||||||
|
|
||||||
VrInstance:: VrInstance() { }
|
VrInstance:: VrInstance() { }
|
||||||
VrInstance::~VrInstance() { }
|
VrInstance::~VrInstance() { }
|
||||||
|
|
||||||
|
|
||||||
|
std::string_view VrInstance::getName() {
|
||||||
|
return "OpenVR";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DxvkNameSet VrInstance::getInstanceExtensions() {
|
DxvkNameSet VrInstance::getInstanceExtensions() {
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "dxvk_include.h"
|
#include "dxvk_extension_provider.h"
|
||||||
|
|
||||||
#ifdef __WINE__
|
#ifdef __WINE__
|
||||||
using SoHandle = void*;
|
using SoHandle = void*;
|
||||||
@ -26,13 +26,19 @@ namespace dxvk {
|
|||||||
* Loads Initializes OpenVR to provide
|
* Loads Initializes OpenVR to provide
|
||||||
* access to Vulkan extension queries.
|
* access to Vulkan extension queries.
|
||||||
*/
|
*/
|
||||||
class VrInstance {
|
class VrInstance : public DxvkExtensionProvider {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
VrInstance();
|
VrInstance();
|
||||||
~VrInstance();
|
~VrInstance();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Extension provider name
|
||||||
|
* \returns The extension provider's name
|
||||||
|
*/
|
||||||
|
std::string_view getName();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Query instance extensions
|
* \brief Query instance extensions
|
||||||
* \returns Instance extensions
|
* \returns Instance extensions
|
||||||
|
53
src/dxvk/dxvk_platform_exts.h
Normal file
53
src/dxvk/dxvk_platform_exts.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#include "dxvk_extension_provider.h"
|
||||||
|
|
||||||
|
namespace dxvk {
|
||||||
|
|
||||||
|
class DxvkPlatformExts : public DxvkExtensionProvider {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Extension provider name
|
||||||
|
* \returns The extension provider's name
|
||||||
|
*/
|
||||||
|
std::string_view getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Query instance extensions
|
||||||
|
* \returns Instance extensions
|
||||||
|
*/
|
||||||
|
DxvkNameSet getInstanceExtensions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Query device extensions
|
||||||
|
*
|
||||||
|
* Retrieves the extensions required for a specific
|
||||||
|
* physical device. The adapter index should remain
|
||||||
|
* the same across multiple Vulkan instances.
|
||||||
|
* \param [in] adapterId Adapter index
|
||||||
|
*/
|
||||||
|
DxvkNameSet getDeviceExtensions(
|
||||||
|
uint32_t adapterId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initializes instance extension set
|
||||||
|
*
|
||||||
|
* Should be called before creating
|
||||||
|
* the first Vulkan instance.
|
||||||
|
*/
|
||||||
|
void initInstanceExtensions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initializes device extension sets
|
||||||
|
*
|
||||||
|
* Should be called after setting
|
||||||
|
* up the Vulkan physical devices.
|
||||||
|
* \param [in] instance DXVK instance
|
||||||
|
*/
|
||||||
|
void initDeviceExtensions(
|
||||||
|
const DxvkInstance* instance);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern DxvkPlatformExts g_platformInstance;
|
||||||
|
|
||||||
|
}
|
@ -98,6 +98,9 @@ dxvk_src = files([
|
|||||||
'dxvk_stats.cpp',
|
'dxvk_stats.cpp',
|
||||||
'dxvk_unbound.cpp',
|
'dxvk_unbound.cpp',
|
||||||
'dxvk_util.cpp',
|
'dxvk_util.cpp',
|
||||||
|
'dxvk_extension_provider.cpp',
|
||||||
|
|
||||||
|
'platform/dxvk_win32_exts.cpp',
|
||||||
|
|
||||||
'hud/dxvk_hud.cpp',
|
'hud/dxvk_hud.cpp',
|
||||||
'hud/dxvk_hud_config.cpp',
|
'hud/dxvk_hud_config.cpp',
|
||||||
|
34
src/dxvk/platform/dxvk_win32_exts.cpp
Normal file
34
src/dxvk/platform/dxvk_win32_exts.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#include "../dxvk_platform_exts.h"
|
||||||
|
|
||||||
|
namespace dxvk {
|
||||||
|
|
||||||
|
|
||||||
|
std::string_view DxvkPlatformExts::getName() {
|
||||||
|
return "Win32 WSI";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DxvkNameSet DxvkPlatformExts::getInstanceExtensions() {
|
||||||
|
DxvkNameSet names;
|
||||||
|
names.add(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
|
||||||
|
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DxvkNameSet DxvkPlatformExts::getDeviceExtensions(
|
||||||
|
uint32_t adapterId) {
|
||||||
|
return DxvkNameSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DxvkPlatformExts::initInstanceExtensions() {}
|
||||||
|
|
||||||
|
|
||||||
|
void DxvkPlatformExts::initDeviceExtensions(
|
||||||
|
const DxvkInstance* instance) {}
|
||||||
|
|
||||||
|
|
||||||
|
DxvkPlatformExts g_platformInstance;
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user