struct State<'scope, 'snatch_guard, 'cmd_enc> {
pipeline: Option<Arc<ComputePipeline>>,
pass: PassState<'scope, 'snatch_guard, 'cmd_enc>,
active_query: Option<(Arc<QuerySet>, u32)>,
push_constants: Vec<u32>,
intermediate_trackers: Tracker,
}Fields§
§pipeline: Option<Arc<ComputePipeline>>§pass: PassState<'scope, 'snatch_guard, 'cmd_enc>§active_query: Option<(Arc<QuerySet>, u32)>§push_constants: Vec<u32>§intermediate_trackers: TrackerImplementations§
Source§impl<'scope, 'snatch_guard, 'cmd_enc> State<'scope, 'snatch_guard, 'cmd_enc>
impl<'scope, 'snatch_guard, 'cmd_enc> State<'scope, 'snatch_guard, 'cmd_enc>
fn is_ready(&self) -> Result<(), DispatchError>
Sourcefn flush_bindings(
&mut self,
indirect_buffer: Option<&Arc<Buffer>>,
track_indirect_buffer: bool,
) -> Result<(), ComputePassErrorInner>
fn flush_bindings( &mut self, indirect_buffer: Option<&Arc<Buffer>>, track_indirect_buffer: bool, ) -> Result<(), ComputePassErrorInner>
Flush binding state in preparation for a dispatch.
§Differences between render and compute passes
There are differences between the flush_bindings implementations for
render and compute passes, because render passes have a single usage
scope for the entire pass, and compute passes have a separate usage
scope for each dispatch.
For compute passes, bind groups are merged into a fresh usage scope
here, not into the pass usage scope within calls to set_bind_group. As
specified by WebGPU, for compute passes, we merge only the bind groups
that are actually used by the pipeline, unlike render passes, which
merge every bind group that is ever set, even if it is not ultimately
used by the pipeline.
For compute passes, we call drain_barriers here, because barriers may
be needed before each dispatch if a previous dispatch had a conflicting
usage. For render passes, barriers are emitted once at the start of the
render pass.
§Indirect buffer handling
The indirect_buffer argument should be passed for any indirect
dispatch (with or without validation). It will be checked for
conflicting usages according to WebGPU rules. For the purpose of
these rules, the fact that we have actually processed the buffer in
the validation pass is an implementation detail.
The track_indirect_buffer argument should be set when doing indirect
dispatch without validation. In this case, the indirect buffer will
be added to the tracker in order to generate any necessary transitions
for that usage.
When doing indirect dispatch with validation, the indirect buffer is processed by the validation pass and is not used by the actual dispatch. The indirect validation code handles transitions for the validation pass.