Implement Vulkan surface snapshot (#4314)
This commit is contained in:
@@ -580,6 +580,33 @@ void Texture2D::copyImage(vk::Image image, Size imageSize, uint16_t xOffset, uin
|
||||
});
|
||||
}
|
||||
|
||||
void Texture2D::blitImage(vk::Image image, Size imageSize, uint16_t xOffset, uint16_t yOffset) {
|
||||
if (!image) return;
|
||||
|
||||
create();
|
||||
|
||||
context.submitOneTimeCommand([&](const vk::UniqueCommandBuffer& commandBuffer) {
|
||||
const std::array<vk::Offset3D, 2> offsets = {
|
||||
vk::Offset3D{xOffset, yOffset, 0},
|
||||
{static_cast<int32_t>(imageSize.width), static_cast<int32_t>(imageSize.height), 1}};
|
||||
const auto blitInfo = vk::ImageBlit()
|
||||
.setSrcOffsets(offsets)
|
||||
.setDstOffsets(offsets)
|
||||
.setSrcSubresource({vk::ImageAspectFlagBits::eColor, 0, 0, 1})
|
||||
.setDstSubresource({vk::ImageAspectFlagBits::eColor, 0, 0, 1});
|
||||
|
||||
transitionToTransferWriteLayout(commandBuffer);
|
||||
commandBuffer->blitImage(image,
|
||||
vk::ImageLayout::eTransferSrcOptimal,
|
||||
imageAllocation->image,
|
||||
imageLayout,
|
||||
blitInfo,
|
||||
vk::Filter::eNearest,
|
||||
context.getBackend().getDispatcher());
|
||||
transitionToGeneralLayout(commandBuffer);
|
||||
});
|
||||
}
|
||||
|
||||
std::shared_ptr<PremultipliedImage> Texture2D::readImage() {
|
||||
if (!imageData) {
|
||||
imageData = std::make_shared<PremultipliedImage>();
|
||||
|
||||
Reference in New Issue
Block a user