extern crate ash;
pub type BufferType = ash::vk::Buffer;
pub type ImageType = ash::vk::Image;
pub type ImageSubresourceRangeType = ash::vk::ImageSubresourceRange;
pub mod cmd;
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum AccessType {
Nothing,
CommandBufferReadNVX,
IndirectBuffer,
IndexBuffer,
VertexBuffer,
VertexShaderReadUniformBuffer,
VertexShaderReadSampledImageOrUniformTexelBuffer,
VertexShaderReadOther,
TessellationControlShaderReadUniformBuffer,
TessellationControlShaderReadSampledImageOrUniformTexelBuffer,
TessellationControlShaderReadOther,
TessellationEvaluationShaderReadUniformBuffer,
TessellationEvaluationShaderReadSampledImageOrUniformTexelBuffer,
TessellationEvaluationShaderReadOther,
GeometryShaderReadUniformBuffer,
GeometryShaderReadSampledImageOrUniformTexelBuffer,
GeometryShaderReadOther,
FragmentShaderReadUniformBuffer,
FragmentShaderReadSampledImageOrUniformTexelBuffer,
FragmentShaderReadColorInputAttachment,
FragmentShaderReadDepthStencilInputAttachment,
FragmentShaderReadOther,
ColorAttachmentRead,
DepthStencilAttachmentRead,
ComputeShaderReadUniformBuffer,
ComputeShaderReadSampledImageOrUniformTexelBuffer,
ComputeShaderReadOther,
AnyShaderReadUniformBuffer,
AnyShaderReadUniformBufferOrVertexBuffer,
AnyShaderReadSampledImageOrUniformTexelBuffer,
AnyShaderReadOther,
TransferRead,
HostRead,
Present,
CommandBufferWriteNVX,
VertexShaderWrite,
TessellationControlShaderWrite,
TessellationEvaluationShaderWrite,
GeometryShaderWrite,
FragmentShaderWrite,
ColorAttachmentWrite,
DepthStencilAttachmentWrite,
DepthAttachmentWriteStencilReadOnly,
StencilAttachmentWriteDepthReadOnly,
ComputeShaderWrite,
AnyShaderWrite,
TransferWrite,
HostWrite,
ColorAttachmentReadWrite,
General,
}
impl Default for AccessType {
fn default() -> Self {
AccessType::Nothing
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum ImageLayout {
Optimal,
General,
GeneralAndPresentation,
}
impl Default for ImageLayout {
fn default() -> Self {
ImageLayout::Optimal
}
}
#[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: BufferType,
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: ImageType,
pub range: ImageSubresourceRangeType,
}
pub fn get_memory_barrier(
barrier: &GlobalBarrier,
) -> (
ash::vk::PipelineStageFlags,
ash::vk::PipelineStageFlags,
ash::vk::MemoryBarrier,
) {
let mut src_stages = ash::vk::PipelineStageFlags::empty();
let mut dst_stages = ash::vk::PipelineStageFlags::empty();
let mut memory_barrier = ash::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 != ash::vk::AccessFlags::empty() {
memory_barrier.dst_access_mask |= next_info.access_mask;
}
}
if src_stages == ash::vk::PipelineStageFlags::empty() {
src_stages = ash::vk::PipelineStageFlags::TOP_OF_PIPE;
}
if dst_stages == ash::vk::PipelineStageFlags::empty() {
dst_stages = ash::vk::PipelineStageFlags::BOTTOM_OF_PIPE;
}
(src_stages, dst_stages, memory_barrier)
}
pub fn get_buffer_memory_barrier(
barrier: &BufferBarrier,
) -> (
ash::vk::PipelineStageFlags,
ash::vk::PipelineStageFlags,
ash::vk::BufferMemoryBarrier,
) {
let mut src_stages = ash::vk::PipelineStageFlags::empty();
let mut dst_stages = ash::vk::PipelineStageFlags::empty();
let mut buffer_barrier = ash::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 != ash::vk::AccessFlags::empty() {
buffer_barrier.dst_access_mask |= next_info.access_mask;
}
}
if src_stages == ash::vk::PipelineStageFlags::empty() {
src_stages = ash::vk::PipelineStageFlags::TOP_OF_PIPE;
}
if dst_stages == ash::vk::PipelineStageFlags::empty() {
dst_stages = ash::vk::PipelineStageFlags::BOTTOM_OF_PIPE;
}
(src_stages, dst_stages, buffer_barrier)
}
pub fn get_image_memory_barrier(
barrier: &ImageBarrier,
) -> (
ash::vk::PipelineStageFlags,
ash::vk::PipelineStageFlags,
ash::vk::ImageMemoryBarrier,
) {
let mut src_stages = ash::vk::PipelineStageFlags::empty();
let mut dst_stages = ash::vk::PipelineStageFlags::empty();
let mut image_barrier = ash::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 = ash::vk::ImageLayout::UNDEFINED;
} else {
let layout = match barrier.previous_layout {
ImageLayout::General => {
if *previous_access == AccessType::Present {
ash::vk::ImageLayout::PRESENT_SRC_KHR
} else {
ash::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;
if image_barrier.src_access_mask != ash::vk::AccessFlags::empty() {
image_barrier.dst_access_mask |= next_info.access_mask;
}
let layout = match barrier.next_layout {
ImageLayout::General => {
if *next_access == AccessType::Present {
ash::vk::ImageLayout::PRESENT_SRC_KHR
} else {
ash::vk::ImageLayout::GENERAL
}
}
ImageLayout::Optimal => next_info.image_layout,
ImageLayout::GeneralAndPresentation => {
unimplemented!()
}
};
image_barrier.new_layout = layout;
}
if src_stages == ash::vk::PipelineStageFlags::empty() {
src_stages = ash::vk::PipelineStageFlags::TOP_OF_PIPE;
}
if dst_stages == ash::vk::PipelineStageFlags::empty() {
dst_stages = ash::vk::PipelineStageFlags::BOTTOM_OF_PIPE;
}
(src_stages, dst_stages, image_barrier)
}
pub(crate) struct AccessInfo {
pub(crate) stage_mask: ash::vk::PipelineStageFlags,
pub(crate) access_mask: ash::vk::AccessFlags,
pub(crate) image_layout: ash::vk::ImageLayout,
}
pub(crate) fn get_access_info(access_type: AccessType) -> AccessInfo {
match access_type {
AccessType::Nothing => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::empty(),
access_mask: ash::vk::AccessFlags::empty(),
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::CommandBufferReadNVX => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COMMAND_PROCESS_NVX,
access_mask: ash::vk::AccessFlags::COMMAND_PROCESS_READ_NVX,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::IndirectBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::DRAW_INDIRECT,
access_mask: ash::vk::AccessFlags::INDIRECT_COMMAND_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::IndexBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::VERTEX_INPUT,
access_mask: ash::vk::AccessFlags::INDEX_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::VertexBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::VERTEX_INPUT,
access_mask: ash::vk::AccessFlags::VERTEX_ATTRIBUTE_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::VertexShaderReadUniformBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::VERTEX_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::VertexShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::VERTEX_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::VertexShaderReadOther => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::VERTEX_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::TessellationControlShaderReadUniformBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TESSELLATION_CONTROL_SHADER,
access_mask: ash::vk::AccessFlags::UNIFORM_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::TessellationControlShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TESSELLATION_CONTROL_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::TessellationControlShaderReadOther => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TESSELLATION_CONTROL_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::TessellationEvaluationShaderReadUniformBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TESSELLATION_EVALUATION_SHADER,
access_mask: ash::vk::AccessFlags::UNIFORM_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::TessellationEvaluationShaderReadSampledImageOrUniformTexelBuffer => {
AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TESSELLATION_EVALUATION_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
}
}
AccessType::TessellationEvaluationShaderReadOther => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TESSELLATION_EVALUATION_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::GeometryShaderReadUniformBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::GEOMETRY_SHADER,
access_mask: ash::vk::AccessFlags::UNIFORM_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::GeometryShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::GEOMETRY_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::GeometryShaderReadOther => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::GEOMETRY_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::FragmentShaderReadUniformBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: ash::vk::AccessFlags::UNIFORM_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::FragmentShaderReadColorInputAttachment => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: ash::vk::AccessFlags::INPUT_ATTACHMENT_READ,
image_layout: ash::vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::FragmentShaderReadDepthStencilInputAttachment => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: ash::vk::AccessFlags::INPUT_ATTACHMENT_READ,
image_layout: ash::vk::ImageLayout::DEPTH_STENCIL_READ_ONLY_OPTIMAL,
},
AccessType::FragmentShaderReadOther => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::ColorAttachmentRead => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT,
access_mask: ash::vk::AccessFlags::COLOR_ATTACHMENT_READ,
image_layout: ash::vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
},
AccessType::DepthStencilAttachmentRead => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| ash::vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: ash::vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ,
image_layout: ash::vk::ImageLayout::DEPTH_STENCIL_READ_ONLY_OPTIMAL,
},
AccessType::ComputeShaderReadUniformBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: ash::vk::AccessFlags::UNIFORM_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::ComputeShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::ComputeShaderReadOther => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::AnyShaderReadUniformBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: ash::vk::AccessFlags::UNIFORM_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::AnyShaderReadUniformBufferOrVertexBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: ash::vk::AccessFlags::UNIFORM_READ
| ash::vk::AccessFlags::VERTEX_ATTRIBUTE_READ,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::AnyShaderReadSampledImageOrUniformTexelBuffer => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
},
AccessType::AnyShaderReadOther => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: ash::vk::AccessFlags::SHADER_READ,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::TransferRead => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TRANSFER,
access_mask: ash::vk::AccessFlags::TRANSFER_READ,
image_layout: ash::vk::ImageLayout::TRANSFER_SRC_OPTIMAL,
},
AccessType::HostRead => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::HOST,
access_mask: ash::vk::AccessFlags::HOST_READ,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::Present => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::empty(),
access_mask: ash::vk::AccessFlags::empty(),
image_layout: ash::vk::ImageLayout::PRESENT_SRC_KHR,
},
AccessType::CommandBufferWriteNVX => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COMMAND_PROCESS_NVX,
access_mask: ash::vk::AccessFlags::COMMAND_PROCESS_WRITE_NVX,
image_layout: ash::vk::ImageLayout::UNDEFINED,
},
AccessType::VertexShaderWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::VERTEX_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::TessellationControlShaderWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TESSELLATION_CONTROL_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::TessellationEvaluationShaderWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TESSELLATION_EVALUATION_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::GeometryShaderWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::GEOMETRY_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::FragmentShaderWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::FRAGMENT_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::ColorAttachmentWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT,
access_mask: ash::vk::AccessFlags::COLOR_ATTACHMENT_WRITE,
image_layout: ash::vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
},
AccessType::DepthStencilAttachmentWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| ash::vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: ash::vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE,
image_layout: ash::vk::ImageLayout::DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
},
AccessType::DepthAttachmentWriteStencilReadOnly => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| ash::vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: ash::vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE
| ash::vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ,
image_layout: ash::vk::ImageLayout::DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
},
AccessType::StencilAttachmentWriteDepthReadOnly => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::EARLY_FRAGMENT_TESTS
| ash::vk::PipelineStageFlags::LATE_FRAGMENT_TESTS,
access_mask: ash::vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE
| ash::vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ,
image_layout: ash::vk::ImageLayout::DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
},
AccessType::ComputeShaderWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COMPUTE_SHADER,
access_mask: ash::vk::AccessFlags::SHADER_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::AnyShaderWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: ash::vk::AccessFlags::SHADER_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::TransferWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::TRANSFER,
access_mask: ash::vk::AccessFlags::TRANSFER_WRITE,
image_layout: ash::vk::ImageLayout::TRANSFER_DST_OPTIMAL,
},
AccessType::HostWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::HOST,
access_mask: ash::vk::AccessFlags::HOST_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
AccessType::ColorAttachmentReadWrite => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT,
access_mask: ash::vk::AccessFlags::COLOR_ATTACHMENT_READ
| ash::vk::AccessFlags::COLOR_ATTACHMENT_WRITE,
image_layout: ash::vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
},
AccessType::General => AccessInfo {
stage_mask: ash::vk::PipelineStageFlags::ALL_COMMANDS,
access_mask: ash::vk::AccessFlags::MEMORY_READ | ash::vk::AccessFlags::MEMORY_WRITE,
image_layout: ash::vk::ImageLayout::GENERAL,
},
}
}
pub(crate) fn is_write_access(access_type: AccessType) -> bool {
match access_type {
AccessType::CommandBufferWriteNVX => true,
AccessType::VertexShaderWrite => true,
AccessType::TessellationControlShaderWrite => true,
AccessType::TessellationEvaluationShaderWrite => true,
AccessType::GeometryShaderWrite => true,
AccessType::FragmentShaderWrite => true,
AccessType::ColorAttachmentWrite => true,
AccessType::DepthStencilAttachmentWrite => true,
AccessType::DepthAttachmentWriteStencilReadOnly => true,
AccessType::StencilAttachmentWriteDepthReadOnly => true,
AccessType::ComputeShaderWrite => true,
AccessType::AnyShaderWrite => true,
AccessType::TransferWrite => true,
AccessType::HostWrite => true,
AccessType::ColorAttachmentReadWrite => true,
AccessType::General => true,
_ => false,
}
}