X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fpipelinestate_backend.cpp;h=84609ab03666370a0ce0793f3e6bdc4e9961daaf;hb=362534d5838123150311360b465026edba38bb7d;hp=a1a03d3d8fcb31d2646027036bb4936a237d4194;hpb=b0db98d71aeb32d9e57315b8a06ff4068aeccbca;p=libs%2Fgl.git diff --git a/source/backends/vulkan/pipelinestate_backend.cpp b/source/backends/vulkan/pipelinestate_backend.cpp index a1a03d3d..84609ab0 100644 --- a/source/backends/vulkan/pipelinestate_backend.cpp +++ b/source/backends/vulkan/pipelinestate_backend.cpp @@ -49,7 +49,8 @@ void VulkanPipelineState::update() const for(const PipelineState::BoundUniformBlock &u: self.uniform_blocks) if(u.changed || changed_sets==~0U) { - u.used = self.shprog->uses_uniform_block_binding(u.binding); + if(u.block) + u.used = self.shprog->uses_uniform_block_binding(u.binding); if(u.binding>=0) changed_sets |= 1<<(u.binding>>20); u.changed = false; @@ -57,7 +58,8 @@ void VulkanPipelineState::update() const for(const PipelineState::BoundTexture &t: self.textures) if(t.changed || changed_sets==~0U) { - t.used = self.shprog->uses_texture_binding(t.binding); + if(t.texture && t.sampler) + 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(); @@ -275,13 +277,14 @@ uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const { result = hash_update<64>(result, b.binding); result = hash_update<64>(result, reinterpret_cast(b.block)); + result = hash_update<64>(result, reinterpret_cast(b.buffer->handle)); } for(const PipelineState::BoundTexture &t: self.textures) if(t.used && (t.binding>>20)==index) { result = hash_update<64>(result, t.binding); - result = hash_update<64>(result, reinterpret_cast(t.texture)); - result = hash_update<64>(result, reinterpret_cast(t.sampler)); + result = hash_update<64>(result, reinterpret_cast(t.texture->handle)); + result = hash_update<64>(result, reinterpret_cast(t.sampler->handle)); result = hash_update<64>(result, t.level); } @@ -319,14 +322,14 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector=0 && static_cast(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(); write_ptr->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; write_ptr->dstBinding = u.binding&0xFFFFF; write_ptr->descriptorCount = 1; - write_ptr->descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + write_ptr->descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; write_ptr->pBufferInfo = buffer_ptr; ++buffer_ptr; @@ -356,7 +359,7 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector(this); const VulkanFunctions &vk = device.get_functions(); @@ -381,7 +384,21 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer, bool negative_vi } if(!descriptor_set_handles.empty()) - vk.CmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, self.shprog->layout_handle, 0, descriptor_set_handles.size(), descriptor_set_handles.data(), 0, 0); + { + vector dynamic_offsets; + dynamic_offsets.reserve(self.uniform_blocks.size()); + for(const PipelineState::BoundUniformBlock &u: self.uniform_blocks) + if(u.used && u.binding>=0) + { + if(u.buffer->get_usage()==STREAMING) + dynamic_offsets.push_back(frame*u.buffer->get_size()); + else + dynamic_offsets.push_back(0); + } + + vk.CmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, self.shprog->layout_handle, + 0, descriptor_set_handles.size(), descriptor_set_handles.data(), dynamic_offsets.size(), dynamic_offsets.data()); + } VkViewport viewport = { }; if(self.viewport)