Skip to content

Commit

Permalink
Removed inefficient Vec<AccessType> on barrier structs in favor of sl…
Browse files Browse the repository at this point in the history
…ice references.
  • Loading branch information
gwihlidal committed Jul 14, 2019
1 parent 809556a commit 3cf9345
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 63 deletions.
2 changes: 2 additions & 0 deletions src/cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ pub fn pipeline_barrier(
let mut src_stage_mask = ash::vk::PipelineStageFlags::TOP_OF_PIPE;
let mut dst_stage_mask = ash::vk::PipelineStageFlags::BOTTOM_OF_PIPE;

// TODO: Optimize out the Vec heap allocations
let mut vk_memory_barriers: Vec<ash::vk::MemoryBarrier> = Vec::with_capacity(1);
let mut vk_buffer_barriers: Vec<ash::vk::BufferMemoryBarrier> =
Vec::with_capacity(buffer_barriers.len());
Expand Down Expand Up @@ -119,6 +120,7 @@ pub fn wait_events(
let mut src_stage_mask = ash::vk::PipelineStageFlags::TOP_OF_PIPE;
let mut dst_stage_mask = ash::vk::PipelineStageFlags::BOTTOM_OF_PIPE;

// TODO: Optimize out the Vec heap allocations
let mut vk_memory_barriers: Vec<ash::vk::MemoryBarrier> = Vec::with_capacity(1);
let mut vk_buffer_barriers: Vec<ash::vk::BufferMemoryBarrier> =
Vec::with_capacity(buffer_barriers.len());
Expand Down
30 changes: 15 additions & 15 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,9 +214,9 @@ impl Default for ImageLayout {
///
/// Simply define the previous and next access types of resources affected.
#[derive(Debug, Default, Clone)]
pub struct GlobalBarrier {
pub previous_accesses: Vec<AccessType>,
pub next_accesses: Vec<AccessType>,
pub struct GlobalBarrier<'a> {
pub previous_accesses: &'a [AccessType],
pub next_accesses: &'a [AccessType],
}

/// Buffer barriers should only be used when a queue family ownership transfer
Expand All @@ -234,9 +234,9 @@ pub struct GlobalBarrier {
/// queue in the destination queue family, with a semaphore guaranteeing
/// execution order between them.
#[derive(Debug, Default, Clone)]
pub struct BufferBarrier {
pub previous_accesses: Vec<AccessType>,
pub next_accesses: Vec<AccessType>,
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,
Expand Down Expand Up @@ -271,9 +271,9 @@ pub struct BufferBarrier {
/// A good example of when to use this is when an application re-uses a presented
/// image after acquiring the next swap chain image.
#[derive(Debug, Default, Clone)]
pub struct ImageBarrier {
pub previous_accesses: Vec<AccessType>,
pub next_accesses: Vec<AccessType>,
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,
Expand All @@ -298,7 +298,7 @@ pub fn get_memory_barrier(

let mut memory_barrier = ash::vk::MemoryBarrier::default();

for previous_access in &barrier.previous_accesses {
for previous_access in barrier.previous_accesses {
let previous_info = get_access_info(*previous_access);

src_stages |= previous_info.stage_mask;
Expand All @@ -309,7 +309,7 @@ pub fn get_memory_barrier(
}
}

for next_access in &barrier.next_accesses {
for next_access in barrier.next_accesses {
let next_info = get_access_info(*next_access);

dst_stages |= next_info.stage_mask;
Expand Down Expand Up @@ -356,7 +356,7 @@ pub fn get_buffer_memory_barrier(
..Default::default()
};

for previous_access in &barrier.previous_accesses {
for previous_access in barrier.previous_accesses {
let previous_info = get_access_info(*previous_access);

src_stages |= previous_info.stage_mask;
Expand All @@ -367,7 +367,7 @@ pub fn get_buffer_memory_barrier(
}
}

for next_access in &barrier.next_accesses {
for next_access in barrier.next_accesses {
let next_info = get_access_info(*next_access);

dst_stages |= next_info.stage_mask;
Expand Down Expand Up @@ -413,7 +413,7 @@ pub fn get_image_memory_barrier(
..Default::default()
};

for previous_access in &barrier.previous_accesses {
for previous_access in barrier.previous_accesses {
let previous_info = get_access_info(*previous_access);

src_stages |= previous_info.stage_mask;
Expand Down Expand Up @@ -445,7 +445,7 @@ pub fn get_image_memory_barrier(
}
}

for next_access in &barrier.next_accesses {
for next_access in barrier.next_accesses {
let next_info = get_access_info(*next_access);

dst_stages |= next_info.stage_mask;
Expand Down
36 changes: 18 additions & 18 deletions tests/global.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ extern crate vk_sync;
fn compute_write_storage_compute_read_storage() {
// Compute write to storage buffer/image, Compute read from storage buffer/image
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::ComputeShaderWrite],
next_accesses: vec![vk_sync::AccessType::ComputeShaderReadOther],
previous_accesses: &[vk_sync::AccessType::ComputeShaderWrite],
next_accesses: &[vk_sync::AccessType::ComputeShaderReadOther],
};

let (src_mask, dst_mask, barrier) = vk_sync::get_memory_barrier(&global_barrier);
Expand All @@ -23,8 +23,8 @@ fn compute_write_storage_compute_read_storage() {
fn compute_read_storage_compute_write_storage() {
// Compute read from storage buffer, Compute write from storage buffer
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::ComputeShaderWrite],
next_accesses: vec![vk_sync::AccessType::ComputeShaderReadOther],
previous_accesses: &[vk_sync::AccessType::ComputeShaderWrite],
next_accesses: &[vk_sync::AccessType::ComputeShaderReadOther],
};

let (src_mask, dst_mask, barrier) = vk_sync::get_memory_barrier(&global_barrier);
Expand All @@ -39,8 +39,8 @@ fn compute_read_storage_compute_write_storage() {
fn compute_write_storage_graphics_read_index() {
// Compute write to storage buffer, Graphics read as index buffer
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::ComputeShaderWrite],
next_accesses: vec![vk_sync::AccessType::IndexBuffer],
previous_accesses: &[vk_sync::AccessType::ComputeShaderWrite],
next_accesses: &[vk_sync::AccessType::IndexBuffer],
};

let (src_mask, dst_mask, barrier) = vk_sync::get_memory_barrier(&global_barrier);
Expand All @@ -55,8 +55,8 @@ fn compute_write_storage_graphics_read_index() {
fn compute_write_storage_graphics_read_indirect() {
// Compute write to storage buffer, Graphics read as indirect buffer
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::ComputeShaderWrite],
next_accesses: vec![vk_sync::AccessType::IndirectBuffer],
previous_accesses: &[vk_sync::AccessType::ComputeShaderWrite],
next_accesses: &[vk_sync::AccessType::IndirectBuffer],
};

let (src_mask, dst_mask, barrier) = vk_sync::get_memory_barrier(&global_barrier);
Expand All @@ -74,8 +74,8 @@ fn compute_write_storage_graphics_read_indirect() {
fn nothing_transfer_read() {
// None, Transfer read from buffer
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::Nothing],
next_accesses: vec![vk_sync::AccessType::TransferRead],
previous_accesses: &[vk_sync::AccessType::Nothing],
next_accesses: &[vk_sync::AccessType::TransferRead],
};

let (src_mask, dst_mask, barrier) = vk_sync::get_memory_barrier(&global_barrier);
Expand All @@ -90,8 +90,8 @@ fn nothing_transfer_read() {
fn transfer_write_graphics_read_vertex() {
// Transfer write to buffer, Graphics read from vertex buffer
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::TransferWrite],
next_accesses: vec![vk_sync::AccessType::VertexBuffer],
previous_accesses: &[vk_sync::AccessType::TransferWrite],
next_accesses: &[vk_sync::AccessType::VertexBuffer],
};

let (src_mask, dst_mask, barrier) = vk_sync::get_memory_barrier(&global_barrier);
Expand All @@ -112,8 +112,8 @@ fn transfer_write_graphics_read_vertex() {
fn full_pipeline_barrier() {
// Full pipeline barrier
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::General],
next_accesses: vec![vk_sync::AccessType::General],
previous_accesses: &[vk_sync::AccessType::General],
next_accesses: &[vk_sync::AccessType::General],
};

let (src_mask, dst_mask, barrier) = vk_sync::get_memory_barrier(&global_barrier);
Expand All @@ -134,8 +134,8 @@ fn full_pipeline_barrier() {
fn compute_write_storage_graphics_read_index_compute_read_uniform() {
// Compute write to storage buffer, Graphics read as index buffer & Compute read as uniform buffer
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::ComputeShaderWrite],
next_accesses: vec![
previous_accesses: &[vk_sync::AccessType::ComputeShaderWrite],
next_accesses: &[
vk_sync::AccessType::IndexBuffer,
vk_sync::AccessType::ComputeShaderReadUniformBuffer,
],
Expand All @@ -159,8 +159,8 @@ fn compute_write_storage_graphics_read_index_compute_read_uniform() {
fn compute_write_texel_graphics_read_indirect_fragment_read_uniform() {
// Compute write to storage texel buffer, Graphics read as indirect buffer & fragment read as uniform buffer
let global_barrier = vk_sync::GlobalBarrier {
previous_accesses: vec![vk_sync::AccessType::ComputeShaderWrite],
next_accesses: vec![
previous_accesses: &[vk_sync::AccessType::ComputeShaderWrite],
next_accesses: &[
vk_sync::AccessType::IndirectBuffer,
vk_sync::AccessType::FragmentShaderReadUniformBuffer,
],
Expand Down
52 changes: 22 additions & 30 deletions tests/image.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ extern crate vk_sync;
fn compute_write_storage_fragment_read_sampled() {
// Compute write to storage image, Graphics fragment read as sampled image
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::ComputeShaderWrite],
next_accesses: vec![
vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer,
],
previous_accesses: &[vk_sync::AccessType::ComputeShaderWrite],
next_accesses: &[vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -43,8 +41,8 @@ fn compute_write_storage_fragment_read_sampled() {
fn graphics_write_color_compute_read_sampled() {
// Graphics write to color attachment, Compute read from sampled image
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: vec![vk_sync::AccessType::ComputeShaderReadSampledImageOrUniformTexelBuffer],
previous_accesses: &[vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: &[vk_sync::AccessType::ComputeShaderReadSampledImageOrUniformTexelBuffer],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -86,8 +84,8 @@ fn graphics_write_color_compute_read_sampled() {
fn graphics_write_depth_compute_read_sampled() {
// Graphics write to color attachment, Compute read from sampled image
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::DepthStencilAttachmentWrite],
next_accesses: vec![vk_sync::AccessType::ComputeShaderReadSampledImageOrUniformTexelBuffer],
previous_accesses: &[vk_sync::AccessType::DepthStencilAttachmentWrite],
next_accesses: &[vk_sync::AccessType::ComputeShaderReadSampledImageOrUniformTexelBuffer],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -130,8 +128,8 @@ fn graphics_write_depth_compute_read_sampled() {
fn graphics_write_depth_fragment_read_attachment() {
// Graphics write to depth attachment, Graphics fragment read from input attachment
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::DepthStencilAttachmentWrite],
next_accesses: vec![vk_sync::AccessType::FragmentShaderReadDepthStencilInputAttachment],
previous_accesses: &[vk_sync::AccessType::DepthStencilAttachmentWrite],
next_accesses: &[vk_sync::AccessType::FragmentShaderReadDepthStencilInputAttachment],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -177,10 +175,8 @@ fn graphics_write_depth_fragment_read_attachment() {
fn graphics_write_depth_fragment_read_sampled() {
// Graphics write to depth attachment, Graphics fragment read from sampled image
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::DepthStencilAttachmentWrite],
next_accesses: vec![
vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer,
],
previous_accesses: &[vk_sync::AccessType::DepthStencilAttachmentWrite],
next_accesses: &[vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -223,8 +219,8 @@ fn graphics_write_depth_fragment_read_sampled() {
fn graphics_write_color_fragment_read_attachment() {
// Graphics write to color attachment, Graphics fragment read from input attachment
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: vec![vk_sync::AccessType::FragmentShaderReadColorInputAttachment],
previous_accesses: &[vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: &[vk_sync::AccessType::FragmentShaderReadColorInputAttachment],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -269,10 +265,8 @@ fn graphics_write_color_fragment_read_attachment() {
fn graphics_write_color_fragment_read_sampled() {
// Graphics write to color attachment, Graphics fragment read from input attachment
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: vec![
vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer,
],
previous_accesses: &[vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: &[vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -314,8 +308,8 @@ fn graphics_write_color_fragment_read_sampled() {
fn graphics_write_color_vertex_read_sampled() {
// Graphics write to color attachment, Graphics vertex read from sampled image
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: vec![vk_sync::AccessType::VertexShaderReadSampledImageOrUniformTexelBuffer],
previous_accesses: &[vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: &[vk_sync::AccessType::VertexShaderReadSampledImageOrUniformTexelBuffer],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -357,10 +351,10 @@ fn graphics_write_color_vertex_read_sampled() {
fn graphics_read_sampled_graphics_write_color() {
// Graphics fragment read from sampled image, Graphics write to color attachment
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![
previous_accesses: &[
vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer,
],
next_accesses: vec![vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: &[vk_sync::AccessType::ColorAttachmentWrite],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -399,10 +393,8 @@ fn graphics_read_sampled_graphics_write_color() {
fn transfer_write_image_fragment_read_sampled() {
// Transfer write to image, Graphics fragment read from sampled image
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::TransferWrite],
next_accesses: vec![
vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer,
],
previous_accesses: &[vk_sync::AccessType::TransferWrite],
next_accesses: &[vk_sync::AccessType::FragmentShaderReadSampledImageOrUniformTexelBuffer],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down Expand Up @@ -441,8 +433,8 @@ fn transfer_write_image_fragment_read_sampled() {
fn graphics_write_color_presentation() {
// Graphics color attachment write, Presentation
let image_barrier = vk_sync::ImageBarrier {
previous_accesses: vec![vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: vec![vk_sync::AccessType::Present],
previous_accesses: &[vk_sync::AccessType::ColorAttachmentWrite],
next_accesses: &[vk_sync::AccessType::Present],
previous_layout: vk_sync::ImageLayout::Optimal,
next_layout: vk_sync::ImageLayout::Optimal,
discard_contents: false,
Expand Down

0 comments on commit 3cf9345

Please sign in to comment.