X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Ftexture_backend.cpp;h=168d6adb0501d69a501b83e8bb726a860fd8e978;hp=f1e8b85bab162e32926db81f78ced507752e5d04;hb=d2a23243b7f25e56ef098196b2962c103989143f;hpb=5c35768c310847df816d216eecf8fa2e93f5f8b8 diff --git a/source/backends/vulkan/texture_backend.cpp b/source/backends/vulkan/texture_backend.cpp index f1e8b85b..168d6adb 100644 --- a/source/backends/vulkan/texture_backend.cpp +++ b/source/backends/vulkan/texture_backend.cpp @@ -56,7 +56,7 @@ void VulkanTexture::allocate() image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - image_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; + image_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_SAMPLED_BIT; PixelComponents comp = get_components(self.storage_fmt); if(comp==DEPTH_COMPONENT || comp==STENCIL_INDEX) image_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; @@ -100,9 +100,33 @@ void VulkanTexture::allocate() set_vulkan_object_names(); } -void VulkanTexture::generate_mipmap() +void VulkanTexture::generate_mipmap_levels(unsigned n_levels) { - throw logic_error("VulkanTexture::generate_mipmap is unimplemented"); + TransferQueue &tq = device.get_transfer_queue(); + for(unsigned i=0; i+1(this)->storage_fmt)); + region.srcSubresource.mipLevel = i; + region.srcSubresource.baseArrayLayer = 0; + region.srcSubresource.layerCount = 1; + region.dstSubresource = region.srcSubresource; + ++region.dstSubresource.mipLevel; + + fill_mipmap_blit(i, ®ion); + + vk.CmdBlitImage(cmd_buf, handle, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1, ®ion, VK_FILTER_LINEAR); + }); + } } void VulkanTexture::change_layout(unsigned n_levels, int level, unsigned layout, bool discard) const