use super::*;
use ash;
pub fn pipeline_barrier(
device: &ash::Device,
command_buffer: vk::CommandBuffer,
global_barrier: Option<GlobalBarrier>,
buffer_barriers: &[BufferBarrier],
image_barriers: &[ImageBarrier],
) {
let mut src_stage_mask = vk::PipelineStageFlags::TOP_OF_PIPE;
let mut dst_stage_mask = vk::PipelineStageFlags::BOTTOM_OF_PIPE;
let mut vk_memory_barriers: Vec<vk::MemoryBarrier> = Vec::with_capacity(1);
let mut vk_buffer_barriers: Vec<vk::BufferMemoryBarrier> =
Vec::with_capacity(buffer_barriers.len());
let mut vk_image_barriers: Vec<vk::ImageMemoryBarrier> =
Vec::with_capacity(image_barriers.len());
if let Some(ref barrier) = global_barrier {
let (src_mask, dst_mask, barrier) = get_memory_barrier(barrier);
src_stage_mask |= src_mask;
dst_stage_mask |= dst_mask;
vk_memory_barriers.push(barrier);
}
for buffer_barrier in buffer_barriers {
let (src_mask, dst_mask, barrier) = get_buffer_memory_barrier(buffer_barrier);
src_stage_mask |= src_mask;
dst_stage_mask |= dst_mask;
vk_buffer_barriers.push(barrier);
}
for image_barrier in image_barriers {
let (src_mask, dst_mask, barrier) = get_image_memory_barrier(image_barrier);
src_stage_mask |= src_mask;
dst_stage_mask |= dst_mask;
vk_image_barriers.push(barrier);
}
unsafe {
device.cmd_pipeline_barrier(
command_buffer,
src_stage_mask,
dst_stage_mask,
vk::DependencyFlags::empty(),
&vk_memory_barriers,
&vk_buffer_barriers,
&vk_image_barriers,
);
}
}
pub fn set_event(
device: &ash::Device,
command_buffer: vk::CommandBuffer,
event: vk::Event,
previous_accesses: &[AccessType],
) {
let mut stage_mask = vk::PipelineStageFlags::TOP_OF_PIPE;
for previous_access in previous_accesses {
let previous_info = get_access_info(*previous_access);
stage_mask |= previous_info.stage_mask;
}
unsafe {
device.cmd_set_event(command_buffer, event, stage_mask);
}
}
pub fn reset_event(
device: &ash::Device,
command_buffer: vk::CommandBuffer,
event: vk::Event,
previous_accesses: &[AccessType],
) {
let mut stage_mask = vk::PipelineStageFlags::TOP_OF_PIPE;
for previous_access in previous_accesses {
let previous_info = get_access_info(*previous_access);
stage_mask |= previous_info.stage_mask;
}
unsafe {
device.cmd_reset_event(command_buffer, event, stage_mask);
}
}
pub fn wait_events(
device: &ash::Device,
command_buffer: vk::CommandBuffer,
events: &[vk::Event],
global_barrier: Option<GlobalBarrier>,
buffer_barriers: &[BufferBarrier],
image_barriers: &[ImageBarrier],
) {
let mut src_stage_mask = vk::PipelineStageFlags::TOP_OF_PIPE;
let mut dst_stage_mask = vk::PipelineStageFlags::BOTTOM_OF_PIPE;
let mut vk_memory_barriers: Vec<vk::MemoryBarrier> = Vec::with_capacity(1);
let mut vk_buffer_barriers: Vec<vk::BufferMemoryBarrier> =
Vec::with_capacity(buffer_barriers.len());
let mut vk_image_barriers: Vec<vk::ImageMemoryBarrier> =
Vec::with_capacity(image_barriers.len());
if let Some(ref barrier) = global_barrier {
let (src_mask, dst_mask, barrier) = get_memory_barrier(barrier);
src_stage_mask |= src_mask;
dst_stage_mask |= dst_mask;
vk_memory_barriers.push(barrier);
}
for buffer_barrier in buffer_barriers {
let (src_mask, dst_mask, barrier) = get_buffer_memory_barrier(buffer_barrier);
src_stage_mask |= src_mask;
dst_stage_mask |= dst_mask;
vk_buffer_barriers.push(barrier);
}
for image_barrier in image_barriers {
let (src_mask, dst_mask, barrier) = get_image_memory_barrier(image_barrier);
src_stage_mask |= src_mask;
dst_stage_mask |= dst_mask;
vk_image_barriers.push(barrier);
}
unsafe {
device.cmd_wait_events(
command_buffer,
&events,
src_stage_mask,
dst_stage_mask,
&vk_memory_barriers,
&vk_buffer_barriers,
&vk_image_barriers,
);
}
}