vkCmdResolveImage implementation
Implemented the resolve command using the regular blit function,
since it already supports resolve operations. Removed baseArrayLayer
related checks in Image::copyTo(), since resolving array images
exercises that path.
Bug b/118619338
Change-Id: I6a70ef5f396e51be7fde34ebe72fcf991396a45f
Tests: dEQP-VK.api.copy_and_blit.core.resolve_image.*
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28888
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkCommandBuffer.cpp b/src/Vulkan/VkCommandBuffer.cpp
index 0af06da..fa6f3d8 100644
--- a/src/Vulkan/VkCommandBuffer.cpp
+++ b/src/Vulkan/VkCommandBuffer.cpp
@@ -792,6 +792,24 @@
VkFilter filter;
};
+struct ResolveImage : public CommandBuffer::Command
+{
+ ResolveImage(VkImage srcImage, VkImage dstImage, const VkImageResolve& region) :
+ srcImage(srcImage), dstImage(dstImage), region(region)
+ {
+ }
+
+ void play(CommandBuffer::ExecutionState& executionState) override
+ {
+ Cast(srcImage)->resolve(dstImage, region);
+ }
+
+private:
+ VkImage srcImage;
+ VkImage dstImage;
+ VkImageResolve region;
+};
+
struct PipelineBarrier : public CommandBuffer::Command
{
PipelineBarrier()
@@ -1420,7 +1438,16 @@
void CommandBuffer::resolveImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
uint32_t regionCount, const VkImageResolve* pRegions)
{
- UNIMPLEMENTED("resolveImage");
+ ASSERT(state == RECORDING);
+ ASSERT(srcImageLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ||
+ srcImageLayout == VK_IMAGE_LAYOUT_GENERAL);
+ ASSERT(dstImageLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ||
+ dstImageLayout == VK_IMAGE_LAYOUT_GENERAL);
+
+ for(uint32_t i = 0; i < regionCount; i++)
+ {
+ addCommand<ResolveImage>(srcImage, dstImage, pRegions[i]);
+ }
}
void CommandBuffer::setEvent(VkEvent event, VkPipelineStageFlags stageMask)