]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/pipelinestate_backend.cpp
Rebind all descriptor sets if push constant layout changes
[libs/gl.git] / source / backends / vulkan / pipelinestate_backend.cpp
index 351affab103a44d38706b5763ffdb578777bcac8..d14bc00c6539bb3c9509fab26abf4610cd151d1f 100644 (file)
@@ -41,6 +41,12 @@ void VulkanPipelineState::update() const
        if(changes&PipelineState::VERTEX_SETUP)
                self.vertex_setup->refresh();
 
+       if(changes&PipelineState::SHPROG)
+       {
+               push_const_compat = hash<32>(self.shprog->stage_flags);
+               push_const_compat = hash_update<32>(push_const_compat, self.shprog->get_push_constants_size());
+       }
+
        constexpr unsigned pipeline_mask = PipelineState::SHPROG|PipelineState::VERTEX_SETUP|PipelineState::FACE_CULL|
                PipelineState::DEPTH_TEST|PipelineState::STENCIL_TEST|PipelineState::BLEND|PipelineState::PRIMITIVE_TYPE;
        if(changes&pipeline_mask)
@@ -266,6 +272,7 @@ uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const
        const PipelineState &self = *static_cast<const PipelineState *>(this);
 
        uint64_t result = hash<64>(0, 0);
+       bool empty = true;
 
        auto i = lower_bound_member(self.uniform_blocks, static_cast<int>(index)<<20, &PipelineState::BoundUniformBlock::binding);
        for(; (i!=self.uniform_blocks.end() && static_cast<unsigned>(i->binding)>>20==index); ++i)
@@ -274,6 +281,7 @@ uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const
                        result = hash_update<64>(result, i->binding);
                        result = hash_update<64>(result, reinterpret_cast<uintptr_t>(i->block));
                        result = hash_update<64>(result, reinterpret_cast<uintptr_t>(i->buffer->handle));
+                       empty = false;
                }
 
        auto j = lower_bound_member(self.textures, index<<20, &PipelineState::BoundTexture::binding);
@@ -284,8 +292,12 @@ uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const
                        result = hash_update<64>(result, reinterpret_cast<uintptr_t>(j->texture->handle));
                        result = hash_update<64>(result, reinterpret_cast<uintptr_t>(j->sampler->handle));
                        result = hash_update<64>(result, j->level);
+                       empty = false;
                }
 
+       if(!empty)
+               result = hash_update<64>(result, self.shprog->stage_flags);
+
        return result;
 }
 
@@ -388,7 +400,14 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer, const VulkanPipe
        {
                const PipelineState &last_ps = *static_cast<const PipelineState *>(last);
                if(handle!=last->handle)
+               {
                        unapplied |= PipelineState::SHPROG;
+                       if(self.push_const_compat!=last_ps.push_const_compat)
+                       {
+                               unapplied |= PipelineState::UNIFORMS;
+                               first_changed_desc_set = 0;
+                       }
+               }
                if(self.vertex_setup!=last_ps.vertex_setup)
                        unapplied |= PipelineState::VERTEX_SETUP;
                for(unsigned i=0; i<descriptor_set_slots.size(); ++i)