- scissor.offset.x = self.scissor->left;
- scissor.offset.y = self.framebuffer->get_height()-(self.scissor->bottom+self.scissor->height);
- scissor.extent.width = self.scissor->width;
- scissor.extent.height = self.scissor->height;
- }
- else
- {
- scissor.offset.x = 0;
- scissor.offset.y = 0;
- scissor.extent.width = self.framebuffer->get_width();
- scissor.extent.height = self.framebuffer->get_height();
+ 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);
+ }