use ash::vk;
pub mod cmd;
#[derive(Debug, Copy, Clone, PartialEq, Default)]
pub enum AccessType {
#[default]
Nothing,
CommandBufferReadNVX,
IndirectBuffer,
IndexBuffer,
VertexBuffer,
VertexShaderReadUniformBuffer,
VertexShaderReadSampledImageOrUniformTexelBuffer,
VertexShaderReadOther,
MeshShaderReadUniformBuffer,
MeshShaderReadSampledImageOrUniformTexelBuffer,
MeshShaderReadOther,
TaskShaderReadUniformBuffer,
TaskShaderReadSampledImageOrUniformTexelBuffer,
TaskShaderReadOther,
TessellationControlShaderReadUniformBuffer,
TessellationControlShaderReadSampledImageOrUniformTexelBuffer,
TessellationControlShaderReadOther,
TessellationEvaluationShaderReadUniformBuffer,
TessellationEvaluationShaderReadSampledImageOrUniformTexelBuffer,
TessellationEvaluationShaderReadOther,
GeometryShaderReadUniformBuffer,
GeometryShaderReadSampledImageOrUniformTexelBuffer,
GeometryShaderReadOther,
FragmentShaderReadUniformBuffer,
FragmentShaderReadSampledImageOrUniformTexelBuffer,
FragmentShaderReadColorInputAttachment,
FragmentShaderReadDepthStencilInputAttachment,
FragmentShaderReadOther,
ColorAttachmentRead,
DepthStencilAttachmentRead,
DepthStencilAttachmentReadWrite,
ComputeShaderReadUniformBuffer,
ComputeShaderReadSampledImageOrUniformTexelBuffer,
ComputeShaderReadOther,
ComputeShaderReadWrite,
AnyShaderReadUniformBuffer,
AnyShaderReadUniformBufferOrVertexBuffer,
AnyShaderReadSampledImageOrUniformTexelBuffer,
AnyShaderReadOther,
TransferRead,
HostRead,
Present,
CommandBufferWriteNVX,
VertexShaderWrite,
MeshShaderWrite,
TaskShaderWrite,
TessellationControlShaderWrite,
TessellationEvaluationShaderWrite,
GeometryShaderWrite,
FragmentShaderWrite,
ColorAttachmentWrite,
DepthStencilAttachmentWrite,
DepthAttachmentWriteStencilReadOnly,
StencilAttachmentWriteDepthReadOnly,
ComputeShaderWrite,
AnyShaderWrite,
TransferWrite,
HostWrite,
ColorAttachmentReadWrite,
General,
RayTracingShaderReadSampledImageOrUniformTexelBuffer,
RayTracingShaderReadColorInputAttachment,
RayTracingShaderReadDepthStencilInputAttachment,
RayTracingShaderReadAccelerationStructure,
RayTracingShaderReadOther,
AccelerationStructureBuildWrite,
AccelerationStructureBuildRead,
AccelerationStructureBufferWrite,
}
#[derive(Debug, Copy, Clone, PartialEq, Default)]
pub enum ImageLayout {
#[default]
Optimal,
General,
GeneralAndPresentation,
}
#[derive(Debug, Default, Clone)]
pub struct GlobalBarrier<'a> {
pub previous_accesses: &'a [AccessType],
pub next_accesses: &'a [AccessType],
}
#[derive(Debug, Default, Clone)]
pub struct BufferBarrier<'a> {
pub previous_accesses: &'a [AccessType],
pub next_accesses: &'a [AccessType],
pub src_queue_family_index: u32,
pub dst_queue_family_index: u32,
pub buffer: vk::Buffer,
pub offset: usize,
pub size: usize,
}
#[derive(Debug, Default, Clone)]
pub struct ImageBarrier<'a> {
pub previous_accesses: &'a [AccessType],
pub next_accesses: &'a [AccessType],
pub previous_layout: ImageLayout,
pub next_layout: ImageLayout,
pub discard_contents: bool,
pub src_queue_family_index: u32,
pub dst_queue_family_index: u32,
pub image: vk::Image,
pub range: vk::ImageSubresourceRange,
}
pub fn get_memory_barrier<'a>(
barrier: &GlobalBarrier<'a>,
) -> (
vk::PipelineStageFlags,
vk::PipelineStageFlags,
vk::MemoryBarrier<'a>,
) {
let mut src_stages = vk::PipelineStageFlags::empty();
let mut dst_stages = vk::PipelineStageFlags::empty();
let mut memory_barrier = vk::MemoryBarrier::default();
for previous_access in barrier.previous_accesses {
let previous_info = get_access_info(*previous_access);
src_stages |= previous_info.stage_mask;
if is_write_access(*previous_access) {
memory_barrier.src_access_mask |= previous_info.access_mask;
}
}
for next_access in barrier.next_accesses {
let next_info = get_access_info(*next_access);
dst_stages |= next_info.stage_mask;
if memory_barrier.src_access_mask != vk::AccessFlags::empty() {
memory_barrier.dst_access_mask |= next_info.access_mask;
}
}
if src_stages == vk::PipelineStageFlags::empty() {
src_stages = vk::PipelineStageFlags::TOP_OF_PIPE;
}
if dst_stages == vk::PipelineStageFlags::empty() {
dst_stages = vk::PipelineStageFlags::BOTTOM_OF_PIPE;
}
(src_stages, dst_stages, memory_barrier)
}
pub fn get_buffer_memory_barrier<'a>(
barrier: &BufferBarrier<'a>,
) -> (
vk::PipelineStageFlags,
vk::PipelineStageFlags,
vk::BufferMemoryBarrier<'a>,
) {
let mut src_stages = vk::PipelineStageFlags::empty();
let mut dst_stages = vk::PipelineStageFlags::empty();
let mut buffer_barrier = vk::BufferMemoryBarrier {
src_queue_family_index: barrier.src_queue_family_index,
dst_queue_family_index: barrier.dst_queue_family_index,
buffer: barrier.buffer,
offset: barrier.offset as u64,
size: barrier.size as u64,
..Default::default()
};
for previous_access in barrier.previous_accesses {
let previous_info = get_access_info(*previous_access);
src_stages |= previous_info.stage_mask;
if is_write_access(*previous_access) {
buffer_barrier.src_access_mask |= previous_info.access_mask;
}
}
for next_access in barrier.next_accesses {
let next_info = get_access_info(*next_access);
dst_stages |= next_info.stage_mask;
if buffer_barrier.src_access_mask != vk::AccessFlags::empty() {
buffer_barrier.dst_access_mask |= next_info.access_mask;
}
}
if src_stages == vk::PipelineStageFlags::empty() {
src_stages = vk::PipelineStageFlags::TOP_OF_PIPE;
}
if dst_stages == vk::PipelineStageFlags::empty() {
dst_stages = vk::PipelineStageFlags::BOTTOM_OF_PIPE;
}
(src_stages, dst_stages, buffer_barrier)
}
pub fn get_image_memory_barrier<'a>(
barrier: &ImageBarrier<'a>,
) -> (
vk::PipelineStageFlags,
vk::PipelineStageFlags,
vk::ImageMemoryBarrier<'a>,
) {
let mut src_stages = vk::PipelineStageFlags::empty();
let mut dst_stages = vk::PipelineStageFlags::empty();
let mut image_barrier = vk::ImageMemoryBarrier {
src_queue_family_index: barrier.src_queue_family_index,
dst_queue_family_index: barrier.dst_queue_family_index,
image: barrier.image,
subresource_range: barrier.range,
..Default::default()
};
for previous_access in barrier.previous_accesses {
let previous_info = get_access_info(*previous_access);
src_stages |= previous_info.stage_mask;
if is_write_access(*previous_access) {
image_barrier.src_access_mask |= previous_info.access_mask;
}
if barrier.discard_contents {
image_barrier.old_layout = vk::ImageLayout::UNDEFINED;
} else {
let layout = match barrier.previous_layout {
ImageLayout::General => {
if *previous_access == AccessType::Present {
vk::ImageLayout::PRESENT_SRC_KHR
} else {
vk::ImageLayout::GENERAL
}
}
ImageLayout::Optimal => previous_info.image_layout,
ImageLayout::GeneralAndPresentation => {
unimplemented!()
}
};
image_barrier.old_layout = layout;
}
}
for next_access in barrier.next_accesses {
let next_info = get_access_info(*next_access);
dst_stages |= next_info.stage_mask;
image_barrier.dst_access_mask |= next_info.access_mask;
let layout = match barrier.next_layout {
ImageLayout::General => {
if *next_access == AccessType::Present {
vk::ImageLayout::PRESENT_SRC_KHR
} else {
vk::ImageLayout::GENERAL
}
}
ImageLayout::Optimal => next_info.image_layout,
ImageLayout::GeneralAndPresentation => {
unimplemented!()
}
};
image_barrier.new_layout = layout;
}
if src_stages == vk::PipelineStageFlags::empty() {
src_stages = vk::PipelineStageFlags::TOP_OF_PIPE;
}
if dst_stages == vk::PipelineStageFlags::empty() {
dst_stages = vk::PipelineStageFlags::BOTTOM_OF_PIPE;
}
(src_stages, dst_stages, image_barrier)
}
pub(crate) struct AccessInfo {
pub(crate) stage_mask: vk::PipelineStageFlags,
pub(crate) access_mask: vk::AccessFlags,
pub(crate) image_layout: vk::ImageLayout,
}
pub(crate) fn get_access_info(access_type: AccessType) -> AccessInfo {
match access_type {
AccessType::Nothing => AccessInfo {
stage_mask: vk::PipelineStageFlags::empty(),
access_mask: vk::AccessFlags::empty(),
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::CommandBufferReadNVX => AccessInfo {
stage_mask: vk::PipelineStageFlags::COMMAND_PREPROCESS_NV,
access_mask: vk::AccessFlags::COMMAND_PREPROCESS_READ_NV,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::IndirectBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::DRAW_INDIRECT,
access_mask: vk::AccessFlags::INDIRECT_COMMAND_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::IndexBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::VERTEX_INPUT,
access_mask: vk::AccessFlags::INDEX_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::VertexBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::VERTEX_INPUT,
access_mask: vk::AccessFlags::VERTEX_ATTRIBUTE_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::VertexShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::VERTEX_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::VertexShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::VERTEX_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::VertexShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::VERTEX_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::MeshShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::MESH_SHADER_EXT,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::MeshShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::MESH_SHADER_EXT,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::MeshShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::MESH_SHADER_EXT,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::TaskShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::TASK_SHADER_EXT,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::TaskShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::TASK_SHADER_EXT,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::TaskShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::TASK_SHADER_EXT,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::TessellationControlShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::TESSELLATION_CONTROL_SHADER,
access_mask: vk::AccessFlags::UNIFORM_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::TessellationControlShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::TESSELLATION_CONTROL_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::TessellationControlShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::TESSELLATION_CONTROL_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::TessellationEvaluationShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::TESSELLATION_EVALUATION_SHADER,
access_mask: vk::AccessFlags::UNIFORM_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::TessellationEvaluationShaderReadSampledImageOrUniformTexelBuffer => {
AccessInfo {
stage_mask: vk::PipelineStageFlags::TESSELLATION_EVALUATION_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
}
}
AccessType::TessellationEvaluationShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::TESSELLATION_EVALUATION_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::GeometryShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::GEOMETRY_SHADER,
access_mask: vk::AccessFlags::UNIFORM_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::GeometryShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::GEOMETRY_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::GeometryShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::GEOMETRY_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::FragmentShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: vk::AccessFlags::UNIFORM_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::FragmentShaderReadColorInputAttachment => AccessInfo {
stage_mask: vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: vk::AccessFlags::INPUT_ATTACHMENT_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::FragmentShaderReadDepthStencilInputAttachment => AccessInfo {
stage_mask: vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: vk::AccessFlags::INPUT_ATTACHMENT_READ,
image_layout: vk::ImageLayout::DEPTH_STENCIL_READ_ONLY_OPTIMAL,
},
AccessType::FragmentShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::ColorAttachmentRead => AccessInfo {
stage_mask: vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT,
access_mask: vk::AccessFlags::COLOR_ATTACHMENT_READ,
image_layout: vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
},
AccessType::DepthStencilAttachmentRead => AccessInfo {
stage_mask: vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ,
image_layout: vk::ImageLayout::DEPTH_STENCIL_READ_ONLY_OPTIMAL,
},
AccessType::DepthStencilAttachmentReadWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ
| vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE,
image_layout: vk::ImageLayout::DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
},
AccessType::ComputeShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: vk::AccessFlags::UNIFORM_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::ComputeShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::ComputeShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::AnyShaderReadUniformBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: vk::AccessFlags::UNIFORM_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::AnyShaderReadUniformBufferOrVertexBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: vk::AccessFlags::UNIFORM_READ | vk::AccessFlags::VERTEX_ATTRIBUTE_READ,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::AnyShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::AnyShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::TransferRead => AccessInfo {
stage_mask: vk::PipelineStageFlags::TRANSFER,
access_mask: vk::AccessFlags::TRANSFER_READ,
image_layout: vk::ImageLayout::TRANSFER_SRC_OPTIMAL,
},
AccessType::HostRead => AccessInfo {
stage_mask: vk::PipelineStageFlags::HOST,
access_mask: vk::AccessFlags::HOST_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::Present => AccessInfo {
stage_mask: vk::PipelineStageFlags::empty(),
access_mask: vk::AccessFlags::empty(),
image_layout: vk::ImageLayout::PRESENT_SRC_KHR,
},
AccessType::CommandBufferWriteNVX => AccessInfo {
stage_mask: vk::PipelineStageFlags::COMMAND_PREPROCESS_NV,
access_mask: vk::AccessFlags::COMMAND_PREPROCESS_WRITE_NV,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::VertexShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::VERTEX_SHADER,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::MeshShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::MESH_SHADER_EXT,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::TaskShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::TASK_SHADER_EXT,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::TessellationControlShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::TESSELLATION_CONTROL_SHADER,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::TessellationEvaluationShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::TESSELLATION_EVALUATION_SHADER,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::GeometryShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::GEOMETRY_SHADER,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::FragmentShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::ColorAttachmentWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT,
access_mask: vk::AccessFlags::COLOR_ATTACHMENT_WRITE,
image_layout: vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
},
AccessType::DepthStencilAttachmentWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE,
image_layout: vk::ImageLayout::DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
},
AccessType::DepthAttachmentWriteStencilReadOnly => AccessInfo {
stage_mask: vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE
| vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ,
image_layout: vk::ImageLayout::DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
},
AccessType::StencilAttachmentWriteDepthReadOnly => AccessInfo {
stage_mask: vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE
| vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ,
image_layout: vk::ImageLayout::DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
},
AccessType::ComputeShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::ComputeShaderReadWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: vk::AccessFlags::SHADER_READ | vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::AnyShaderWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: vk::AccessFlags::SHADER_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::TransferWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::TRANSFER,
access_mask: vk::AccessFlags::TRANSFER_WRITE,
image_layout: vk::ImageLayout::TRANSFER_DST_OPTIMAL,
},
AccessType::HostWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::HOST,
access_mask: vk::AccessFlags::HOST_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::ColorAttachmentReadWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT,
access_mask: vk::AccessFlags::COLOR_ATTACHMENT_READ
| vk::AccessFlags::COLOR_ATTACHMENT_WRITE,
image_layout: vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
},
AccessType::General => AccessInfo {
stage_mask: vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: vk::AccessFlags::MEMORY_READ | vk::AccessFlags::MEMORY_WRITE,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::RayTracingShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: vk::PipelineStageFlags::RAY_TRACING_SHADER_KHR,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::RayTracingShaderReadColorInputAttachment => AccessInfo {
stage_mask: vk::PipelineStageFlags::RAY_TRACING_SHADER_KHR,
access_mask: vk::AccessFlags::INPUT_ATTACHMENT_READ,
image_layout: vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::RayTracingShaderReadDepthStencilInputAttachment => AccessInfo {
stage_mask: vk::PipelineStageFlags::RAY_TRACING_SHADER_KHR,
access_mask: vk::AccessFlags::INPUT_ATTACHMENT_READ,
image_layout: vk::ImageLayout::DEPTH_STENCIL_READ_ONLY_OPTIMAL,
},
AccessType::RayTracingShaderReadAccelerationStructure => AccessInfo {
stage_mask: vk::PipelineStageFlags::RAY_TRACING_SHADER_KHR,
access_mask: vk::AccessFlags::ACCELERATION_STRUCTURE_READ_KHR,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::RayTracingShaderReadOther => AccessInfo {
stage_mask: vk::PipelineStageFlags::RAY_TRACING_SHADER_KHR,
access_mask: vk::AccessFlags::SHADER_READ,
image_layout: vk::ImageLayout::GENERAL,
},
AccessType::AccelerationStructureBuildWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::ACCELERATION_STRUCTURE_BUILD_KHR,
access_mask: vk::AccessFlags::ACCELERATION_STRUCTURE_WRITE_KHR,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::AccelerationStructureBuildRead => AccessInfo {
stage_mask: vk::PipelineStageFlags::ACCELERATION_STRUCTURE_BUILD_KHR,
access_mask: vk::AccessFlags::ACCELERATION_STRUCTURE_READ_KHR,
image_layout: vk::ImageLayout::UNDEFINED,
},
AccessType::AccelerationStructureBufferWrite => AccessInfo {
stage_mask: vk::PipelineStageFlags::ACCELERATION_STRUCTURE_BUILD_KHR,
access_mask: vk::AccessFlags::TRANSFER_WRITE,
image_layout: vk::ImageLayout::UNDEFINED,
},
}
}
pub(crate) fn is_write_access(access_type: AccessType) -> bool {
matches!(
access_type,
AccessType::CommandBufferWriteNVX
| AccessType::VertexShaderWrite
| AccessType::MeshShaderWrite
| AccessType::TaskShaderWrite
| AccessType::TessellationControlShaderWrite
| AccessType::TessellationEvaluationShaderWrite
| AccessType::GeometryShaderWrite
| AccessType::FragmentShaderWrite
| AccessType::ColorAttachmentWrite
| AccessType::DepthStencilAttachmentWrite
| AccessType::DepthAttachmentWriteStencilReadOnly
| AccessType::DepthStencilAttachmentReadWrite
| AccessType::StencilAttachmentWriteDepthReadOnly
| AccessType::ComputeShaderWrite
| AccessType::ComputeShaderReadWrite
| AccessType::AnyShaderWrite
| AccessType::TransferWrite
| AccessType::HostWrite
| AccessType::ColorAttachmentReadWrite
| AccessType::General
)
}