From a75c59613266ae035b6936c83ee8b9c885e0f2af Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 23 Nov 2018 16:11:46 +0100 Subject: [PATCH] [d3d11] Add config option to enable TGSM initialization --- src/d3d11/d3d11_device.cpp | 2 +- src/d3d11/d3d11_options.cpp | 1 + src/d3d11/d3d11_options.h | 6 ++++++ src/dxbc/dxbc_options.cpp | 6 ++++-- src/dxbc/dxbc_options.h | 4 +++- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index a73bd4903..6dd1d55d7 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -104,7 +104,7 @@ namespace dxvk { m_dxvkDevice (pDxgiDevice->GetDXVKDevice()), m_dxvkAdapter (m_dxvkDevice->adapter()), m_d3d11Options (m_dxvkAdapter->instance()->config()), - m_dxbcOptions (m_dxvkDevice) { + m_dxbcOptions (m_dxvkDevice, m_d3d11Options) { Com adapter; if (FAILED(pDxgiDevice->GetAdapter(&adapter)) diff --git a/src/d3d11/d3d11_options.cpp b/src/d3d11/d3d11_options.cpp index 6ec510ca7..037838b21 100644 --- a/src/d3d11/d3d11_options.cpp +++ b/src/d3d11/d3d11_options.cpp @@ -8,6 +8,7 @@ namespace dxvk { this->allowMapFlagNoWait = config.getOption("d3d11.allowMapFlagNoWait", false); this->dcSingleUseMode = config.getOption("d3d11.dcSingleUseMode", true); this->fakeStreamOutSupport = config.getOption("d3d11.fakeStreamOutSupport", false); + this->zeroInitWorkgroupMemory = config.getOption("d3d11.zeroInitWorkgroupMemory", false); this->maxTessFactor = config.getOption("d3d11.maxTessFactor", 0); this->samplerAnisotropy = config.getOption("d3d11.samplerAnisotropy", -1); this->deferSurfaceCreation = config.getOption("dxgi.deferSurfaceCreation", false); diff --git a/src/d3d11/d3d11_options.h b/src/d3d11/d3d11_options.h index 1aaed8a57..551018e97 100644 --- a/src/d3d11/d3d11_options.h +++ b/src/d3d11/d3d11_options.h @@ -41,6 +41,12 @@ namespace dxvk { /// Stream Output is properly supported in DXVK. bool fakeStreamOutSupport; + /// Zero-initialize workgroup memory + /// + /// Workargound for games that don't initialize + /// TGSM in compute shaders before reading it. + bool zeroInitWorkgroupMemory; + /// Maximum tessellation factor. /// /// Limits tessellation factors in tessellation diff --git a/src/dxbc/dxbc_options.cpp b/src/dxbc/dxbc_options.cpp index 74a4b5d8b..a7acccceb 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -1,4 +1,4 @@ -#include +#include "../d3d11/d3d11_options.h" #include "dxbc_options.h" @@ -9,7 +9,7 @@ namespace dxvk { } - DxbcOptions::DxbcOptions(const Rc& device) { + DxbcOptions::DxbcOptions(const Rc& device, const D3D11Options& options) { const DxvkDeviceFeatures& devFeatures = device->features(); const DxvkDeviceInfo& devInfo = device->adapter()->devicePropertiesExt(); @@ -22,6 +22,8 @@ namespace dxvk { useSubgroupOpsClustered = useSubgroupOpsForEarlyDiscard && (devInfo.coreSubgroup.supportedOperations & VK_SUBGROUP_FEATURE_CLUSTERED_BIT); + zeroInitWorkgroupMemory = options.zeroInitWorkgroupMemory; + // Disable early discard on Nvidia because it may hurt performance if (DxvkGpuVendor(devInfo.core.properties.vendorID) == DxvkGpuVendor::Nvidia) { useSubgroupOpsForEarlyDiscard = false; diff --git a/src/dxbc/dxbc_options.h b/src/dxbc/dxbc_options.h index f20fca4f4..54b9c0a02 100644 --- a/src/dxbc/dxbc_options.h +++ b/src/dxbc/dxbc_options.h @@ -3,10 +3,12 @@ #include "../dxvk/dxvk_device.h" namespace dxvk { + + struct D3D11Options; struct DxbcOptions { DxbcOptions(); - DxbcOptions(const Rc& device); + DxbcOptions(const Rc& device, const D3D11Options& options); /// Use the ShaderImageReadWithoutFormat capability. bool useStorageImageReadWithoutFormat = false;