From 27573e9b255f3ea539d6c14f13890192f8744887 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 16 Jan 2018 13:58:57 +0100 Subject: [PATCH] [dxvk] Added app and device specific options --- src/dxvk/dxvk_device.cpp | 4 ++ src/dxvk/dxvk_device.h | 13 ++++++ src/dxvk/dxvk_extensions.h | 1 + src/dxvk/dxvk_options.cpp | 39 ++++++++++++++++++ src/dxvk/dxvk_options.h | 81 ++++++++++++++++++++++++++++++++++++++ src/dxvk/meson.build | 1 + src/util/util_flags.h | 8 ++++ 7 files changed, 147 insertions(+) create mode 100644 src/dxvk/dxvk_options.cpp create mode 100644 src/dxvk/dxvk_options.h diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index abfd64a8..bd672d1a 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -17,6 +17,10 @@ namespace dxvk { m_pipelineCache (new DxvkPipelineCache (vkd)), m_pipelineManager (new DxvkPipelineManager(vkd)), m_submissionQueue (this) { + m_options.adjustAppOptions(env::getExeName()); + m_options.adjustDeviceOptions(m_adapter); + m_options.logOptions(); + m_vkd->vkGetDeviceQueue(m_vkd->device(), m_adapter->graphicsQueueFamily(), 0, &m_graphicsQueue); diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index 77d7948e..7bc71d8c 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -9,6 +9,7 @@ #include "dxvk_framebuffer.h" #include "dxvk_image.h" #include "dxvk_memory.h" +#include "dxvk_options.h" #include "dxvk_pipecache.h" #include "dxvk_pipemanager.h" #include "dxvk_queue.h" @@ -73,6 +74,16 @@ namespace dxvk { return m_adapter; } + /** + * \brief Checks whether an option is enabled + * + * \param [in] option The option to check for + * \returns \c true if the option is enabled + */ + bool hasOption(DxvkOption option) const { + return m_options.test(option); + } + /** * \brief Enabled device extensions * \returns Enabled device extensions @@ -318,6 +329,8 @@ namespace dxvk { Rc m_pipelineCache; Rc m_pipelineManager; + DxvkOptions m_options; + std::mutex m_submissionLock; VkQueue m_graphicsQueue = VK_NULL_HANDLE; VkQueue m_presentQueue = VK_NULL_HANDLE; diff --git a/src/dxvk/dxvk_extensions.h b/src/dxvk/dxvk_extensions.h index e86d4271..74108476 100644 --- a/src/dxvk/dxvk_extensions.h +++ b/src/dxvk/dxvk_extensions.h @@ -129,6 +129,7 @@ namespace dxvk { * used by DXVK if supported by the implementation. */ struct DxvkDeviceExtensions : public DxvkExtensionList { + DxvkExtension amdRasterizationOrder = { this, VK_AMD_RASTERIZATION_ORDER_EXTENSION_NAME, DxvkExtensionType::Optional }; DxvkExtension khrMaintenance1 = { this, VK_KHR_MAINTENANCE1_EXTENSION_NAME, DxvkExtensionType::Required }; DxvkExtension khrMaintenance2 = { this, VK_KHR_MAINTENANCE2_EXTENSION_NAME, DxvkExtensionType::Desired }; DxvkExtension khrShaderDrawParameters = { this, VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, DxvkExtensionType::Required }; diff --git a/src/dxvk/dxvk_options.cpp b/src/dxvk/dxvk_options.cpp new file mode 100644 index 00000000..b6538bfa --- /dev/null +++ b/src/dxvk/dxvk_options.cpp @@ -0,0 +1,39 @@ +#include + +#include "dxvk_options.h" + +namespace dxvk { + + const static std::unordered_map g_appOptions = {{ + + }}; + + + void DxvkOptions::adjustAppOptions(const std::string& appName) { + auto appOptions = g_appOptions.find(appName); + + if (appOptions != g_appOptions.end()) + m_options.set(appOptions->second); + } + + + void DxvkOptions::adjustDeviceOptions(const Rc& adapter) { + + } + + + void DxvkOptions::logOptions() const { + #define LOG_OPTION(opt) this->logOption(DxvkOption::opt, #opt) + LOG_OPTION(AssumeNoZfight); + #undef LOG_OPTION + } + + + void DxvkOptions::logOption( + DxvkOption option, + const std::string& name) const { + if (m_options.test(option)) + Logger::info(str::format("Using option ", name)); + } + +} \ No newline at end of file diff --git a/src/dxvk/dxvk_options.h b/src/dxvk/dxvk_options.h new file mode 100644 index 00000000..a92c74c4 --- /dev/null +++ b/src/dxvk/dxvk_options.h @@ -0,0 +1,81 @@ +#pragma once + +#include "dxvk_adapter.h" + +namespace dxvk { + + /** + * \brief App- and driver-specific options + */ + enum class DxvkOption : uint64_t { + /// Assume that the application will not render + /// multiple polygons with the exact same depth + /// value. Allows out-of-order rasterization to + /// be enabled for more rendering modes. + AssumeNoZfight = 0, + }; + + using DxvkOptionSet = Flags; + + + /** + * \brief Option collection + * + * Stores the options enabled for a given + * device when running a given application. + */ + class DxvkOptions { + + public: + + /** + * \brief Checks whether an option is enabled + * \returns \c true if the option is enabled + */ + bool test(DxvkOption opt) const { + return m_options.test(opt); + } + + /** + * \brief Sets app-specific options + * + * Application bugs and performance characteristics + * may require workarounds to be enabled, or allow + * for certain non-standard optimizations to be used. + * \param [in] appName Application name + * \returns Application options + */ + void adjustAppOptions( + const std::string& appName); + + /** + * \brief Adjusts options for a specific driver + * + * Driver bugs and performance characteristics may + * require some options to be enabled or disabled. + * \param [in] options Application options + * \param [in] adapter The adapter + * \returns Device options + */ + void adjustDeviceOptions( + const Rc& adapter); + + /** + * \brief Logs enabled options + * + * Informs the user about any options that + * are enabled. May help with debugging. + */ + void logOptions() const; + + private: + + DxvkOptionSet m_options = { 0ull }; + + void logOption( + DxvkOption option, + const std::string& name) const; + + }; + +} \ No newline at end of file diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index 687b7eb2..ae49a983 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -23,6 +23,7 @@ dxvk_src = files([ 'dxvk_lifetime.cpp', 'dxvk_main.cpp', 'dxvk_memory.cpp', + 'dxvk_options.cpp', 'dxvk_pipecache.cpp', 'dxvk_pipelayout.cpp', 'dxvk_pipemanager.cpp', diff --git a/src/util/util_flags.h b/src/util/util_flags.h index 1d176779..4dc07e46 100644 --- a/src/util/util_flags.h +++ b/src/util/util_flags.h @@ -28,11 +28,19 @@ namespace dxvk { m_bits |= bits(fx...); } + void set(Flags flags) { + m_bits |= flags.m_bits; + } + template void clr(Tx... fx) { m_bits &= ~bits(fx...); } + void clr(Flags flags) { + m_bits &= ~flags.m_bits; + } + template bool any(Tx... fx) const { return (m_bits & bits(fx...)) != 0;