src_access_mask |= info.access;
}
- let layout = match barrier.prev_layout {
- ImageLayout::Optimal => info.layout,
- ImageLayout::General => {
- if access == Access::PresentRead {
- vk::ImageLayout::PresentSrcKhr
- } else {
- vk::ImageLayout::General
+ old_layout = if barrier.discard_contents {
+ vk::ImageLayout::Undefined
+ } else {
+ let layout = match barrier.prev_layout {
+ ImageLayout::Optimal => info.layout,
+ ImageLayout::General => {
+ if access == Access::PresentRead {
+ vk::ImageLayout::PresentSrcKhr
+ } else {
+ vk::ImageLayout::General
+ }
}
- }
- };
+ };
- debug_assert!(
- old_layout == vk::ImageLayout::Undefined || old_layout == layout,
- "mixed image layout"
- );
+ debug_assert!(
+ old_layout == vk::ImageLayout::Undefined || old_layout == layout,
+ "mixed image layout"
+ );
- old_layout = layout;
+ layout
+ };
}
for &access in barrier.next_access {
gpu.cmd_barrier(
cmd_encoder,
None,
- &[ImageBarrier::layout_optimal(
- &[Access::None],
- &[Access::TransferWrite],
+ &[ImageBarrier {
+ prev_access: &[Access::General],
+ next_access: &[Access::TransferWrite],
+ prev_layout: ImageLayout::Optimal,
+ next_layout: ImageLayout::Optimal,
+ subresource_range: ImageSubresourceRange::default(),
image,
- ImageAspectFlags::COLOR,
- )],
+ discard_contents: true,
+ }],
);
let buffer = gpu.request_transient_buffer_with_data(
cmd_encoder,
None,
&[ImageBarrier {
- prev_access: &[Access::None],
+ prev_access: &[Access::General],
next_access: &[Access::TransferWrite],
prev_layout: ImageLayout::Optimal,
next_layout: ImageLayout::Optimal,
subresource_range: ImageSubresourceRange::default(),
image,
+ discard_contents: true,
}],
);
gpu.cmd_barrier(
cmd_encoder,
None,
- &[ImageBarrier {
- prev_access: &[Access::TransferWrite],
- next_access: &[Access::ShaderSampledImageRead],
- prev_layout: ImageLayout::Optimal,
- next_layout: ImageLayout::Optimal,
- subresource_range: ImageSubresourceRange::default(),
+ &[ImageBarrier::layout_optimal(
+ &[Access::TransferWrite],
+ &[Access::ShaderSampledImageRead],
image,
- }],
+ ImageAspectFlags::COLOR,
+ )],
);
image
gpu.cmd_barrier(
cmd_encoder,
None,
- &[ImageBarrier::layout_optimal(
- &[Access::ShaderSampledImageRead],
- &[Access::TransferWrite],
- self.glyph_atlas_images[self.glyph_atlas_image_index & 1],
- ImageAspectFlags::COLOR,
- )],
+ &[ImageBarrier {
+ prev_access: &[Access::ShaderSampledImageRead],
+ prev_layout: ImageLayout::Optimal,
+ next_access: &[Access::TransferWrite],
+ next_layout: ImageLayout::Optimal,
+ image: self.glyph_atlas_images[self.glyph_atlas_image_index & 1],
+ subresource_range: default(),
+ discard_contents: true,
+ }],
);
gpu.cmd_copy_buffer_to_image(
cmd_encoder,
None,
&[
- ImageBarrier::layout_optimal(
- &[Access::None],
- &[Access::ColorAttachmentWrite],
- self.color_image,
- ImageAspectFlags::COLOR,
- ),
ImageBarrier {
- prev_access: &[Access::None],
+ prev_access: &[Access::ShaderOtherRead],
+ next_access: &[Access::ColorAttachmentWrite],
+ prev_layout: ImageLayout::Optimal,
+ next_layout: ImageLayout::Optimal,
+ image: self.color_image,
+ subresource_range: default(),
+ discard_contents: true,
+ },
+ ImageBarrier {
+ prev_access: &[Access::ShaderOtherRead],
next_access: &[Access::ComputeWrite],
prev_layout: ImageLayout::Optimal,
next_layout: ImageLayout::General,
image: self.ui_image,
subresource_range: default(),
+ discard_contents: true,
},
],
);
gpu.cmd_end_debug_marker(cmd_encoder);
+ gpu.cmd_compute_touch_swapchain(cmd_encoder, swapchain_image);
+
let compute_bind_group = gpu.request_transient_bind_group(
frame,
thread_token,
next_layout: ImageLayout::General,
image: self.color_image,
subresource_range: ImageSubresourceRange::default(),
+ discard_contents: false,
},
ImageBarrier {
prev_access: &[Access::ComputeWrite],
next_layout: ImageLayout::General,
image: self.ui_image,
subresource_range: ImageSubresourceRange::default(),
+ discard_contents: false,
},
],
);
- gpu.cmd_compute_touch_swapchain(cmd_encoder, swapchain_image);
-
gpu.cmd_set_pipeline(cmd_encoder, self.pipelines.composite_pipeline);
gpu.cmd_set_bind_group(cmd_encoder, 0, &compute_bind_group);
gpu.cmd_push_constants(