103 lines
4.6 KiB
C++
103 lines
4.6 KiB
C++
|
|
#include <tuple>
|
||
|
|
#include "vkn/vulkan_api_help.h"
|
||
|
|
namespace vkn {
|
||
|
|
using api::ResourceState;
|
||
|
|
inline std::tuple<VkAccessFlags, VkAccessFlags, VkPipelineStageFlags, VkPipelineStageFlags,
|
||
|
|
VkImageLayout, VkImageLayout>
|
||
|
|
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));
|
||
|
|
}
|
||
|
|
}
|