X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Ftexture_backend.cpp;h=217299bf26d2ffe878572b03b2a57d752f757bf5;hb=33253bf6d6a330181fda83ba23a6ac0a756d9a8d;hp=ec6d504732f9f0a13055eff1f42086d2fe4858a7;hpb=eddb5cfd959eaa202ee6f95cd2049349ec920829;p=libs%2Fgl.git diff --git a/source/backends/vulkan/texture_backend.cpp b/source/backends/vulkan/texture_backend.cpp index ec6d5047..217299bf 100644 --- a/source/backends/vulkan/texture_backend.cpp +++ b/source/backends/vulkan/texture_backend.cpp @@ -1,3 +1,4 @@ +#include #include "device.h" #include "error.h" #include "synchronizer.h" @@ -34,6 +35,11 @@ VulkanTexture::~VulkanTexture() if(view_handle) dq.destroy(view_handle); + if(mip_view_handles.size()>1) + { + for(VkImageView i: mip_view_handles) + dq.destroy(i); + } if(handle) dq.destroy(handle, memory_id); } @@ -76,11 +82,22 @@ void VulkanTexture::allocate() change_layout(-1, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, true); } + view_handle = create_view(-1); + + if(!debug_name.empty()) + set_vulkan_object_names(); +} + +VkImageView VulkanTexture::create_view(int level) const +{ + const Texture &self = *static_cast(this); + const VulkanFunctions &vk = device.get_functions(); + VkImageViewCreateInfo view_info = { }; view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; view_info.image = handle_cast<::VkImage>(handle); view_info.viewType = static_cast(view_type); - view_info.format = image_info.format; + view_info.format = static_cast(get_vulkan_pixelformat(self.storage_fmt)); const unsigned *swizzle_order = get_vulkan_swizzle(self.swizzle); view_info.components.r = static_cast(swizzle_order[0]); @@ -89,15 +106,32 @@ void VulkanTexture::allocate() view_info.components.a = static_cast(swizzle_order[3]); view_info.subresourceRange.aspectMask = get_vulkan_aspect(get_components(self.storage_fmt)); - view_info.subresourceRange.baseMipLevel = 0; - view_info.subresourceRange.levelCount = image_info.mipLevels; + view_info.subresourceRange.baseMipLevel = max(level, 0); + view_info.subresourceRange.levelCount = (level<0 ? VK_REMAINING_MIP_LEVELS : 1); view_info.subresourceRange.baseArrayLayer = 0; - view_info.subresourceRange.layerCount = image_info.arrayLayers; + view_info.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - vk.CreateImageView(view_info, view_handle); + VkImageView view; + vk.CreateImageView(view_info, view); - if(!debug_name.empty()) - set_vulkan_object_names(); + return view; +} + +void VulkanTexture::create_mip_views() const +{ + const Texture &self = *static_cast(this); + + if(!mip_view_handles.empty()) + return; + + mip_view_handles.resize(self.n_levels); + if(self.n_levels==1) + mip_view_handles[0] = view_handle; + else + { + for(unsigned i=0; i(view_handle); name_info.pObjectName = view_name.c_str(); vk.SetDebugUtilsObjectName(name_info); + + if(mip_view_handles.size()>1) + { + for(unsigned i=0; i(mip_view_handles[i]); + name_info.pObjectName = view_name.c_str(); + vk.SetDebugUtilsObjectName(name_info); + } + } #endif }