X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fpipelinestate_backend.cpp;h=4714ff67015a1fe736d3459f1375f8a39ccd4677;hb=37076ae3c42e963d8ee90e54f06da1227d85129f;hp=aa44ba08569a463f4ae1fa1ae629c484732a8602;hpb=f201f2e73eb400b4d61ee8729ce8d392ee98a4fb;p=libs%2Fgl.git diff --git a/source/backends/vulkan/pipelinestate_backend.cpp b/source/backends/vulkan/pipelinestate_backend.cpp index aa44ba08..4714ff67 100644 --- a/source/backends/vulkan/pipelinestate_backend.cpp +++ b/source/backends/vulkan/pipelinestate_backend.cpp @@ -40,13 +40,15 @@ void VulkanPipelineState::update() const if(self.changes&pipeline_mask) handle = device.get_pipeline_cache().get_pipeline(self); - if(self.changes&(PipelineState::UNIFORMS|PipelineState::TEXTURES)) + if(self.changes&(PipelineState::SHPROG|PipelineState::UNIFORMS|PipelineState::TEXTURES)) { - unsigned changed_sets = 0; + unsigned changed_sets = (self.changes&PipelineState::SHPROG ? ~0U : 0U); for(const PipelineState::BoundUniformBlock &u: self.uniform_blocks) - if(u.changed && u.binding>=0) + if(u.changed || changed_sets==~0U) { - changed_sets |= 1<<(u.binding>>20); + u.used = self.shprog->uses_binding(u.binding); + if(u.binding>=0) + changed_sets |= 1<<(u.binding>>20); u.changed = false; } @@ -258,7 +260,7 @@ uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const uint64_t result = hash<64>(0, 0); for(const PipelineState::BoundUniformBlock &b: self.uniform_blocks) - if(b.block && b.binding>=0 && static_cast(b.binding>>20)==index) + if(b.used && b.binding>=0 && static_cast(b.binding>>20)==index) { result = hash_update<64>(result, b.binding); result = hash_update<64>(result, reinterpret_cast(b.block)); @@ -278,7 +280,7 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector=0 && static_cast(u.binding>>20)==index) + if(u.used && u.binding>=0 && static_cast(u.binding>>20)==index) ++n_buffers; StructureBuilder sb(buffer, 2); @@ -289,7 +291,7 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector=0 && static_cast(u.binding>>20)==index) + if(u.used && u.binding>=0 && static_cast(u.binding>>20)==index) { buffer_ptr->buffer = handle_cast<::VkBuffer>(u.block->get_buffer()->handle); buffer_ptr->offset = u.block->get_offset(); @@ -324,7 +326,7 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer) const if(!self.uniform_blocks.empty()) { const PipelineState::BoundUniformBlock &first_block = self.uniform_blocks.front(); - if(first_block.block && first_block.binding==ReflectData::PUSH_CONSTANT && first_block.changed) + if(first_block.used && first_block.binding==ReflectData::PUSH_CONSTANT) { const UniformBlock &pc_block = *first_block.block; vk.CmdPushConstants(command_buffer, self.shprog->layout_handle, VK_SHADER_STAGE_ALL,