]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/pipelinestate_backend.cpp
Refactor handling of viewport Y axis
[libs/gl.git] / source / backends / vulkan / pipelinestate_backend.cpp
index efcc961359a547e48721485b49827b4edcc42910..a1a03d3d8fcb31d2646027036bb4936a237d4194 100644 (file)
@@ -49,7 +49,7 @@ void VulkanPipelineState::update() const
                for(const PipelineState::BoundUniformBlock &u: self.uniform_blocks)
                        if(u.changed || changed_sets==~0U)
                        {
-                               u.used = self.shprog->uses_binding(u.binding);
+                               u.used = self.shprog->uses_uniform_block_binding(u.binding);
                                if(u.binding>=0)
                                        changed_sets |= 1<<(u.binding>>20);
                                u.changed = false;
@@ -57,8 +57,10 @@ void VulkanPipelineState::update() const
                for(const PipelineState::BoundTexture &t: self.textures)
                        if(t.changed || changed_sets==~0U)
                        {
-                               t.used = self.shprog->uses_binding(t.binding);
+                               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;
@@ -350,7 +356,7 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector<char
        return n_writes;
 }
 
-void VulkanPipelineState::apply(VkCommandBuffer command_buffer) const
+void VulkanPipelineState::apply(VkCommandBuffer command_buffer, bool negative_viewport) const
 {
        const PipelineState &self = *static_cast<const PipelineState *>(this);
        const VulkanFunctions &vk = device.get_functions();
@@ -381,7 +387,7 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer) const
        if(self.viewport)
        {
                viewport.x = self.viewport->left;
-               viewport.y = self.framebuffer->get_height()-(self.viewport->bottom+self.viewport->height);
+               viewport.y = self.viewport->bottom;
                viewport.width = self.viewport->width;
                viewport.height = self.viewport->height;
        }
@@ -392,6 +398,11 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer) const
                viewport.width = self.framebuffer->get_width();
                viewport.height = self.framebuffer->get_height();
        }
+       if(negative_viewport)
+       {
+               viewport.y += viewport.height;
+               viewport.height = -viewport.height;
+       }
        viewport.minDepth = 0.0f;
        viewport.maxDepth = 1.0f;
        vk.CmdSetViewport(command_buffer, 0, 1, &viewport);
@@ -400,7 +411,7 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer) const
        if(self.scissor)
        {
                scissor.offset.x = self.scissor->left;
-               scissor.offset.y = self.framebuffer->get_height()-(self.scissor->bottom+self.scissor->height);
+               scissor.offset.y = self.scissor->bottom;
                scissor.extent.width = self.scissor->width;
                scissor.extent.height = self.scissor->height;
        }