diff --git a/dxvk.conf b/dxvk.conf index 1e2592ba9..f6acc2009 100644 --- a/dxvk.conf +++ b/dxvk.conf @@ -227,18 +227,18 @@ # dxvk.useRawSsbo = Auto -# Controls workaround for NVIDIA HVV Heap bug. +# Controls Nvidia HVV behaviour. # -# Limits the budget of NVIDIA's HVV (host-visible, -# device-local) heap to be half of the reported size. This is -# needed to avoid NVIDIA driver bug 3114283, and defaults to -# being enabled on all affected drivers. +# Disables the host-visible, device-local heap on Nvidia drivers. This +# is used to avoid NVIDIA driver bug 3114283 on affected drivers, as +# well as in specific games on newer drivers.being enabled on all +# affected drivers. # # Supported values: # - Auto: Don't change the default # - True, False: Always enable / disable -# dxvk.halveNvidiaHVVHeap = Auto +# dxvk.disableNvidiaHvvHeap = Auto # Sets enabled HUD elements diff --git a/src/dxvk/dxvk_memory.cpp b/src/dxvk/dxvk_memory.cpp index 9a0656a85..556927e34 100644 --- a/src/dxvk/dxvk_memory.cpp +++ b/src/dxvk/dxvk_memory.cpp @@ -178,27 +178,22 @@ namespace dxvk { } /* Work around an issue on Nvidia drivers where using the entire - * device_local | host_visible heap can cause crashes, presumably - * due to subsequent internal driver allocations failing */ - bool nvidiaBug3114283Active = false; + * device_local | host_visible heap can cause crashes or slowdowns */ + if (m_device->properties().core.properties.vendorID == uint16_t(DxvkGpuVendor::Nvidia)) { + bool shrinkNvidiaHvvHeap = device->adapter()->matchesDriver(DxvkGpuVendor::Nvidia, + VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR, 0, VK_MAKE_VERSION(465, 0, 0)); - // Fix is available in mainline drivers starting with the 465 driver series. - if (device->adapter()->matchesDriver(DxvkGpuVendor::Nvidia, - VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR, - 0, - VK_MAKE_VERSION(465, 0, 0))) { - nvidiaBug3114283Active = true; - } + applyTristate(shrinkNvidiaHvvHeap, device->config().shrinkNvidiaHvvHeap); - applyTristate(nvidiaBug3114283Active, device->config().halveNvidiaHVVHeap); + if (shrinkNvidiaHvvHeap) { + for (uint32_t i = 0; i < m_memProps.memoryTypeCount; i++) { + VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; - if ((m_device->properties().core.properties.vendorID == uint16_t(DxvkGpuVendor::Nvidia)) - && (nvidiaBug3114283Active)) { - for (uint32_t i = 0; i < m_memProps.memoryTypeCount; i++) { - constexpr VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; - - if ((m_memTypes[i].memType.propertyFlags & flags) == flags) - m_memTypes[i].heap->budget = m_memTypes[i].heap->properties.size / 2; + if ((m_memTypes[i].memType.propertyFlags & flags) == flags) { + m_memTypes[i].heap->budget = 32 << 20; + m_memTypes[i].chunkSize = 1 << 20; + } + } } } } diff --git a/src/dxvk/dxvk_options.cpp b/src/dxvk/dxvk_options.cpp index 8b62af167..ef898dcb6 100644 --- a/src/dxvk/dxvk_options.cpp +++ b/src/dxvk/dxvk_options.cpp @@ -8,7 +8,7 @@ namespace dxvk { enableOpenXR = config.getOption ("dxvk.enableOpenXR", true); numCompilerThreads = config.getOption ("dxvk.numCompilerThreads", 0); useRawSsbo = config.getOption("dxvk.useRawSsbo", Tristate::Auto); - halveNvidiaHVVHeap = config.getOption("dxvk.halveNvidiaHVVHeap", Tristate::Auto); + shrinkNvidiaHvvHeap = config.getOption("dxvk.shrinkNvidiaHvvHeap", Tristate::Auto); hud = config.getOption("dxvk.hud", ""); } diff --git a/src/dxvk/dxvk_options.h b/src/dxvk/dxvk_options.h index 343cba0a3..88611b4c8 100644 --- a/src/dxvk/dxvk_options.h +++ b/src/dxvk/dxvk_options.h @@ -24,11 +24,8 @@ namespace dxvk { /// Shader-related options Tristate useRawSsbo; - /// Workaround for NVIDIA driver - /// bug 3114283. Cut usable HVV - /// (Host-Visible Vidmem) heap - /// in half to avoid crash - Tristate halveNvidiaHVVHeap; + /// Workaround for NVIDIA driver bug 3114283 + Tristate shrinkNvidiaHvvHeap; /// HUD elements std::string hud;