]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/pipelinestate_backend.cpp
Keep track of the buffers of bound uniform blocks
[libs/gl.git] / source / backends / vulkan / pipelinestate_backend.cpp
index 419a7e4c149545b3de9ce19cd211da7bef5e563d..a6c9d8ce6754ce28d24002900b47511f21a16a33 100644 (file)
@@ -275,6 +275,7 @@ uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const
                {
                        result = hash_update<64>(result, b.binding);
                        result = hash_update<64>(result, reinterpret_cast<uintptr_t>(b.block));
+                       result = hash_update<64>(result, reinterpret_cast<uintptr_t>(b.buffer));
                }
        for(const PipelineState::BoundTexture &t: self.textures)
                if(t.used && (t.binding>>20)==index)
@@ -319,7 +320,7 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector<char
        for(const PipelineState::BoundUniformBlock &u: self.uniform_blocks)
                if(u.used && u.binding>=0 && static_cast<unsigned>(u.binding>>20)==index)
                {
-                       buffer_ptr->buffer = handle_cast<::VkBuffer>(u.block->get_buffer()->handle);
+                       buffer_ptr->buffer = handle_cast<::VkBuffer>(u.buffer->handle);
                        buffer_ptr->offset = u.block->get_offset();
                        buffer_ptr->range = u.block->get_data_size();
 
@@ -356,7 +357,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();
@@ -387,7 +388,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;
        }
@@ -398,6 +399,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);
@@ -406,7 +412,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;
        }