Skip to content

Instantly share code, notes, and snippets.

@ioquatix
Created July 31, 2016 01:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ioquatix/155e86a36159c1ca97758d3467cdc1a0 to your computer and use it in GitHub Desktop.
Save ioquatix/155e86a36159c1ca97758d3467cdc1a0 to your computer and use it in GitHub Desktop.
vulkan mip maps
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