From dcf4599c98ddcb568ba041dca618db1d53a52dc8 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 26 Feb 2021 05:24:15 +0100 Subject: [PATCH] [d3d9] Use ATTACHMENT_OPTIMAL layout for render targets Significantly improves GPU-bound performance on RADV in a number of games. --- src/d3d9/d3d9_common_texture.cpp | 7 ++++++- src/d3d9/d3d9_common_texture.h | 7 ++++--- src/d3d9/d3d9_device.cpp | 7 +++++++ src/d3d9/d3d9_swapchain.cpp | 1 + 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/d3d9/d3d9_common_texture.cpp b/src/d3d9/d3d9_common_texture.cpp index 5ddd8341..6dd2f19a 100644 --- a/src/d3d9/d3d9_common_texture.cpp +++ b/src/d3d9/d3d9_common_texture.cpp @@ -401,7 +401,7 @@ namespace dxvk { } - VkImageLayout D3D9CommonTexture::OptimizeLayout(VkImageUsageFlags Usage) { + VkImageLayout D3D9CommonTexture::OptimizeLayout(VkImageUsageFlags Usage) const { const VkImageUsageFlags usageFlags = Usage; // Filter out unnecessary flags. Transfer operations @@ -409,6 +409,11 @@ namespace dxvk { Usage &= ~(VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); + // Ignore sampled bit in case the image was created with + // an image flag that only allows attachment usage + if (m_desc.IsAttachmentOnly) + Usage &= ~VK_IMAGE_USAGE_SAMPLED_BIT; + // If the image is used only as an attachment, we never // have to transform the image back to a different layout if (Usage == VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) diff --git a/src/d3d9/d3d9_common_texture.h b/src/d3d9/d3d9_common_texture.h index 05f79137..7dd77e8f 100644 --- a/src/d3d9/d3d9_common_texture.h +++ b/src/d3d9/d3d9_common_texture.h @@ -43,6 +43,7 @@ namespace dxvk { D3DMULTISAMPLE_TYPE MultiSample; DWORD MultisampleQuality; BOOL IsBackBuffer; + BOOL IsAttachmentOnly; }; struct D3D9ColorView { @@ -473,6 +474,9 @@ namespace dxvk { return D3D9_COMMON_TEXTURE_MAP_MODE_BACKED; } + VkImageLayout OptimizeLayout( + VkImageUsageFlags Usage) const; + static VkImageType GetImageTypeFromResourceType( D3DRESOURCETYPE Dimension); @@ -480,9 +484,6 @@ namespace dxvk { D3DRESOURCETYPE Dimension, UINT Layer); - static VkImageLayout OptimizeLayout( - VkImageUsageFlags Usage); - static constexpr UINT AllLayers = UINT32_MAX; }; diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 241d18b9..8d9e9831 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -394,6 +394,7 @@ namespace dxvk { desc.MultiSample = D3DMULTISAMPLE_NONE; desc.MultisampleQuality = 0; desc.IsBackBuffer = FALSE; + desc.IsAttachmentOnly = FALSE; if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; @@ -449,6 +450,7 @@ namespace dxvk { desc.MultiSample = D3DMULTISAMPLE_NONE; desc.MultisampleQuality = 0; desc.IsBackBuffer = FALSE; + desc.IsAttachmentOnly = FALSE; if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; @@ -494,6 +496,7 @@ namespace dxvk { desc.MultiSample = D3DMULTISAMPLE_NONE; desc.MultisampleQuality = 0; desc.IsBackBuffer = FALSE; + desc.IsAttachmentOnly = FALSE; if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; @@ -3381,6 +3384,7 @@ namespace dxvk { desc.MultiSample = MultiSample; desc.MultisampleQuality = MultisampleQuality; desc.IsBackBuffer = FALSE; + desc.IsAttachmentOnly = TRUE; if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; @@ -3425,6 +3429,7 @@ namespace dxvk { desc.MultiSample = D3DMULTISAMPLE_NONE; desc.MultisampleQuality = 0; desc.IsBackBuffer = FALSE; + desc.IsAttachmentOnly = Pool == D3DPOOL_DEFAULT; if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; @@ -3471,6 +3476,7 @@ namespace dxvk { desc.MultiSample = MultiSample; desc.MultisampleQuality = MultisampleQuality; desc.IsBackBuffer = FALSE; + desc.IsAttachmentOnly = TRUE; if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; @@ -6953,6 +6959,7 @@ namespace dxvk { desc.MultiSample = pPresentationParameters->MultiSampleType; desc.MultisampleQuality = pPresentationParameters->MultiSampleQuality; desc.IsBackBuffer = FALSE; + desc.IsAttachmentOnly = TRUE; if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_NOTAVAILABLE; diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index b8bde73a..d516a9b5 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -1070,6 +1070,7 @@ namespace dxvk { desc.Usage = D3DUSAGE_RENDERTARGET; desc.Discard = FALSE; desc.IsBackBuffer = TRUE; + desc.IsAttachmentOnly = FALSE; for (uint32_t i = 0; i < m_backBuffers.size(); i++) m_backBuffers[i] = new D3D9Surface(m_parent, &desc, this);