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;
return n_writes;
}
-void VulkanPipelineState::apply(VkCommandBuffer command_buffer, bool negative_viewport) const
+void VulkanPipelineState::apply(VkCommandBuffer command_buffer, unsigned frame, bool negative_viewport) const
{
const PipelineState &self = *static_cast<const PipelineState *>(this);
const VulkanFunctions &vk = device.get_functions();
}
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<uint32_t> 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)