From 4b6d8264e703296ed81879643e0327838594e1cd Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 1 Dec 2017 00:52:13 +0100 Subject: [PATCH] [dxvk] Added method to clear images that are not bound for rendering --- src/dxvk/dxvk_cmdlist.cpp | 12 ++++++++++++ src/dxvk/dxvk_cmdlist.h | 7 +++++++ src/dxvk/dxvk_context.cpp | 17 +++++++++++++++++ src/dxvk/dxvk_context.h | 12 ++++++++++++ src/dxvk/dxvk_image.h | 14 ++++++++++++++ src/dxvk/dxvk_recorder.h | 7 +++++++ 6 files changed, 69 insertions(+) diff --git a/src/dxvk/dxvk_cmdlist.cpp b/src/dxvk/dxvk_cmdlist.cpp index 5ed72fd4..2c082247 100644 --- a/src/dxvk/dxvk_cmdlist.cpp +++ b/src/dxvk/dxvk_cmdlist.cpp @@ -147,6 +147,18 @@ namespace dxvk { } + void DxvkCommandList::cmdClearColorImage( + VkImage image, + VkImageLayout imageLayout, + const VkClearColorValue* pColor, + uint32_t rangeCount, + const VkImageSubresourceRange* pRanges) { + m_vkd->vkCmdClearColorImage(m_buffer, + image, imageLayout, pColor, + rangeCount, pRanges); + } + + void DxvkCommandList::cmdCopyBuffer( VkBuffer srcBuffer, VkBuffer dstBuffer, diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index 9faf89a9..59b946b5 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -103,6 +103,13 @@ namespace dxvk { uint32_t rectCount, const VkClearRect* pRects) final; + void cmdClearColorImage( + VkImage image, + VkImageLayout imageLayout, + const VkClearColorValue* pColor, + uint32_t rangeCount, + const VkImageSubresourceRange* pRanges) final; + void cmdCopyBuffer( VkBuffer srcBuffer, VkBuffer dstBuffer, diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 15c066b1..63f039d5 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -101,6 +101,23 @@ namespace dxvk { } + void DxvkContext::clearColorImage( + const Rc& image, + const VkClearColorValue& value, + const VkImageSubresourceRange& subresources) { + this->renderPassEnd(); + + m_cmd->cmdClearColorImage( + image->handle(), + VK_IMAGE_LAYOUT_GENERAL, + &value, 1, &subresources); + + // TODO memory barrier + + m_cmd->trackResource(image); + } + + void DxvkContext::clearRenderTarget( const VkClearAttachment& attachment, const VkClearRect& clearArea) { diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index cbff55f7..53a35002 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -86,6 +86,18 @@ namespace dxvk { uint32_t binding, const DxvkBufferBinding& buffer); + /** + * \brief Clears subresources of an image + * + * \param [in] image The image to clear + * \param [in] value Clear value + * \param [in] subresources Subresources to clear + */ + void clearColorImage( + const Rc& image, + const VkClearColorValue& value, + const VkImageSubresourceRange& subresources); + /** * \brief Clears an active render target * diff --git a/src/dxvk/dxvk_image.h b/src/dxvk/dxvk_image.h index cd216407..b06ae33f 100644 --- a/src/dxvk/dxvk_image.h +++ b/src/dxvk/dxvk_image.h @@ -175,6 +175,20 @@ namespace dxvk { return m_image; } + /** + * \brief Subresource range + * \returns Subresource range + */ + VkImageSubresourceRange subresources() const { + VkImageSubresourceRange result; + result.aspectMask = m_info.aspect; + result.baseMipLevel = m_info.minLevel; + result.levelCount = m_info.numLevels; + result.baseArrayLayer = m_info.minLayer; + result.layerCount = m_info.numLayers; + return result; + } + private: Rc m_vkd; diff --git a/src/dxvk/dxvk_recorder.h b/src/dxvk/dxvk_recorder.h index 94842885..c4db1878 100644 --- a/src/dxvk/dxvk_recorder.h +++ b/src/dxvk/dxvk_recorder.h @@ -60,6 +60,13 @@ namespace dxvk { uint32_t rectCount, const VkClearRect* pRects) = 0; + virtual void cmdClearColorImage( + VkImage image, + VkImageLayout imageLayout, + const VkClearColorValue* pColor, + uint32_t rangeCount, + const VkImageSubresourceRange* pRanges) = 0; + virtual void cmdCopyBuffer( VkBuffer srcBuffer, VkBuffer dstBuffer,