| 474 | } |
| 475 | |
| 476 | void MSAASample::draw(vkb::core::CommandBufferC &command_buffer, vkb::rendering::RenderTargetC &render_target) |
| 477 | { |
| 478 | auto &views = render_target.get_views(); |
| 479 | |
| 480 | auto swapchain_layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| 481 | { |
| 482 | vkb::ImageMemoryBarrier memory_barrier{}; |
| 483 | memory_barrier.old_layout = VK_IMAGE_LAYOUT_UNDEFINED; |
| 484 | memory_barrier.new_layout = swapchain_layout; |
| 485 | memory_barrier.src_access_mask = 0; |
| 486 | memory_barrier.dst_access_mask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 487 | memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
| 488 | memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
| 489 | |
| 490 | for (auto &i_color : color_atts) |
| 491 | { |
| 492 | assert(i_color < views.size()); |
| 493 | command_buffer.image_memory_barrier(views[i_color], memory_barrier); |
| 494 | render_target.set_layout(i_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); |
| 495 | } |
| 496 | } |
| 497 | |
| 498 | { |
| 499 | vkb::ImageMemoryBarrier memory_barrier{}; |
| 500 | memory_barrier.old_layout = VK_IMAGE_LAYOUT_UNDEFINED; |
| 501 | memory_barrier.new_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; |
| 502 | memory_barrier.src_access_mask = 0; |
| 503 | memory_barrier.dst_access_mask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; |
| 504 | memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; |
| 505 | memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; |
| 506 | |
| 507 | if (run_postprocessing) |
| 508 | { |
| 509 | // Synchronize depth with previous depth resolve operation |
| 510 | memory_barrier.dst_stage_mask |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
| 511 | memory_barrier.dst_access_mask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 512 | } |
| 513 | |
| 514 | for (auto &i_depth : depth_atts) |
| 515 | { |
| 516 | assert(i_depth < views.size()); |
| 517 | command_buffer.image_memory_barrier(views[i_depth], memory_barrier); |
| 518 | render_target.set_layout(i_depth, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); |
| 519 | } |
| 520 | } |
| 521 | |
| 522 | auto &extent = render_target.get_extent(); |
| 523 | |
| 524 | VkViewport viewport{}; |
| 525 | viewport.width = static_cast<float>(extent.width); |
| 526 | viewport.height = static_cast<float>(extent.height); |
| 527 | viewport.minDepth = 0.0f; |
| 528 | viewport.maxDepth = 1.0f; |
| 529 | command_buffer.set_viewport(0, {viewport}); |
| 530 | |
| 531 | VkRect2D scissor{}; |
| 532 | scissor.extent = extent; |
| 533 | command_buffer.set_scissor(0, {scissor}); |
no test coverage detected