| 572 | } |
| 573 | |
| 574 | void setImageLayout( |
| 575 | vk::CommandBuffer const & commandBuffer, vk::Image image, vk::Format format, vk::ImageLayout oldImageLayout, vk::ImageLayout newImageLayout ) |
| 576 | { |
| 577 | vk::AccessFlags sourceAccessMask; |
| 578 | switch ( oldImageLayout ) |
| 579 | { |
| 580 | case vk::ImageLayout::eTransferDstOptimal: sourceAccessMask = vk::AccessFlagBits::eTransferWrite; break; |
| 581 | case vk::ImageLayout::ePreinitialized : sourceAccessMask = vk::AccessFlagBits::eHostWrite; break; |
| 582 | case vk::ImageLayout::eGeneral : // sourceAccessMask is empty |
| 583 | case vk::ImageLayout::eUndefined : break; |
| 584 | default : assert( false ); break; |
| 585 | } |
| 586 | |
| 587 | vk::PipelineStageFlags sourceStage; |
| 588 | switch ( oldImageLayout ) |
| 589 | { |
| 590 | case vk::ImageLayout::eGeneral: |
| 591 | case vk::ImageLayout::ePreinitialized : sourceStage = vk::PipelineStageFlagBits::eHost; break; |
| 592 | case vk::ImageLayout::eTransferDstOptimal: sourceStage = vk::PipelineStageFlagBits::eTransfer; break; |
| 593 | case vk::ImageLayout::eUndefined : sourceStage = vk::PipelineStageFlagBits::eTopOfPipe; break; |
| 594 | default : assert( false ); break; |
| 595 | } |
| 596 | |
| 597 | vk::AccessFlags destinationAccessMask; |
| 598 | switch ( newImageLayout ) |
| 599 | { |
| 600 | case vk::ImageLayout::eColorAttachmentOptimal: destinationAccessMask = vk::AccessFlagBits::eColorAttachmentWrite; break; |
| 601 | case vk::ImageLayout::eDepthStencilAttachmentOptimal: |
| 602 | destinationAccessMask = vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite; |
| 603 | break; |
| 604 | case vk::ImageLayout::eGeneral: // empty destinationAccessMask |
| 605 | case vk::ImageLayout::ePresentSrcKHR : break; |
| 606 | case vk::ImageLayout::eShaderReadOnlyOptimal: destinationAccessMask = vk::AccessFlagBits::eShaderRead; break; |
| 607 | case vk::ImageLayout::eTransferSrcOptimal : destinationAccessMask = vk::AccessFlagBits::eTransferRead; break; |
| 608 | case vk::ImageLayout::eTransferDstOptimal : destinationAccessMask = vk::AccessFlagBits::eTransferWrite; break; |
| 609 | default : assert( false ); break; |
| 610 | } |
| 611 | |
| 612 | vk::PipelineStageFlags destinationStage; |
| 613 | switch ( newImageLayout ) |
| 614 | { |
| 615 | case vk::ImageLayout::eColorAttachmentOptimal : destinationStage = vk::PipelineStageFlagBits::eColorAttachmentOutput; break; |
| 616 | case vk::ImageLayout::eDepthStencilAttachmentOptimal: destinationStage = vk::PipelineStageFlagBits::eEarlyFragmentTests; break; |
| 617 | case vk::ImageLayout::eGeneral : destinationStage = vk::PipelineStageFlagBits::eHost; break; |
| 618 | case vk::ImageLayout::ePresentSrcKHR : destinationStage = vk::PipelineStageFlagBits::eBottomOfPipe; break; |
| 619 | case vk::ImageLayout::eShaderReadOnlyOptimal : destinationStage = vk::PipelineStageFlagBits::eFragmentShader; break; |
| 620 | case vk::ImageLayout::eTransferDstOptimal : |
| 621 | case vk::ImageLayout::eTransferSrcOptimal : destinationStage = vk::PipelineStageFlagBits::eTransfer; break; |
| 622 | default : assert( false ); break; |
| 623 | } |
| 624 | |
| 625 | vk::ImageAspectFlags aspectMask; |
| 626 | if ( newImageLayout == vk::ImageLayout::eDepthStencilAttachmentOptimal ) |
| 627 | { |
| 628 | aspectMask = vk::ImageAspectFlagBits::eDepth; |
| 629 | if ( format == vk::Format::eD32SfloatS8Uint || format == vk::Format::eD24UnormS8Uint ) |
| 630 | { |
| 631 | aspectMask |= vk::ImageAspectFlagBits::eStencil; |