[d3d11] Replace apitrace mode option with something more granular

And enable it only for vertex and index buffers in Nier Replicant.
This commit is contained in:
Philip Rebohle 2022-02-28 22:44:10 +01:00
parent b42c07253e
commit 2bceeff5f2
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
5 changed files with 44 additions and 23 deletions

View File

@ -247,7 +247,10 @@ namespace dxvk {
break;
}
if (memoryFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT && m_parent->GetOptions()->apitraceMode) {
bool useCached = (m_parent->GetOptions()->cachedDynamicResources == ~0u)
|| (m_parent->GetOptions()->cachedDynamicResources & m_desc.BindFlags);
if ((memoryFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) && useCached) {
memoryFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
| VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
}

View File

@ -38,15 +38,27 @@ namespace dxvk {
this->constantBufferRangeCheck = config.getOption<bool>("d3d11.constantBufferRangeCheck", false)
&& DxvkGpuVendor(devInfo.core.properties.vendorID) != DxvkGpuVendor::Amd;
bool apitraceAttached = false;
apitraceAttached = ::GetModuleHandle("dxgitrace.dll") != nullptr;
auto cachedDynamicResources = config.getOption<std::string>("d3d11.cachedDynamicResources", std::string());
this->apitraceMode = config.getOption<bool>("d3d11.apitraceMode", apitraceAttached);
if (::GetModuleHandle("dxgitrace.dll")) {
// apitrace reads back all mapped resources on the CPU, so
// allocating everything in cached memory is necessary to
// achieve acceptable performance
this->cachedDynamicResources = ~0u;
} else {
this->cachedDynamicResources = 0u;
// Inform user in case they have the option enabled or a game
// ships a file called dxgitrace.dll for whatever reason.
if (this->apitraceMode)
Logger::warn("D3D11: Apitrace mode enabled, may affect performance!");
for (char c : cachedDynamicResources) {
switch (c) {
case 'c': this->cachedDynamicResources |= D3D11_BIND_CONSTANT_BUFFER; break;
case 'v': this->cachedDynamicResources |= D3D11_BIND_VERTEX_BUFFER; break;
case 'i': this->cachedDynamicResources |= D3D11_BIND_INDEX_BUFFER; break;
case 'r': this->cachedDynamicResources |= D3D11_BIND_SHADER_RESOURCE; break;
case 'a': this->cachedDynamicResources = ~0u; break;
default: Logger::warn(str::format("Unknown flag for d3d11.cachedDynamicResources option: ", c));
}
}
}
}
}

View File

@ -9,7 +9,7 @@
#include "d3d11_include.h"
namespace dxvk {
struct D3D11Options {
D3D11Options(const Config& config, const Rc<DxvkDevice>& device);
@ -107,9 +107,10 @@ namespace dxvk {
/// performs the required shader and resolve fixups.
bool disableMsaa;
/// Apitrace mode: Maps all buffers in cached memory.
/// Enabled automatically if dxgitrace.dll is attached.
bool apitraceMode;
/// Dynamic resources with the given bind flags will be allocated
/// in cached system memory. Enabled automatically when recording
/// an api trace.
uint32_t cachedDynamicResources;
};
}

View File

@ -532,7 +532,10 @@ namespace dxvk {
VkMemoryPropertyFlags memoryFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
if ((m_desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ) || m_device->GetOptions()->apitraceMode)
bool useCached = (m_device->GetOptions()->cachedDynamicResources == ~0u)
|| (m_device->GetOptions()->cachedDynamicResources & m_desc.BindFlags);
if (m_desc.Usage == D3D11_USAGE_STAGING || useCached)
memoryFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
else if (m_desc.Usage == D3D11_USAGE_DEFAULT || m_desc.BindFlags)
memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
@ -609,7 +612,9 @@ namespace dxvk {
VkMemoryPropertyFlags memType = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
if (m_desc.Usage == D3D11_USAGE_STAGING || m_device->GetOptions()->apitraceMode)
bool useCached = m_device->GetOptions()->cachedDynamicResources == ~0u;
if (m_desc.Usage == D3D11_USAGE_STAGING || useCached)
memType |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
MappedBuffer result;

View File

@ -117,7 +117,7 @@ namespace dxvk {
{ R"(\\NieR Replicant ver\.1\.22474487139\.exe)", {{
{ "dxgi.syncInterval", "1" },
{ "dxgi.maxFrameRate", "60" },
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "vi" },
}} },
/* SteamVR performance test */
{ R"(\\vr\.exe$)", {{
@ -148,13 +148,13 @@ namespace dxvk {
* game parts */
{ R"(\\Crysis3\.exe$)", {{
{ "dxgi.customVendorId", "10de" },
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "a" },
}} },
/* Crysis 3 Remastered *
* Apitrace mode helps massively in cpu bound *
* game parts */
{ R"(\\Crysis3Remastered\.exe$)", {{
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "a" },
}} },
/* Atelier series - games try to render video *
* with a D3D9 swap chain over the DXGI swap *
@ -202,23 +202,23 @@ namespace dxvk {
/* Darksiders Warmastered - apparently reads *
* from write-only mapped buffers */
{ R"(\\darksiders1\.exe$)", {{
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "a" },
}} },
/* Monster Hunter World */
{ R"(\\MonsterHunterWorld\.exe$)", {{
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "a" },
}} },
/* Kingdome Come: Deliverance */
{ R"(\\KingdomCome\.exe$)", {{
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "a" },
}} },
/* Homefront: The Revolution */
{ R"(\\Homefront2_Release\.exe$)", {{
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "a" },
}} },
/* Sniper Ghost Warrior Contracts */
{ R"(\\SGWContracts\.exe$)", {{
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "a" },
}} },
/* Shadow of the Tomb Raider - invariant *
* position breaks character rendering on NV */
@ -258,7 +258,7 @@ namespace dxvk {
}} },
/* AoE 2 DE - runs poorly for some users */
{ R"(\\AoE2DE_s\.exe$)", {{
{ "d3d11.apitraceMode", "True" },
{ "d3d11.cachedDynamicResources", "a" },
}} },
/* Total War: Warhammer III */
{ R"(\\Warhammer3\.exe$)", {{