From 0c0d582f241411e8a49ed1e58e8a4f2f38689209 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 19 May 2020 18:54:25 +0200 Subject: [PATCH] [dxvk] Default to fragment shader resolved on official AMD drivers Improves performance of MSAA resolves. RADV does not benefit. --- src/dxvk/dxvk_context.cpp | 13 ++++++++++--- src/dxvk/dxvk_device.cpp | 3 +++ src/dxvk/dxvk_device.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 2a4ad227..427c5dc9 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1594,9 +1594,16 @@ namespace dxvk { if (format == VK_FORMAT_UNDEFINED) format = srcImage->info().format; - - if (srcImage->info().format == format - && dstImage->info().format == format) { + + bool useFb = srcImage->info().format != format + || dstImage->info().format != format; + + if (m_device->perfHints().preferFbResolve) { + useFb |= (dstImage->info().usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + && (srcImage->info().usage & VK_IMAGE_USAGE_SAMPLED_BIT); + } + + if (!useFb) { this->resolveImageHw( dstImage, srcImage, region); } else { diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index b1d52080..c3610618 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -261,6 +261,9 @@ namespace dxvk { && (m_adapter->matchesDriver(DxvkGpuVendor::Amd, VK_DRIVER_ID_MESA_RADV_KHR, 0, 0) || m_adapter->matchesDriver(DxvkGpuVendor::Amd, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR, 0, 0) || m_adapter->matchesDriver(DxvkGpuVendor::Amd, VK_DRIVER_ID_AMD_PROPRIETARY_KHR, 0, 0)); + hints.preferFbResolve = m_extensions.amdShaderFragmentMask + && (m_adapter->matchesDriver(DxvkGpuVendor::Amd, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR, 0, 0) + || m_adapter->matchesDriver(DxvkGpuVendor::Amd, VK_DRIVER_ID_AMD_PROPRIETARY_KHR, 0, 0)); return hints; } diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index c952d829..e2960b10 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -42,6 +42,7 @@ namespace dxvk { */ struct DxvkDevicePerfHints { VkBool32 preferFbDepthStencilCopy : 1; + VkBool32 preferFbResolve : 1; }; /**