]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/pipelinestate_backend.cpp
Support binding individual mipmap levels of textures
[libs/gl.git] / source / backends / vulkan / pipelinestate_backend.cpp
index 013e34c2636a9e995ab64d9815bc53e14dc80f41..419a7e4c149545b3de9ce19cd211da7bef5e563d 100644 (file)
@@ -59,6 +59,8 @@ void VulkanPipelineState::update() const
                        {
                                t.used = self.shprog->uses_texture_binding(t.binding);
                                changed_sets |= 1<<(t.binding>>20);
+                               if(t.texture && t.level>=0)
+                                       t.texture->refresh_mip_views();
                                if(t.sampler)
                                        t.sampler->refresh();
                                t.changed = false;
@@ -280,6 +282,7 @@ uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const
                        result = hash_update<64>(result, t.binding);
                        result = hash_update<64>(result, reinterpret_cast<uintptr_t>(t.texture));
                        result = hash_update<64>(result, reinterpret_cast<uintptr_t>(t.sampler));
+                       result = hash_update<64>(result, t.level);
                }
 
        return result;
@@ -334,7 +337,10 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector<char
                if(t.used && (t.binding>>20)==index)
                {
                        image_ptr->sampler = handle_cast<::VkSampler>(t.sampler->handle);
-                       image_ptr->imageView = handle_cast<::VkImageView>(t.texture->view_handle);
+                       if(t.level<0)
+                               image_ptr->imageView = handle_cast<::VkImageView>(t.texture->view_handle);
+                       else
+                               image_ptr->imageView = handle_cast<::VkImageView>(t.texture->mip_view_handles[t.level]);
                        image_ptr->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
 
                        write_ptr->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;