Created
July 31, 2016 01:03
-
-
Save ioquatix/155e86a36159c1ca97758d3467cdc1a0 to your computer and use it in GitHub Desktop.
vulkan mip maps
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void Renderer::generate_mipmaps(vk::CommandBuffer commands, DeviceImage image) { | |
size_t levels = image.info.mipLevels(); | |
assert(levels > 0); | |
vk::Extent3D extent = image.info.extent(); | |
vk::Offset3D upper (extent.width(), extent.height(), extent.depth()); | |
auto prepare_write = vk::ImageMemoryBarrier() | |
.dstAccessMask(vk::AccessFlagBits::eTransferWrite) | |
.newLayout(vk::ImageLayout::eTransferDstOptimal) | |
.subresourceRange(subresource_range().baseMipLevel(1).levelCount(levels - 1)) | |
.image(image.image); | |
image_barrier(commands, vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {prepare_write}); | |
for(size_t i = 0; i < levels - 1; ++i) { | |
vk::Offset3D next (half_mip(upper.x()), half_mip(upper.y()), half_mip(upper.z())); | |
// log(next.x(), next.y(), next.z()); | |
auto region = vk::ImageBlit() | |
.srcSubresource(subresource_layers(i)) | |
.dstSubresource(subresource_layers(i + 1)) | |
.srcOffsets( { vk::Offset3D(0, 0, 0), upper }) | |
.dstOffsets( { vk::Offset3D(0, 0, 0), next }); | |
commands.blitImage(image.image, vk::ImageLayout::eGeneral, | |
image.image, vk::ImageLayout::eGeneral, {region}, vk::Filter::eLinear); | |
auto blit_finished = vk::ImageMemoryBarrier() | |
.srcAccessMask(vk::AccessFlagBits::eTransferWrite) | |
.dstAccessMask(vk::AccessFlagBits::eTransferRead | vk::AccessFlagBits::eShaderRead) | |
.oldLayout(vk::ImageLayout::eTransferDstOptimal) | |
.newLayout(vk::ImageLayout::eGeneral) | |
.subresourceRange(subresource_range().baseMipLevel(i + 1)) | |
.image(image.image); | |
image_barrier(commands, vk::PipelineStageFlagBits::eTransfer, | |
vk::PipelineStageFlagBits::eTransfer | vk::PipelineStageFlagBits::eFragmentShader, {blit_finished}); | |
upper = next; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment