From b2c4855490127d85f845b6664012923b5822751a Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 7 Aug 2018 16:42:21 +0200 Subject: [PATCH] [dxvk] Use global user config for backend options --- src/dxvk/dxvk_device.cpp | 5 +++-- src/dxvk/dxvk_device.h | 11 +++++++++++ src/dxvk/dxvk_memory.cpp | 15 ++++++++------- src/dxvk/dxvk_memory.h | 5 ++--- src/dxvk/dxvk_options.cpp | 10 ++++++++++ src/dxvk/dxvk_options.h | 18 ++++++++++++++++++ src/dxvk/dxvk_pipemanager.cpp | 3 +-- src/dxvk/meson.build | 1 + 8 files changed, 54 insertions(+), 14 deletions(-) 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 d520fb18a..13f637c86 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -8,12 +8,13 @@ namespace dxvk { const Rc& vkd, const DxvkDeviceExtensions& extensions, const DxvkDeviceFeatures& features) - : m_adapter (adapter), + : m_options (adapter->instance()->config()), + m_adapter (adapter), m_vkd (vkd), m_extensions (extensions), m_features (features), m_properties (adapter->deviceProperties()), - m_memory (new DxvkMemoryAllocator (adapter, vkd)), + m_memory (new DxvkMemoryAllocator (this)), m_renderPassPool (new DxvkRenderPassPool (vkd)), m_pipelineManager (new DxvkPipelineManager (this)), m_metaClearObjects (new DxvkMetaClearObjects (vkd)), diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index 890385691..d5409c759 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -10,6 +10,7 @@ #include "dxvk_image.h" #include "dxvk_memory.h" #include "dxvk_meta_clear.h" +#include "dxvk_options.h" #include "dxvk_pipecache.h" #include "dxvk_pipemanager.h" #include "dxvk_queue.h" @@ -84,6 +85,14 @@ namespace dxvk { VkDevice handle() const { return m_vkd->device(); } + + /** + * \brief Device options + * \returns Device options + */ + const DxvkOptions& config() const { + return m_options; + } /** * \brief Graphics queue properties @@ -371,6 +380,8 @@ namespace dxvk { private: + DxvkOptions m_options; + Rc m_adapter; Rc m_vkd; DxvkDeviceExtensions m_extensions; diff --git a/src/dxvk/dxvk_memory.cpp b/src/dxvk/dxvk_memory.cpp index 3f6a3d4fe..b8db2faee 100644 --- a/src/dxvk/dxvk_memory.cpp +++ b/src/dxvk/dxvk_memory.cpp @@ -1,3 +1,4 @@ +#include "dxvk_device.h" #include "dxvk_memory.h" namespace dxvk { @@ -141,12 +142,11 @@ namespace dxvk { } - DxvkMemoryAllocator::DxvkMemoryAllocator( - const Rc& adapter, - const Rc& vkd) - : m_vkd (vkd), - m_devProps(adapter->deviceProperties()), - m_memProps(adapter->memoryProperties()) { + DxvkMemoryAllocator::DxvkMemoryAllocator(const DxvkDevice* device) + : m_vkd (device->vkd()), + m_devProps (device->adapter()->deviceProperties()), + m_memProps (device->adapter()->memoryProperties()), + m_allowOvercommit (device->config().allowMemoryOvercommit) { for (uint32_t i = 0; i < m_memProps.memoryHeapCount; i++) { VkDeviceSize heapSize = m_memProps.memoryHeaps[i].size; @@ -269,7 +269,8 @@ namespace dxvk { VkDeviceSize size, const VkMemoryDedicatedAllocateInfoKHR* dedAllocInfo) { if ((type->memType.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) - && (type->heap->stats.memoryAllocated + size > type->heap->properties.size)) + && (type->heap->stats.memoryAllocated + size > type->heap->properties.size) + && (!m_allowOvercommit)) return DxvkDeviceMemory(); DxvkDeviceMemory result; diff --git a/src/dxvk/dxvk_memory.h b/src/dxvk/dxvk_memory.h index c98af877a..129db1d78 100644 --- a/src/dxvk/dxvk_memory.h +++ b/src/dxvk/dxvk_memory.h @@ -213,9 +213,7 @@ namespace dxvk { friend class DxvkMemoryChunk; public: - DxvkMemoryAllocator( - const Rc& adapter, - const Rc& vkd); + DxvkMemoryAllocator(const DxvkDevice* device); ~DxvkMemoryAllocator(); /** @@ -256,6 +254,7 @@ namespace dxvk { const Rc m_vkd; const VkPhysicalDeviceProperties m_devProps; const VkPhysicalDeviceMemoryProperties m_memProps; + const bool m_allowOvercommit; std::mutex m_mutex; std::array m_memHeaps; diff --git a/src/dxvk/dxvk_options.cpp b/src/dxvk/dxvk_options.cpp new file mode 100644 index 000000000..5c39ddac6 --- /dev/null +++ b/src/dxvk/dxvk_options.cpp @@ -0,0 +1,10 @@ +#include "dxvk_options.h" + +namespace dxvk { + + DxvkOptions::DxvkOptions(const Config& config) { + allowMemoryOvercommit = config.getOption("dxvk.allowMemoryOvercommit", false); + useAsyncPipeCompiler = config.getOption("dxvk.useAsyncPipeCompiler", false); + } + +} \ 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 000000000..23471c046 --- /dev/null +++ b/src/dxvk/dxvk_options.h @@ -0,0 +1,18 @@ +#pragma once + +#include "../util/config/config.h" + +namespace dxvk { + + struct DxvkOptions { + DxvkOptions(const Config& config); + + /// Allow allocating more memory from + /// a heap than the device supports. + bool allowMemoryOvercommit; + + /// Enable asynchronous pipeline compilation. + bool useAsyncPipeCompiler; + }; + +} \ No newline at end of file diff --git a/src/dxvk/dxvk_pipemanager.cpp b/src/dxvk/dxvk_pipemanager.cpp index 6e8144b8d..a2455c24f 100644 --- a/src/dxvk/dxvk_pipemanager.cpp +++ b/src/dxvk/dxvk_pipemanager.cpp @@ -42,8 +42,7 @@ namespace dxvk { : m_device (device), m_cache (new DxvkPipelineCache(device->vkd())), m_compiler(nullptr) { - // Async shader compilation is opt-in for now - if (env::getEnvVar(L"DXVK_USE_PIPECOMPILER") == "1") + if (m_device->config().useAsyncPipeCompiler) m_compiler = new DxvkPipelineCompiler(); } diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index 46bf0899f..5eef2f1bc 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -56,6 +56,7 @@ dxvk_src = files([ 'dxvk_meta_mipgen.cpp', 'dxvk_meta_resolve.cpp', 'dxvk_openvr.cpp', + 'dxvk_options.cpp', 'dxvk_pipecache.cpp', 'dxvk_pipecompiler.cpp', 'dxvk_pipelayout.cpp',