1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 10:54:16 +01:00

[d3d9] Use ATTACHMENT_OPTIMAL layout for render targets

Significantly improves GPU-bound performance on RADV in a number of games.
This commit is contained in:
Philip Rebohle 2021-02-26 05:24:15 +01:00 committed by Joshie
parent 1b97ca253f
commit dcf4599c98
4 changed files with 18 additions and 4 deletions

View File

@ -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)

View File

@ -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;
};

View File

@ -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;

View File

@ -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);