Skip to content

Commit d9813f0

Browse files
bors[bot]fu5ha
andcommitted
Merge #2499
2499: Add queue family resource ownership transfer to memory barriers for Vulkan r=msiglreith a=termhn ~~This is untested so far because I am not currently at a computer with Vulkan to test on... seems simple enough though.~~ Related to #1610, #1498 cc @omni-viral PR checklist: - [ ] `make` succeeds (on *nix) - [ ] `make reftests` succeeds - [x] tested examples with the following backends: vulkan, dx12, (no changes for metal) - [ ] `rustfmt` run on changed code Co-authored-by: Gray Olson <[email protected]>
2 parents 52e818a + 1cbef20 commit d9813f0

File tree

7 files changed

+55
-8
lines changed

7 files changed

+55
-8
lines changed

examples/colour-uniform/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,7 @@ impl<B: Backend> ImageState<B> {
11771177
states: (i::Access::empty(), i::Layout::Undefined)
11781178
..(i::Access::TRANSFER_WRITE, i::Layout::TransferDstOptimal),
11791179
target: &image,
1180+
families: None,
11801181
range: COLOR_RANGE.clone(),
11811182
};
11821183

@@ -1212,6 +1213,7 @@ impl<B: Backend> ImageState<B> {
12121213
states: (i::Access::TRANSFER_WRITE, i::Layout::TransferDstOptimal)
12131214
..(i::Access::SHADER_READ, i::Layout::ShaderReadOnlyOptimal),
12141215
target: &image,
1216+
families: None,
12151217
range: COLOR_RANGE.clone(),
12161218
};
12171219
cmd_buffer.pipeline_barrier(

examples/compute/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ fn main() {
146146
memory::Dependencies::empty(),
147147
Some(memory::Barrier::Buffer {
148148
states: buffer::Access::TRANSFER_WRITE .. buffer::Access::SHADER_READ | buffer::Access::SHADER_WRITE,
149+
families: None,
149150
target: &device_buffer
150151
}),
151152
);
@@ -157,6 +158,7 @@ fn main() {
157158
memory::Dependencies::empty(),
158159
Some(memory::Barrier::Buffer {
159160
states: buffer::Access::SHADER_READ | buffer::Access::SHADER_WRITE .. buffer::Access::TRANSFER_READ,
161+
families: None,
160162
target: &device_buffer
161163
}),
162164
);

examples/quad/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ fn main() {
304304
states: (i::Access::empty(), i::Layout::Undefined)
305305
..(i::Access::TRANSFER_WRITE, i::Layout::TransferDstOptimal),
306306
target: &image_logo,
307+
families: None,
307308
range: COLOR_RANGE.clone(),
308309
};
309310

@@ -339,6 +340,7 @@ fn main() {
339340
states: (i::Access::TRANSFER_WRITE, i::Layout::TransferDstOptimal)
340341
..(i::Access::SHADER_READ, i::Layout::ShaderReadOnlyOptimal),
341342
target: &image_logo,
343+
families: None,
342344
range: COLOR_RANGE.clone(),
343345
};
344346
cmd_buffer.pipeline_barrier(

src/backend/dx12/src/command.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1163,7 +1163,13 @@ impl com::RawCommandBuffer<Backend> for CommandBuffer {
11631163
};
11641164
raw_barriers.push(bar);
11651165
}
1166-
memory::Barrier::Buffer { ref states, target } => {
1166+
memory::Barrier::Buffer { ref states, target, ref families, } => {
1167+
// TODO: Implement queue family ownership transitions for dx12
1168+
if let Some(f) = families {
1169+
if f.start.0 != f.end.0 {
1170+
unimplemented!("Queue family resource ownership transitions are not implemented for DX12 (attempted transition from queue family {} to {}", f.start.0, f.end.0);
1171+
}
1172+
}
11671173
let state_src = conv::map_buffer_resource_state(states.start);
11681174
let state_dst = conv::map_buffer_resource_state(states.end);
11691175

@@ -1183,8 +1189,15 @@ impl com::RawCommandBuffer<Backend> for CommandBuffer {
11831189
memory::Barrier::Image {
11841190
ref states,
11851191
target,
1192+
ref families,
11861193
ref range,
11871194
} => {
1195+
// TODO: Implement queue family ownership transitions for dx12
1196+
if let Some(f) = families {
1197+
if f.start.0 != f.end.0 {
1198+
unimplemented!("Queue family resource ownership transitions are not implemented for DX12 (attempted transition from queue family {} to {}", f.start.0, f.end.0);
1199+
}
1200+
}
11881201
let _ = range; //TODO: use subresource range
11891202
let state_src = conv::map_image_resource_state(states.start.0, states.start.1);
11901203
let state_dst = conv::map_image_resource_state(states.end.0, states.end.1);

src/backend/vulkan/src/command.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,30 +211,38 @@ impl com::RawCommandBuffer<Backend> for CommandBuffer {
211211
dst_access_mask: conv::map_image_access(access.end),
212212
});
213213
}
214-
memory::Barrier::Buffer { ref states, target} => {
214+
memory::Barrier::Buffer { ref states, target, ref families, } => {
215+
let families = match families {
216+
Some(f) => f.start.0 as u32 .. f.end.0 as u32,
217+
None => vk::VK_QUEUE_FAMILY_IGNORED..vk::VK_QUEUE_FAMILY_IGNORED,
218+
};
215219
buffer_bars.push(vk::BufferMemoryBarrier {
216220
s_type: vk::StructureType::BufferMemoryBarrier,
217221
p_next: ptr::null(),
218222
src_access_mask: conv::map_buffer_access(states.start),
219223
dst_access_mask: conv::map_buffer_access(states.end),
220-
src_queue_family_index: vk::VK_QUEUE_FAMILY_IGNORED, // TODO
221-
dst_queue_family_index: vk::VK_QUEUE_FAMILY_IGNORED, // TODO
224+
src_queue_family_index: families.start,
225+
dst_queue_family_index: families.end,
222226
buffer: target.raw,
223227
offset: 0,
224228
size: vk::VK_WHOLE_SIZE,
225229
});
226230
}
227-
memory::Barrier::Image { ref states, target, ref range } => {
231+
memory::Barrier::Image { ref states, target, ref range, ref families, } => {
228232
let subresource_range = conv::map_subresource_range(range);
233+
let families = match families {
234+
Some(f) => f.start.0 as u32 .. f.end.0 as u32,
235+
None => vk::VK_QUEUE_FAMILY_IGNORED..vk::VK_QUEUE_FAMILY_IGNORED,
236+
};
229237
image_bars.push(vk::ImageMemoryBarrier {
230238
s_type: vk::StructureType::ImageMemoryBarrier,
231239
p_next: ptr::null(),
232240
src_access_mask: conv::map_image_access(states.start.0),
233241
dst_access_mask: conv::map_image_access(states.end.0),
234242
old_layout: conv::map_image_layout(states.start.1),
235243
new_layout: conv::map_image_layout(states.end.1),
236-
src_queue_family_index: vk::VK_QUEUE_FAMILY_IGNORED, // TODO
237-
dst_queue_family_index: vk::VK_QUEUE_FAMILY_IGNORED, // TODO
244+
src_queue_family_index: families.start,
245+
dst_queue_family_index: families.end,
238246
image: target.raw,
239247
subresource_range,
240248
});

src/hal/src/memory.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use std::mem;
44
use std::ops::Range;
5-
use {buffer, image};
5+
use {buffer, image, queue};
66
use Backend;
77

88
/// A trait for plain-old-data types.
@@ -91,13 +91,19 @@ pub enum Barrier<'a, B: Backend> {
9191
states: Range<buffer::State>,
9292
/// The buffer the barrier controls.
9393
target: &'a B::Buffer,
94+
/// The source and destination Queue family IDs, for a [queue family ownership transfer](https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#synchronization-queue-transfers)
95+
/// Can be `None` to indicate no ownership transfer.
96+
families: Option<Range<queue::QueueFamilyId>>,
9497
},
9598
/// A memory barrier that defines access to (a subset of) an image.
9699
Image {
97100
/// The access flags controlling the image.
98101
states: Range<image::State>,
99102
/// The image the barrier controls.
100103
target: &'a B::Image,
104+
/// The source and destination Queue family IDs, for a [queue family ownership transfer](https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#synchronization-queue-transfers)
105+
/// Can be `None` to indicate no ownership transfer.
106+
families: Option<Range<queue::QueueFamilyId>>,
101107
/// A `SubresourceRange` that defines which section of an image the barrier applies to.
102108
range: image::SubresourceRange,
103109
},

src/warden/src/gpu.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,14 @@ impl<B: hal::Backend> Buffer<B> {
5959
fn barrier_to(&self, access: b::Access) -> memory::Barrier<B> {
6060
memory::Barrier::Buffer {
6161
states: self.stable_state .. access,
62+
families: None,
6263
target: &self.handle,
6364
}
6465
}
6566
fn barrier_from(&self, access: b::Access) -> memory::Barrier<B> {
6667
memory::Barrier::Buffer {
6768
states: access .. self.stable_state,
69+
families: None,
6870
target: &self.handle,
6971
}
7072
}
@@ -84,13 +86,15 @@ impl<B: hal::Backend> Image<B> {
8486
memory::Barrier::Image {
8587
states: self.stable_state .. (access, layout),
8688
target: &self.handle,
89+
families: None,
8790
range: self.range.clone(),
8891
}
8992
}
9093
fn barrier_from(&self, access: i::Access, layout: i::Layout) -> memory::Barrier<B> {
9194
memory::Barrier::Image {
9295
states: (access, layout) .. self.stable_state,
9396
target: &self.handle,
97+
families: None,
9498
range: self.range.clone(),
9599
}
96100
}
@@ -229,6 +233,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
229233
if false { //TODO
230234
let buffer_barrier = memory::Barrier::Buffer {
231235
states: b::Access::empty() .. access,
236+
families: None,
232237
target: &buffer,
233238
};
234239
init_cmd.pipeline_barrier(
@@ -264,6 +269,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
264269
let final_state = b::Access::SHADER_READ;
265270
let pre_barrier = memory::Barrier::Buffer {
266271
states: b::Access::empty() .. b::Access::TRANSFER_WRITE,
272+
families: None,
267273
target: &buffer,
268274
};
269275
init_cmd.pipeline_barrier(
@@ -283,6 +289,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
283289
);
284290
let post_barrier = memory::Barrier::Buffer {
285291
states: b::Access::TRANSFER_WRITE .. final_state,
292+
families: None,
286293
target: &buffer,
287294
};
288295
init_cmd.pipeline_barrier(
@@ -333,6 +340,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
333340
let image_barrier = memory::Barrier::Image {
334341
states: (i::Access::empty(), i::Layout::Undefined) .. (access, layout),
335342
target: &image,
343+
families: None,
336344
range: i::SubresourceRange {
337345
aspects,
338346
.. COLOR_RANGE.clone()
@@ -390,6 +398,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
390398
states: (i::Access::empty(), i::Layout::Undefined) ..
391399
(i::Access::TRANSFER_WRITE, i::Layout::TransferDstOptimal),
392400
target: &image,
401+
families: None,
393402
range: COLOR_RANGE.clone(), //TODO
394403
};
395404
init_cmd.pipeline_barrier(
@@ -420,6 +429,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
420429
let post_barrier = memory::Barrier::Image {
421430
states: (i::Access::TRANSFER_WRITE, i::Layout::TransferDstOptimal) .. final_state,
422431
target: &image,
432+
families: None,
423433
range: COLOR_RANGE.clone(), //TODO
424434
};
425435
init_cmd.pipeline_barrier(
@@ -1070,6 +1080,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
10701080
let mut cmd_buffer = command_pool.acquire_command_buffer(false);
10711081
let pre_barrier = memory::Barrier::Buffer {
10721082
states: buffer.stable_state .. b::Access::TRANSFER_READ,
1083+
families: None,
10731084
target: &buffer.handle,
10741085
};
10751086
cmd_buffer.pipeline_barrier(
@@ -1091,6 +1102,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
10911102

10921103
let post_barrier = memory::Barrier::Buffer {
10931104
states: b::Access::TRANSFER_READ .. buffer.stable_state,
1105+
families: None,
10941106
target: &buffer.handle,
10951107
};
10961108
cmd_buffer.pipeline_barrier(
@@ -1165,6 +1177,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
11651177
let pre_barrier = memory::Barrier::Image {
11661178
states: image.stable_state .. (i::Access::TRANSFER_READ, i::Layout::TransferSrcOptimal),
11671179
target: &image.handle,
1180+
families: None,
11681181
range: COLOR_RANGE.clone(), //TODO
11691182
};
11701183
cmd_buffer.pipeline_barrier(
@@ -1199,6 +1212,7 @@ impl<B: hal::Backend> Scene<B, hal::General> {
11991212
let post_barrier = memory::Barrier::Image {
12001213
states: (i::Access::TRANSFER_READ, i::Layout::TransferSrcOptimal) .. image.stable_state,
12011214
target: &image.handle,
1215+
families: None,
12021216
range: COLOR_RANGE.clone(), //TODO
12031217
};
12041218
cmd_buffer.pipeline_barrier(

0 commit comments

Comments
 (0)