From 03881dde72be7c8fbfd754847705bc92aca031f7 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 27 Mar 2019 02:31:04 +0100 Subject: [PATCH] [dxvk] Implement blitImage function --- src/dxvk/dxvk_context.cpp | 65 +++++++++++++++++++++++++++++++++++++++ src/dxvk/dxvk_context.h | 14 +++++++++ 2 files changed, 79 insertions(+) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 61a698ff..28f9c9aa 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -252,6 +252,71 @@ namespace dxvk { } + void DxvkContext::blitImage( + const Rc& dstImage, + const Rc& srcImage, + const VkImageBlit& region, + VkFilter filter) { + this->spillRenderPass(); + + auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource); + auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource); + + if (m_barriers.isImageDirty(dstImage, dstSubresourceRange, DxvkAccess::Write) + || m_barriers.isImageDirty(srcImage, srcSubresourceRange, DxvkAccess::Write)) + m_barriers.recordCommands(m_cmd); + + // Prepare the two images for transfer ops if necessary + auto dstLayout = dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + auto srcLayout = srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + + if (dstImage->info().layout != dstLayout) { + m_transitions.accessImage( + dstImage, dstSubresourceRange, + dstImage->info().layout, 0, 0, + dstLayout, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT); + } + + if (srcImage->info().layout != srcLayout) { + m_transitions.accessImage( + srcImage, srcSubresourceRange, + srcImage->info().layout, 0, 0, + srcLayout, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_READ_BIT); + } + + m_transitions.recordCommands(m_cmd); + + // Perform the blit operation + m_cmd->cmdBlitImage( + srcImage->handle(), srcLayout, + dstImage->handle(), dstLayout, + 1, ®ion, filter); + + m_barriers.accessImage( + dstImage, dstSubresourceRange, dstLayout, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + dstImage->info().layout, + dstImage->info().stages, + dstImage->info().access); + + m_barriers.accessImage( + srcImage, srcSubresourceRange, srcLayout, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_READ_BIT, + srcImage->info().layout, + srcImage->info().stages, + srcImage->info().access); + + m_cmd->trackResource(dstImage); + m_cmd->trackResource(srcImage); + } + + void DxvkContext::clearBuffer( const Rc& buffer, VkDeviceSize offset, diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 65073211..653a5b74 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -195,6 +195,20 @@ namespace dxvk { const DxvkBufferSlice& buffer, const DxvkBufferSlice& counter); + /** + * \brief Blits an image + * + * \param [in] dstImage Destination image + * \param [in] srcImage Source image + * \param [in] region Blit region + * \param [in] filter Texture filter + */ + void blitImage( + const Rc& dstImage, + const Rc& srcImage, + const VkImageBlit& region, + VkFilter filter); + /** * \brief Clears a buffer with a fixed value *