Skip to content

Commit e233ad6

Browse files
committed
Rework acceleration structure build tracking.
1 parent 896397e commit e233ad6

File tree

8 files changed

+179
-161
lines changed

8 files changed

+179
-161
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ By @syl20bnr in [#7326](https://github.com/gfx-rs/wgpu/pull/7326).
295295
- Reduce downlevel `max_color_attachments` limit from 8 to 4 for better GLES compatibility. By @adrian17 in [#6994](https://github.com/gfx-rs/wgpu/pull/6994).
296296
- Fix building a BLAS with a transform buffer by adding a flag to indicate usage of the transform buffer. By @Vecvec in
297297
[#7062](https://github.com/gfx-rs/wgpu/pull/7062).
298+
- Move incrementation of `Device::last_acceleration_structure_build_command_index` into queue submit. By @Vecvec in [#7462](https://github.com/gfx-rs/wgpu/pull/7462).
298299

299300
#### Vulkan
300301

tests/tests/wgpu-gpu/ray_tracing/as_build.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,80 @@ fn out_of_order_as_build_use(ctx: TestingContext) {
234234
},
235235
None,
236236
);
237+
238+
let as_ctx = AsBuildContext::new(
239+
&ctx,
240+
AccelerationStructureFlags::empty(),
241+
AccelerationStructureFlags::empty(),
242+
);
243+
244+
//
245+
// Build in the right order, then rebuild the BLAS so the TLAS is invalid, then use the TLAS.
246+
//
247+
248+
let mut encoder_blas = ctx
249+
.device
250+
.create_command_encoder(&CommandEncoderDescriptor {
251+
label: Some("BLAS 3"),
252+
});
253+
254+
encoder_blas.build_acceleration_structures([&as_ctx.blas_build_entry()], []);
255+
256+
let mut encoder_blas2 = ctx
257+
.device
258+
.create_command_encoder(&CommandEncoderDescriptor {
259+
label: Some("BLAS 4"),
260+
});
261+
262+
encoder_blas2.build_acceleration_structures([&as_ctx.blas_build_entry()], []);
263+
264+
let mut encoder_tlas = ctx
265+
.device
266+
.create_command_encoder(&CommandEncoderDescriptor {
267+
label: Some("TLAS 2"),
268+
});
269+
270+
encoder_tlas.build_acceleration_structures([], [&as_ctx.tlas_package]);
271+
272+
ctx.queue.submit([
273+
encoder_blas.finish(),
274+
encoder_tlas.finish(),
275+
encoder_blas2.finish(),
276+
]);
277+
278+
let bind_group = ctx.device.create_bind_group(&BindGroupDescriptor {
279+
label: None,
280+
layout: &compute_pipeline.get_bind_group_layout(0),
281+
entries: &[BindGroupEntry {
282+
binding: 0,
283+
resource: BindingResource::AccelerationStructure(as_ctx.tlas_package.tlas()),
284+
}],
285+
});
286+
287+
//
288+
// Use TLAS
289+
//
290+
291+
let mut encoder_compute = ctx
292+
.device
293+
.create_command_encoder(&CommandEncoderDescriptor::default());
294+
{
295+
let mut pass = encoder_compute.begin_compute_pass(&ComputePassDescriptor {
296+
label: None,
297+
timestamp_writes: None,
298+
});
299+
pass.set_pipeline(&compute_pipeline);
300+
pass.set_bind_group(0, Some(&bind_group), &[]);
301+
pass.dispatch_workgroups(1, 1, 1)
302+
}
303+
304+
fail(
305+
&ctx.device,
306+
|| {
307+
ctx.queue.submit(Some(encoder_compute.finish()));
308+
},
309+
None,
310+
);
237311
}
238312

239313
#[gpu_test]

wgpu-core/src/command/compute.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use wgt::{BufferAddress, DynamicOffset};
44
use alloc::{borrow::Cow, boxed::Box, sync::Arc, vec::Vec};
55
use core::{fmt, str};
66

7+
use crate::ray_tracing::AsAction;
78
use crate::{
89
binding_model::{
910
BindError, BindGroup, LateMinBufferBindingSizeMismatch, PushConstantUploadError,
@@ -24,7 +25,6 @@ use crate::{
2425
hal_label, id,
2526
init_tracker::{BufferInitTrackerAction, MemoryInitKind},
2627
pipeline::ComputePipeline,
27-
ray_tracing::TlasAction,
2828
resource::{
2929
self, Buffer, DestroyedResourceError, InvalidResourceError, Labeled,
3030
MissingBufferUsageError, ParentDevice,
@@ -208,7 +208,7 @@ struct State<'scope, 'snatch_guard, 'cmd_buf, 'raw_encoder> {
208208
tracker: &'cmd_buf mut Tracker,
209209
buffer_memory_init_actions: &'cmd_buf mut Vec<BufferInitTrackerAction>,
210210
texture_memory_actions: &'cmd_buf mut CommandBufferTextureMemoryActions,
211-
tlas_actions: &'cmd_buf mut Vec<TlasAction>,
211+
as_actions: &'cmd_buf mut Vec<AsAction>,
212212

213213
temp_offsets: Vec<u32>,
214214
dynamic_offset_count: usize,
@@ -433,7 +433,7 @@ impl Global {
433433
tracker: &mut cmd_buf_data.trackers,
434434
buffer_memory_init_actions: &mut cmd_buf_data.buffer_memory_init_actions,
435435
texture_memory_actions: &mut cmd_buf_data.texture_memory_actions,
436-
tlas_actions: &mut cmd_buf_data.tlas_actions,
436+
as_actions: &mut cmd_buf_data.as_actions,
437437

438438
temp_offsets: Vec::new(),
439439
dynamic_offset_count: 0,
@@ -680,12 +680,9 @@ fn set_bind_group(
680680
.used
681681
.acceleration_structures
682682
.into_iter()
683-
.map(|tlas| TlasAction {
684-
tlas: tlas.clone(),
685-
kind: crate::ray_tracing::TlasActionKind::Use,
686-
});
683+
.map(|tlas| AsAction::UseTlas(tlas.clone()));
687684

688-
state.tlas_actions.extend(used_resource);
685+
state.as_actions.extend(used_resource);
689686

690687
let pipeline_layout = state.binder.pipeline_layout.clone();
691688
let entries = state

wgpu-core/src/command/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use crate::lock::{rank, Mutex};
3636
use crate::snatch::SnatchGuard;
3737

3838
use crate::init_tracker::BufferInitTrackerAction;
39-
use crate::ray_tracing::{BlasAction, TlasAction};
39+
use crate::ray_tracing::AsAction;
4040
use crate::resource::{Fallible, InvalidResourceError, Labeled, ParentDevice as _, QuerySet};
4141
use crate::storage::Storage;
4242
use crate::track::{DeviceTracker, Tracker, UsageScope};
@@ -463,8 +463,7 @@ pub struct CommandBufferMutable {
463463

464464
pub(crate) pending_query_resets: QueryResetMap,
465465

466-
blas_actions: Vec<BlasAction>,
467-
tlas_actions: Vec<TlasAction>,
466+
as_actions: Vec<AsAction>,
468467
temp_resources: Vec<TempResource>,
469468

470469
indirect_draw_validation_resources: crate::indirect_validation::DrawResources,
@@ -553,8 +552,7 @@ impl CommandBuffer {
553552
buffer_memory_init_actions: Default::default(),
554553
texture_memory_actions: Default::default(),
555554
pending_query_resets: QueryResetMap::new(),
556-
blas_actions: Default::default(),
557-
tlas_actions: Default::default(),
555+
as_actions: Default::default(),
558556
temp_resources: Default::default(),
559557
indirect_draw_validation_resources:
560558
crate::indirect_validation::DrawResources::new(device.clone()),

0 commit comments

Comments
 (0)