From bd03225c141b09a467bd36bb69b3dcd3cd7577ce Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 9 Nov 2018 08:41:02 +0100 Subject: [PATCH] [dxbc] Refactor DxbcOptions A bit mask isn't good enough going forward, and we also don't need application-specific options for now. --- src/d3d11/d3d11_device.cpp | 3 +-- src/dxbc/dxbc_compiler.cpp | 8 ++++---- src/dxbc/dxbc_options.cpp | 30 ++++++++---------------------- src/dxbc/dxbc_options.h | 27 ++++++--------------------- 4 files changed, 19 insertions(+), 49 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 00d8dffd4..1607af6c9 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -103,8 +103,7 @@ namespace dxvk { m_dxvkDevice (pDxgiDevice->GetDXVKDevice()), m_dxvkAdapter (m_dxvkDevice->adapter()), m_d3d11Options (m_dxvkAdapter->instance()->config()), - m_dxbcOptions (getDxbcAppOptions(env::getExeName()) | - getDxbcDeviceOptions(m_dxvkDevice)) { + m_dxbcOptions (m_dxvkDevice) { Com adapter; if (FAILED(pDxgiDevice->GetAdapter(&adapter)) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index a0b8a5132..13a6f2761 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -852,7 +852,7 @@ namespace dxvk { const bool isUav = ins.op == DxbcOpcode::DclUavTyped; if (isUav) { - if (m_moduleInfo.options.test(DxbcOption::UseStorageImageReadWithoutFormat)) + if (m_moduleInfo.options.useStorageImageReadWithoutFormat) m_module.enableCapability(spv::CapabilityStorageImageReadWithoutFormat); m_module.enableCapability(spv::CapabilityStorageImageWriteWithoutFormat); } @@ -913,7 +913,7 @@ namespace dxvk { if (isUav) { if ((m_analysis->uavInfos[registerId].accessAtomicOp) || (m_analysis->uavInfos[registerId].accessTypedLoad - && !m_moduleInfo.options.test(DxbcOption::UseStorageImageReadWithoutFormat))) + && !m_moduleInfo.options.useStorageImageReadWithoutFormat)) imageFormat = getScalarImageFormat(sampledType); } @@ -952,7 +952,7 @@ namespace dxvk { // On GPUs which don't support storageImageReadWithoutFormat, // we have to decorate untyped UAVs as write-only if (isUav && imageFormat == spv::ImageFormatUnknown - && !m_moduleInfo.options.test(DxbcOption::UseStorageImageReadWithoutFormat)) + && !m_moduleInfo.options.useStorageImageReadWithoutFormat) m_module.decorate(varId, spv::DecorationNonReadable); // Declare a specialization constant which will @@ -6147,7 +6147,7 @@ namespace dxvk { // We may have to defer kill operations to the end of // the shader in order to keep derivatives correct. - if (m_analysis->usesKill && m_analysis->usesDerivatives && m_moduleInfo.options.test(DxbcOption::DeferKill)) { + if (m_analysis->usesKill && m_analysis->usesDerivatives && m_moduleInfo.options.deferKill) { m_ps.killState = m_module.newVarInit( m_module.defPointerType(m_module.defBoolType(), spv::StorageClassPrivate), spv::StorageClassPrivate, m_module.constBool(false)); diff --git a/src/dxbc/dxbc_options.cpp b/src/dxbc/dxbc_options.cpp index c7c408aef..a14039ed3 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -4,30 +4,16 @@ namespace dxvk { - const static std::unordered_map g_dxbcAppOptions = {{ - - }}; - - - DxbcOptions getDxbcAppOptions(const std::string& appName) { - auto appOptions = g_dxbcAppOptions.find(appName); - - return appOptions != g_dxbcAppOptions.end() - ? appOptions->second - : DxbcOptions(); + DxbcOptions::DxbcOptions() { + } - - - DxbcOptions getDxbcDeviceOptions(const Rc& device) { - DxbcOptions flags; - + + + DxbcOptions::DxbcOptions(const Rc& device) { const DxvkDeviceFeatures& devFeatures = device->features(); - - if (devFeatures.core.features.shaderStorageImageReadWithoutFormat) - flags.set(DxbcOption::UseStorageImageReadWithoutFormat); - - flags.set(DxbcOption::DeferKill); - return flags; + + useStorageImageReadWithoutFormat = devFeatures.core.features.shaderStorageImageReadWithoutFormat; + deferKill = true; } } \ No newline at end of file diff --git a/src/dxbc/dxbc_options.h b/src/dxbc/dxbc_options.h index 20c4eb70f..e902659d5 100644 --- a/src/dxbc/dxbc_options.h +++ b/src/dxbc/dxbc_options.h @@ -4,33 +4,18 @@ namespace dxvk { - enum class DxbcOption : uint64_t { + struct DxbcOptions { + DxbcOptions(); + DxbcOptions(const Rc& device); + /// Use the ShaderImageReadWithoutFormat capability. /// Enabled by default on GPUs which support this. - UseStorageImageReadWithoutFormat, + bool useStorageImageReadWithoutFormat = false; /// Defer kill operation to the end of the shader. /// Fixes derivatives that are undefined due to /// non-uniform control flow in fragment shaders. - DeferKill, + bool deferKill = false; }; - using DxbcOptions = Flags; - - /** - * \brief Gets app-specific DXBC options - * - * \param [in] appName Application name - * \returns DXBC options for this application - */ - DxbcOptions getDxbcAppOptions(const std::string& appName); - - /** - * \brief Gets device-specific options - * - * \param [in] device The device - * \returns Device options - */ - DxbcOptions getDxbcDeviceOptions(const Rc& device); - } \ No newline at end of file