From 4b0a5dffb27915e5574d7b238780a914097b4de3 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 16 Oct 2019 18:35:57 +0200 Subject: [PATCH] [dxvk] Support component mappings in blitter --- src/dxvk/dxvk_context.cpp | 12 +++++++++--- src/dxvk/dxvk_context.h | 3 +++ src/dxvk/dxvk_meta_blit.cpp | 9 +++++---- src/dxvk/dxvk_meta_blit.h | 5 +++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 1af7090d..82b09d2c 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -265,17 +265,22 @@ namespace dxvk { void DxvkContext::blitImage( const Rc& dstImage, + const VkComponentMapping& dstMapping, const Rc& srcImage, + const VkComponentMapping& srcMapping, const VkImageBlit& region, VkFilter filter) { this->spillRenderPass(); + auto mapping = util::resolveSrcComponentMapping(dstMapping, srcMapping); + bool canUseFb = (srcImage->info().usage & VK_IMAGE_USAGE_SAMPLED_BIT) && (dstImage->info().usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && ((dstImage->info().flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR) || (dstImage->info().type != VK_IMAGE_TYPE_3D)); - bool useFb = dstImage->info().sampleCount != VK_SAMPLE_COUNT_1_BIT; + bool useFb = dstImage->info().sampleCount != VK_SAMPLE_COUNT_1_BIT + || !util::isIdentityMapping(mapping); if (!useFb) { this->blitImageHw( @@ -284,7 +289,7 @@ namespace dxvk { } else if (canUseFb) { this->blitImageFb( dstImage, srcImage, - region, filter); + region, mapping, filter); } else { Logger::err("DxvkContext: Unsupported blit operation"); } @@ -2396,6 +2401,7 @@ namespace dxvk { const Rc& dstImage, const Rc& srcImage, const VkImageBlit& region, + const VkComponentMapping& mapping, VkFilter filter) { auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource); auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource); @@ -2431,7 +2437,7 @@ namespace dxvk { // Begin render pass Rc pass = new DxvkMetaBlitRenderPass( - m_device, dstImage, srcImage, region); + m_device, dstImage, srcImage, region, mapping); DxvkMetaBlitPass passObjects = pass->pass(); VkExtent3D imageExtent = dstImage->mipLevelExtent(region.dstSubresource.mipLevel); diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 28ef5cb5..07ecdf76 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -188,7 +188,9 @@ namespace dxvk { */ void blitImage( const Rc& dstImage, + const VkComponentMapping& dstMapping, const Rc& srcImage, + const VkComponentMapping& srcMapping, const VkImageBlit& region, VkFilter filter); @@ -1047,6 +1049,7 @@ namespace dxvk { const Rc& dstImage, const Rc& srcImage, const VkImageBlit& region, + const VkComponentMapping& mapping, VkFilter filter); void blitImageHw( diff --git a/src/dxvk/dxvk_meta_blit.cpp b/src/dxvk/dxvk_meta_blit.cpp index 1f4f7f26..f0bd295a 100644 --- a/src/dxvk/dxvk_meta_blit.cpp +++ b/src/dxvk/dxvk_meta_blit.cpp @@ -15,13 +15,14 @@ namespace dxvk { const Rc& device, const Rc& dstImage, const Rc& srcImage, - const VkImageBlit& region) + const VkImageBlit& region, + const VkComponentMapping& mapping) : m_vkd (device->vkd()), m_dstImage (dstImage), m_srcImage (srcImage), m_region (region), m_dstView (createDstView()), - m_srcView (createSrcView()), + m_srcView (createSrcView(mapping)), m_renderPass (createRenderPass()), m_framebuffer (createFramebuffer()) { @@ -114,7 +115,7 @@ namespace dxvk { } - VkImageView DxvkMetaBlitRenderPass::createSrcView() { + VkImageView DxvkMetaBlitRenderPass::createSrcView(const VkComponentMapping& mapping) { VkImageViewUsageCreateInfo usageInfo; usageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO; usageInfo.pNext = nullptr; @@ -127,7 +128,7 @@ namespace dxvk { info.image = m_srcImage->handle(); info.viewType = this->viewType(); info.format = m_srcImage->info().format; - info.components = VkComponentMapping(); + info.components = mapping; info.subresourceRange = vk::makeSubresourceRange(m_region.srcSubresource); VkImageView result; diff --git a/src/dxvk/dxvk_meta_blit.h b/src/dxvk/dxvk_meta_blit.h index 4bc453d4..d036566d 100644 --- a/src/dxvk/dxvk_meta_blit.h +++ b/src/dxvk/dxvk_meta_blit.h @@ -116,7 +116,8 @@ namespace dxvk { const Rc& device, const Rc& dstImage, const Rc& srcImage, - const VkImageBlit& region); + const VkImageBlit& region, + const VkComponentMapping& mapping); ~DxvkMetaBlitRenderPass(); @@ -140,7 +141,7 @@ namespace dxvk { VkFramebuffer m_framebuffer; VkImageView createDstView(); - VkImageView createSrcView(); + VkImageView createSrcView(const VkComponentMapping& mapping); VkRenderPass createRenderPass(); VkFramebuffer createFramebuffer();