+ Rect fb_rect = self.framebuffer->get_rect();
+
+ if(unapplied&PipelineState::VIEWPORT)
+ {
+ Rect viewport_rect = fb_rect.intersect(self.viewport);
+ VkViewport viewport = { };
+ viewport.x = viewport_rect.left;
+ viewport.y = viewport_rect.bottom;
+ viewport.width = viewport_rect.width;
+ viewport.height = viewport_rect.height;
+ if(negative_viewport)
+ {
+ viewport.y += viewport.height;
+ viewport.height = -viewport.height;
+ }
+ viewport.minDepth = 0.0f;
+ viewport.maxDepth = 1.0f;
+ vk.CmdSetViewport(command_buffer, 0, 1, &viewport);
+ }
+
+ if(unapplied&PipelineState::SCISSOR)
+ {
+ Rect scissor_rect = fb_rect.intersect(self.scissor);
+ VkRect2D scissor = { };
+ scissor.offset.x = scissor_rect.left;
+ scissor.offset.y = scissor_rect.bottom;
+ scissor.extent.width = scissor_rect.width;
+ scissor.extent.height = scissor_rect.height;
+ vk.CmdSetScissor(command_buffer, 0, 1, &scissor);
+ }