#include #include "vkn/vulkan_api_help.h" namespace vkn { using api::ResourceState; inline std::tuple getVkTransition(const api::TextureBarrier& barrier) { VkAccessFlags srcAccessMask, dstAccessMask; VkPipelineStageFlags srcStage, dstStage; switch (barrier.mSrcState) { case ResourceState::UNDEFINED: srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; srcStage = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT; break; case ResourceState::COLOR_ATTACHMENT: srcAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; srcStage = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; break; case ResourceState::READ_WRITE: srcAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; srcStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; break; case ResourceState::READ_ONLY: srcAccessMask = VK_ACCESS_SHADER_READ_BIT; srcStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; break; case ResourceState::TRANSFER_SRC: srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; break; case ResourceState::TRANSFER_DST: srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; break; case ResourceState::DEPTH_ATTACHMENT: srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; srcStage = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; break; case ResourceState::DEPTH_SAMPLER: srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; srcStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; break; case ResourceState::COLOR_ATTACHMENT_RESOLVE: srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; break; case ResourceState::PRESENT: srcAccessMask = VK_ACCESS_NONE; srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; break; } switch (barrier.mDstState) { case ResourceState::COLOR_ATTACHMENT: dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; dstStage = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; break; case ResourceState::READ_WRITE: dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; break; case ResourceState::READ_ONLY: dstAccessMask = VK_ACCESS_SHADER_READ_BIT; dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT; break; case ResourceState::TRANSFER_SRC: dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT; break; case ResourceState::TRANSFER_DST: dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT; break; case ResourceState::DEPTH_ATTACHMENT: dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dstStage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; break; case ResourceState::DEPTH_SAMPLER: dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; break; case ResourceState::PRESENT: case ResourceState::COLOR_ATTACHMENT_RESOLVE: case ResourceState::UNDEFINED: dstAccessMask = 0; dstStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; break; } return std::make_tuple(srcAccessMask, dstAccessMask, srcStage, dstStage, getVkLayout(transition.oldLayout), getVkLayout(transition.newLayout)); } }