| 2997 | } |
| 2998 | |
| 2999 | void Demo::set_image_layout(vk::Image image, vk::ImageAspectFlags aspectMask, vk::ImageLayout oldLayout, vk::ImageLayout newLayout, |
| 3000 | vk::AccessFlags srcAccessMask, vk::PipelineStageFlags src_stages, vk::PipelineStageFlags dest_stages) { |
| 3001 | assert(cmd); |
| 3002 | |
| 3003 | auto DstAccessMask = [](vk::ImageLayout const &layout) { |
| 3004 | vk::AccessFlags flags; |
| 3005 | |
| 3006 | switch (layout) { |
| 3007 | case vk::ImageLayout::eTransferDstOptimal: |
| 3008 | // Make sure anything that was copying from this image has |
| 3009 | // completed |
| 3010 | flags = vk::AccessFlagBits::eTransferWrite; |
| 3011 | break; |
| 3012 | case vk::ImageLayout::eColorAttachmentOptimal: |
| 3013 | flags = vk::AccessFlagBits::eColorAttachmentWrite; |
| 3014 | break; |
| 3015 | case vk::ImageLayout::eDepthStencilAttachmentOptimal: |
| 3016 | flags = vk::AccessFlagBits::eDepthStencilAttachmentWrite; |
| 3017 | break; |
| 3018 | case vk::ImageLayout::eShaderReadOnlyOptimal: |
| 3019 | // Make sure any Copy or CPU writes to image are flushed |
| 3020 | flags = vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eInputAttachmentRead; |
| 3021 | break; |
| 3022 | case vk::ImageLayout::eTransferSrcOptimal: |
| 3023 | flags = vk::AccessFlagBits::eTransferRead; |
| 3024 | break; |
| 3025 | case vk::ImageLayout::ePresentSrcKHR: |
| 3026 | flags = vk::AccessFlagBits::eMemoryRead; |
| 3027 | break; |
| 3028 | default: |
| 3029 | break; |
| 3030 | } |
| 3031 | |
| 3032 | return flags; |
| 3033 | }; |
| 3034 | |
| 3035 | cmd.pipelineBarrier(src_stages, dest_stages, vk::DependencyFlagBits(), {}, {}, |
| 3036 | vk::ImageMemoryBarrier() |
| 3037 | .setSrcAccessMask(srcAccessMask) |
| 3038 | .setDstAccessMask(DstAccessMask(newLayout)) |
| 3039 | .setOldLayout(oldLayout) |
| 3040 | .setNewLayout(newLayout) |
| 3041 | .setSrcQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED) |
| 3042 | .setDstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED) |
| 3043 | .setImage(image) |
| 3044 | .setSubresourceRange(vk::ImageSubresourceRange(aspectMask, 0, 1, 0, 1))); |
| 3045 | } |
| 3046 | |
| 3047 | void Demo::update_data_buffer(void *uniform_memory_ptr) { |
| 3048 | mat4x4 VP; |
nothing calls this directly
no outgoing calls
no test coverage detected