Skip to content

Commit 7d15c51

Browse files
committed
move indirect validation code to its own folder
rename items appropriately internalize indirect buffer bind groups
1 parent ef622c1 commit 7d15c51

12 files changed

Lines changed: 198 additions & 202 deletions

File tree

wgpu-core/src/command/bundle.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ fn multi_draw_indirect(
810810
};
811811
let instance_limit = vertex_limits.instance_limit;
812812

813-
let buffer_uses = if state.device.indirect_draw_validation.is_some() {
813+
let buffer_uses = if state.device.indirect_validation.is_some() {
814814
wgt::BufferUses::STORAGE_READ_ONLY
815815
} else {
816816
wgt::BufferUses::INDIRECT
@@ -901,8 +901,8 @@ impl RenderBundle {
901901
pub(super) unsafe fn execute(
902902
&self,
903903
raw: &mut dyn hal::DynCommandEncoder,
904-
indirect_draw_validation_resources: &mut crate::indirect_draw_validation::IndirectDrawValidationResources,
905-
indirect_draw_validation_batcher: &mut crate::indirect_draw_validation::IndirectDrawValidationBatcher,
904+
indirect_draw_validation_resources: &mut crate::indirect_validation::DrawResources,
905+
indirect_draw_validation_batcher: &mut crate::indirect_validation::DrawBatcher,
906906
snatch_guard: &SnatchGuard,
907907
) -> Result<(), ExecutionError> {
908908
let mut offsets = self.base.dynamic_offsets.as_slice();
@@ -1050,7 +1050,7 @@ impl RenderBundle {
10501050
vertex_or_index_limit,
10511051
instance_limit,
10521052
} => {
1053-
let (buffer, offset) = if self.device.indirect_draw_validation.is_some() {
1053+
let (buffer, offset) = if self.device.indirect_validation.is_some() {
10541054
let (dst_resource_index, offset) = indirect_draw_validation_batcher.add(
10551055
indirect_draw_validation_resources,
10561056
&self.device,

wgpu-core/src/command/compute.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,9 @@ fn dispatch_indirect(
892892
));
893893

894894
if let Some(ref indirect_validation) = state.device.indirect_validation {
895-
let params = indirect_validation.params(&state.device.limits, offset, buffer.size);
895+
let params = indirect_validation
896+
.dispatch
897+
.params(&state.device.limits, offset, buffer.size);
896898

897899
unsafe {
898900
state.raw_encoder.set_compute_pipeline(params.pipeline);
@@ -921,9 +923,10 @@ fn dispatch_indirect(
921923
1,
922924
Some(
923925
buffer
924-
.raw_indirect_validation_bind_group
926+
.indirect_validation_bind_groups
925927
.get(&state.snatch_guard)
926928
.unwrap()
929+
.dispatch
927930
.as_ref(),
928931
),
929932
&[params.aligned_offset as u32],

wgpu-core/src/command/mod.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -436,8 +436,7 @@ pub(crate) struct BakedCommands {
436436
pub(crate) encoder: CommandEncoder,
437437
pub(crate) trackers: Tracker,
438438
pub(crate) temp_resources: Vec<TempResource>,
439-
pub(crate) indirect_draw_validation_resources:
440-
crate::indirect_draw_validation::IndirectDrawValidationResources,
439+
pub(crate) indirect_draw_validation_resources: crate::indirect_validation::DrawResources,
441440
buffer_memory_init_actions: Vec<BufferInitTrackerAction>,
442441
texture_memory_actions: CommandBufferTextureMemoryActions,
443442
}
@@ -468,8 +467,7 @@ pub struct CommandBufferMutable {
468467
tlas_actions: Vec<TlasAction>,
469468
temp_resources: Vec<TempResource>,
470469

471-
indirect_draw_validation_resources:
472-
crate::indirect_draw_validation::IndirectDrawValidationResources,
470+
indirect_draw_validation_resources: crate::indirect_validation::DrawResources,
473471

474472
#[cfg(feature = "trace")]
475473
pub(crate) commands: Option<Vec<TraceCommand>>,
@@ -559,9 +557,7 @@ impl CommandBuffer {
559557
tlas_actions: Default::default(),
560558
temp_resources: Default::default(),
561559
indirect_draw_validation_resources:
562-
crate::indirect_draw_validation::IndirectDrawValidationResources::new(
563-
device.clone(),
564-
),
560+
crate::indirect_validation::DrawResources::new(device.clone()),
565561
#[cfg(feature = "trace")]
566562
commands: if device.trace.lock().is_some() {
567563
Some(Vec::new())

wgpu-core/src/command/render.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,8 +1631,7 @@ impl Global {
16311631
let device = &cmd_buf.device;
16321632
let snatch_guard = &device.snatchable_lock.read();
16331633

1634-
let mut indirect_draw_validation_batcher =
1635-
crate::indirect_draw_validation::IndirectDrawValidationBatcher::new();
1634+
let mut indirect_draw_validation_batcher = crate::indirect_validation::DrawBatcher::new();
16361635

16371636
let (scope, pending_discard_init_fixups) = {
16381637
device.check_is_valid().map_pass_err(pass_scope)?;
@@ -1997,8 +1996,9 @@ impl Global {
19971996

19981997
CommandBuffer::insert_barriers_from_scope(transit, tracker, &scope, snatch_guard);
19991998

2000-
if let Some(ref indirect_draw_validation) = device.indirect_draw_validation {
2001-
indirect_draw_validation
1999+
if let Some(ref indirect_validation) = device.indirect_validation {
2000+
indirect_validation
2001+
.draw
20022002
.inject_validation_pass(
20032003
device,
20042004
snatch_guard,
@@ -2494,8 +2494,8 @@ fn draw_indexed(
24942494

24952495
fn multi_draw_indirect(
24962496
state: &mut State,
2497-
indirect_draw_validation_resources: &mut crate::indirect_draw_validation::IndirectDrawValidationResources,
2498-
indirect_draw_validation_batcher: &mut crate::indirect_draw_validation::IndirectDrawValidationBatcher,
2497+
indirect_draw_validation_resources: &mut crate::indirect_validation::DrawResources,
2498+
indirect_draw_validation_batcher: &mut crate::indirect_validation::DrawBatcher,
24992499
cmd_buf: &Arc<CommandBuffer>,
25002500
indirect_buffer: Arc<crate::resource::Buffer>,
25012501
offset: u64,
@@ -2563,7 +2563,7 @@ fn multi_draw_indirect(
25632563
}
25642564
}
25652565

2566-
if state.device.indirect_draw_validation.is_some() {
2566+
if state.device.indirect_validation.is_some() {
25672567
state
25682568
.info
25692569
.usage_scope
@@ -2580,10 +2580,8 @@ fn multi_draw_indirect(
25802580
raw_encoder: &'a mut dyn hal::DynCommandEncoder,
25812581
device: &'a Device,
25822582

2583-
indirect_draw_validation_resources:
2584-
&'a mut crate::indirect_draw_validation::IndirectDrawValidationResources,
2585-
indirect_draw_validation_batcher:
2586-
&'a mut crate::indirect_draw_validation::IndirectDrawValidationBatcher,
2583+
indirect_draw_validation_resources: &'a mut crate::indirect_validation::DrawResources,
2584+
indirect_draw_validation_batcher: &'a mut crate::indirect_validation::DrawBatcher,
25872585

25882586
indirect_buffer: Arc<crate::resource::Buffer>,
25892587
indexed: bool,
@@ -2866,8 +2864,8 @@ fn write_timestamp(
28662864

28672865
fn execute_bundle(
28682866
state: &mut State,
2869-
indirect_draw_validation_resources: &mut crate::indirect_draw_validation::IndirectDrawValidationResources,
2870-
indirect_draw_validation_batcher: &mut crate::indirect_draw_validation::IndirectDrawValidationBatcher,
2867+
indirect_draw_validation_resources: &mut crate::indirect_validation::DrawResources,
2868+
indirect_draw_validation_batcher: &mut crate::indirect_validation::DrawBatcher,
28712869
cmd_buf: &Arc<CommandBuffer>,
28722870
bundle: Arc<super::RenderBundle>,
28732871
) -> Result<(), RenderPassErrorInner> {

wgpu-core/src/device/queue.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,7 @@ pub(crate) struct EncoderInFlight {
268268
pub(crate) trackers: Tracker,
269269
pub(crate) temp_resources: Vec<TempResource>,
270270
/// We only need to keep these resources alive.
271-
_indirect_draw_validation_resources:
272-
crate::indirect_draw_validation::IndirectDrawValidationResources,
271+
_indirect_draw_validation_resources: crate::indirect_validation::DrawResources,
273272

274273
/// These are the buffers that have been tracked by `PendingWrites`.
275274
pub(crate) pending_buffers: FastHashMap<TrackerIndex, Arc<Buffer>>,
@@ -380,10 +379,9 @@ impl PendingWrites {
380379
},
381380
trackers: Tracker::new(),
382381
temp_resources: mem::take(&mut self.temp_resources),
383-
_indirect_draw_validation_resources:
384-
crate::indirect_draw_validation::IndirectDrawValidationResources::new(
385-
device.clone(),
386-
),
382+
_indirect_draw_validation_resources: crate::indirect_validation::DrawResources::new(
383+
device.clone(),
384+
),
387385
pending_buffers,
388386
pending_textures,
389387
};

wgpu-core/src/device/resource.rs

Lines changed: 21 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,6 @@ pub struct Device {
130130
pub(crate) usage_scopes: UsageScopePool,
131131
pub(crate) last_acceleration_structure_build_command_index: AtomicU64,
132132
pub(crate) indirect_validation: Option<crate::indirect_validation::IndirectValidation>,
133-
pub(crate) indirect_draw_validation:
134-
Option<crate::indirect_draw_validation::IndirectDrawValidation>,
135133
// needs to be dropped last
136134
#[cfg(feature = "trace")]
137135
pub(crate) trace: Mutex<Option<trace::Trace>>,
@@ -164,9 +162,6 @@ impl Drop for Device {
164162
if let Some(indirect_validation) = self.indirect_validation.take() {
165163
indirect_validation.dispose(self.raw.as_ref());
166164
}
167-
if let Some(indirect_draw_validation) = self.indirect_draw_validation.take() {
168-
indirect_draw_validation.dispose(self.raw.as_ref());
169-
}
170165
unsafe {
171166
self.raw.destroy_buffer(zero_buffer);
172167
self.raw.destroy_fence(fence);
@@ -258,31 +253,11 @@ impl Device {
258253
.contains(wgt::DownlevelFlags::INDIRECT_EXECUTION);
259254

260255
let indirect_validation = if enable_indirect_validation {
261-
match crate::indirect_validation::IndirectValidation::new(
256+
Some(crate::indirect_validation::IndirectValidation::new(
262257
raw_device.as_ref(),
263258
&desc.required_limits,
264-
) {
265-
Ok(indirect_validation) => Some(indirect_validation),
266-
Err(e) => {
267-
log::error!("indirect-validation error: {e:?}");
268-
return Err(DeviceError::Lost);
269-
}
270-
}
271-
} else {
272-
None
273-
};
274-
275-
let indirect_draw_validation = if enable_indirect_validation {
276-
match crate::indirect_draw_validation::IndirectDrawValidation::new(
277-
raw_device.as_ref(),
278259
&desc.required_features,
279-
) {
280-
Ok(indirect_draw_validation) => Some(indirect_draw_validation),
281-
Err(e) => {
282-
log::error!("indirect-draw-validation error: {e:?}");
283-
return Err(DeviceError::Lost);
284-
}
285-
}
260+
)?)
286261
} else {
287262
None
288263
};
@@ -333,7 +308,6 @@ impl Device {
333308
// By starting at one, we can put the result in a NonZeroU64.
334309
last_acceleration_structure_build_command_index: AtomicU64::new(1),
335310
indirect_validation,
336-
indirect_draw_validation,
337311
})
338312
}
339313

@@ -671,11 +645,8 @@ impl Device {
671645
let buffer =
672646
unsafe { self.raw().create_buffer(&hal_desc) }.map_err(|e| self.handle_hal_error(e))?;
673647

674-
let raw_indirect_validation_bind_group =
675-
self.create_indirect_validation_bind_group(buffer.as_ref(), desc.size, desc.usage)?;
676-
677-
let raw_indirect_draw_validation_bind_group = self
678-
.create_indirect_draw_validation_bind_group(buffer.as_ref(), desc.size, desc.usage)?;
648+
let indirect_validation_bind_groups =
649+
self.create_indirect_validation_bind_groups(buffer.as_ref(), desc.size, desc.usage)?;
679650

680651
let buffer = Buffer {
681652
raw: Snatchable::new(buffer),
@@ -690,8 +661,7 @@ impl Device {
690661
label: desc.label.to_string(),
691662
tracking_data: TrackingData::new(self.tracker_indices.buffers.clone()),
692663
bind_groups: Mutex::new(rank::BUFFER_BIND_GROUPS, WeakVec::new()),
693-
raw_indirect_validation_bind_group,
694-
raw_indirect_draw_validation_bind_group,
664+
indirect_validation_bind_groups,
695665
};
696666

697667
let buffer = Arc::new(buffer);
@@ -773,7 +743,7 @@ impl Device {
773743
hal_buffer: Box<dyn hal::DynBuffer>,
774744
desc: &resource::BufferDescriptor,
775745
) -> (Fallible<Buffer>, Option<resource::CreateBufferError>) {
776-
let raw_indirect_validation_bind_group = match self.create_indirect_validation_bind_group(
746+
let indirect_validation_bind_groups = match self.create_indirect_validation_bind_groups(
777747
hal_buffer.as_ref(),
778748
desc.size,
779749
desc.usage,
@@ -782,13 +752,6 @@ impl Device {
782752
Err(e) => return (Fallible::Invalid(Arc::new(desc.label.to_string())), Some(e)),
783753
};
784754

785-
let raw_indirect_draw_validation_bind_group = match self
786-
.create_indirect_draw_validation_bind_group(hal_buffer.as_ref(), desc.size, desc.usage)
787-
{
788-
Ok(ok) => ok,
789-
Err(e) => return (Fallible::Invalid(Arc::new(desc.label.to_string())), Some(e)),
790-
};
791-
792755
unsafe { self.raw().add_raw_buffer(&*hal_buffer) };
793756

794757
let buffer = Buffer {
@@ -804,8 +767,7 @@ impl Device {
804767
label: desc.label.to_string(),
805768
tracking_data: TrackingData::new(self.tracker_indices.buffers.clone()),
806769
bind_groups: Mutex::new(rank::BUFFER_BIND_GROUPS, WeakVec::new()),
807-
raw_indirect_validation_bind_group,
808-
raw_indirect_draw_validation_bind_group,
770+
indirect_validation_bind_groups,
809771
};
810772

811773
let buffer = Arc::new(buffer);
@@ -818,12 +780,13 @@ impl Device {
818780
(Fallible::Valid(buffer), None)
819781
}
820782

821-
fn create_indirect_validation_bind_group(
783+
fn create_indirect_validation_bind_groups(
822784
&self,
823785
raw_buffer: &dyn hal::DynBuffer,
824786
buffer_size: u64,
825787
usage: wgt::BufferUsages,
826-
) -> Result<Snatchable<Box<dyn hal::DynBindGroup>>, resource::CreateBufferError> {
788+
) -> Result<Snatchable<crate::indirect_validation::BindGroups>, resource::CreateBufferError>
789+
{
827790
if !usage.contains(wgt::BufferUsages::INDIRECT) {
828791
return Ok(Snatchable::empty());
829792
}
@@ -832,40 +795,19 @@ impl Device {
832795
return Ok(Snatchable::empty());
833796
};
834797

835-
let bind_group = indirect_validation
836-
.create_src_bind_group(self.raw(), &self.limits, buffer_size, raw_buffer)
837-
.map_err(resource::CreateBufferError::IndirectValidationBindGroup)?;
838-
839-
let Some(bind_group) = bind_group else {
840-
return Ok(Snatchable::empty());
841-
};
842-
843-
Ok(Snatchable::new(bind_group))
844-
}
798+
let bind_groups = crate::indirect_validation::BindGroups::new(
799+
indirect_validation,
800+
self,
801+
buffer_size,
802+
raw_buffer,
803+
)
804+
.map_err(resource::CreateBufferError::IndirectValidationBindGroup)?;
845805

846-
fn create_indirect_draw_validation_bind_group(
847-
&self,
848-
raw_buffer: &dyn hal::DynBuffer,
849-
buffer_size: u64,
850-
usage: wgt::BufferUsages,
851-
) -> Result<Snatchable<Box<dyn hal::DynBindGroup>>, resource::CreateBufferError> {
852-
if !usage.contains(wgt::BufferUsages::INDIRECT) {
853-
return Ok(Snatchable::empty());
806+
if let Some(bind_groups) = bind_groups {
807+
Ok(Snatchable::new(bind_groups))
808+
} else {
809+
Ok(Snatchable::empty())
854810
}
855-
856-
let Some(ref indirect_draw_validation) = self.indirect_draw_validation else {
857-
return Ok(Snatchable::empty());
858-
};
859-
860-
let bind_group = indirect_draw_validation
861-
.create_src_bind_group(self.raw(), &self.adapter.limits(), buffer_size, raw_buffer)
862-
.map_err(resource::CreateBufferError::IndirectValidationBindGroup)?;
863-
864-
let Some(bind_group) = bind_group else {
865-
return Ok(Snatchable::empty());
866-
};
867-
868-
Ok(Snatchable::new(bind_group))
869811
}
870812

871813
pub(crate) fn create_texture(

0 commit comments

Comments
 (0)