+ 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::RESOURCES;
+ 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::RESOURCES;
+ 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;
+ }
+
+ VkPipelineBindPoint bind_point = (self.shprog->is_compute() ? VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS);
+ if(unapplied&PipelineState::SHPROG)
+ vkCmd.BindPipeline(bind_point, handle);
+
+ if(!self.shprog->is_compute() && (unapplied&PipelineState::VERTEX_SETUP))
+ if(const VertexSetup *vs = self.vertex_setup)
+ {
+ vkCmd.BindVertexBuffers(0, vs->n_bindings, vs->buffers, vs->offsets);
+ VkIndexType index_type = static_cast<VkIndexType>(get_vulkan_index_type(vs->get_index_type()));
+ vkCmd.BindIndexBuffer(vs->get_index_buffer()->handle, 0, index_type);
+ }