Implement Vulkan surface snapshot (#4314)

This commit is contained in:
Adrian Cojocaru
2026-06-06 02:06:40 +03:00
committed by GitHub
parent 8a393c5b2c
commit 9fa80b37d2
9 changed files with 147 additions and 8 deletions

View File

@@ -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>();