+ else if(last!=this)
+ {
+ 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)
+ if(i>=last->descriptor_set_slots.size() || descriptor_set_slots[i]!=last->descriptor_set_slots[i])
+ {
+ unapplied |= PipelineState::UNIFORMS;
+ first_changed_desc_set = min(first_changed_desc_set, i);
+ break;
+ }
+ if(self.viewport!=last_ps.viewport)
+ unapplied |= PipelineState::VIEWPORT;
+ if(self.scissor!=last_ps.scissor)
+ unapplied |= PipelineState::SCISSOR;
+ }
+
+ if(unapplied&PipelineState::SHPROG)
+ vk.CmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, handle);
+
+ if(unapplied&PipelineState::VERTEX_SETUP)
+ if(const VertexSetup *vs = self.vertex_setup)
+ {
+ vk.CmdBindVertexBuffers(command_buffer, 0, vs->n_bindings, vs->buffers, vs->offsets);
+ VkIndexType index_type = static_cast<VkIndexType>(get_vulkan_index_type(vs->get_index_type()));
+ vk.CmdBindIndexBuffer(command_buffer, vs->get_index_buffer()->handle, 0, index_type);
+ }