// limitations under the License.
#include "VkCommandBuffer.hpp"
+#include "VkImage.hpp"
#include <cstring>
uint32_t vertexCount;
};
+struct ImageToImageCopy : public CommandBuffer::Command
+{
+ ImageToImageCopy(VkImage pSrcImage, VkImage pDstImage, const VkImageCopy& pRegion) :
+ srcImage(pSrcImage), dstImage(pDstImage), region(pRegion)
+ {
+ }
+
+ void play(CommandBuffer* commandBuffer)
+ {
+ Cast(srcImage)->copyTo(dstImage, region);
+ }
+
+private:
+ VkImage srcImage;
+ VkImage dstImage;
+ const VkImageCopy region;
+};
+
struct ImageToBufferCopy : public CommandBuffer::Command
{
ImageToBufferCopy(VkImage pSrcImage, VkBuffer pDstBuffer, const VkBufferImageCopy& pRegion) :
void play(CommandBuffer* commandBuffer)
{
- UNIMPLEMENTED();
+ Cast(srcImage)->copyTo(dstBuffer, region);
}
private:
const VkBufferImageCopy region;
};
+struct BufferToImageCopy : public CommandBuffer::Command
+{
+ BufferToImageCopy(VkBuffer pSrcBuffer, VkImage pDstImage, const VkBufferImageCopy& pRegion) :
+ srcBuffer(pSrcBuffer), dstImage(pDstImage), region(pRegion)
+ {
+ }
+
+ void play(CommandBuffer* commandBuffer)
+ {
+ Cast(dstImage)->copyFrom(srcBuffer, region);
+ }
+
+private:
+ VkBuffer srcBuffer;
+ VkImage dstImage;
+ const VkBufferImageCopy region;
+};
+
struct PipelineBarrier : public CommandBuffer::Command
{
PipelineBarrier()
void CommandBuffer::copyImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
uint32_t regionCount, const VkImageCopy* pRegions)
{
- UNIMPLEMENTED();
+ 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++)
+ {
+ commands->push_back(std::make_unique<ImageToImageCopy>(srcImage, dstImage, pRegions[i]));
+ }
}
void CommandBuffer::blitImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
void CommandBuffer::copyBufferToImage(VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout,
uint32_t regionCount, const VkBufferImageCopy* pRegions)
{
- UNIMPLEMENTED();
+ ASSERT(state == RECORDING);
+
+ for(uint32_t i = 0; i < regionCount; i++)
+ {
+ commands->push_back(std::make_unique<BufferToImageCopy>(srcBuffer, dstImage, pRegions[i]));
+ }
}
void CommandBuffer::copyImageToBuffer(VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer,
uint32_t regionCount, const VkBufferImageCopy* pRegions)
{
+ ASSERT(state == RECORDING);
ASSERT(srcImageLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
for(uint32_t i = 0; i < regionCount; i++)