use std::{marker::PhantomData, sync::Arc, thread};
use crate::context::DynContext;
use crate::*;
#[derive(Debug)]
pub struct ComputePass<'encoder> {
pub(crate) inner: ComputePassInner,
pub(crate) encoder_guard: PhantomData<&'encoder ()>,
}
impl<'encoder> ComputePass<'encoder> {
pub fn forget_lifetime(self) -> ComputePass<'static> {
ComputePass {
inner: self.inner,
encoder_guard: PhantomData,
}
}
pub fn set_bind_group<'a>(
&mut self,
index: u32,
bind_group: impl Into<Option<&'a BindGroup>>,
offsets: &[DynamicOffset],
) {
let bg = bind_group.into().map(|x| x.data.as_ref());
DynContext::compute_pass_set_bind_group(
&*self.inner.context,
self.inner.data.as_mut(),
index,
bg,
offsets,
);
}
pub fn set_pipeline(&mut self, pipeline: &ComputePipeline) {
DynContext::compute_pass_set_pipeline(
&*self.inner.context,
self.inner.data.as_mut(),
pipeline.data.as_ref(),
);
}
pub fn insert_debug_marker(&mut self, label: &str) {
DynContext::compute_pass_insert_debug_marker(
&*self.inner.context,
self.inner.data.as_mut(),
label,
);
}
pub fn push_debug_group(&mut self, label: &str) {
DynContext::compute_pass_push_debug_group(
&*self.inner.context,
self.inner.data.as_mut(),
label,
);
}
pub fn pop_debug_group(&mut self) {
DynContext::compute_pass_pop_debug_group(&*self.inner.context, self.inner.data.as_mut());
}
pub fn dispatch_workgroups(&mut self, x: u32, y: u32, z: u32) {
DynContext::compute_pass_dispatch_workgroups(
&*self.inner.context,
self.inner.data.as_mut(),
x,
y,
z,
);
}
pub fn dispatch_workgroups_indirect(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
) {
DynContext::compute_pass_dispatch_workgroups_indirect(
&*self.inner.context,
self.inner.data.as_mut(),
indirect_buffer.data.as_ref(),
indirect_offset,
);
}
}
impl<'encoder> ComputePass<'encoder> {
pub fn set_push_constants(&mut self, offset: u32, data: &[u8]) {
DynContext::compute_pass_set_push_constants(
&*self.inner.context,
self.inner.data.as_mut(),
offset,
data,
);
}
}
impl<'encoder> ComputePass<'encoder> {
pub fn write_timestamp(&mut self, query_set: &QuerySet, query_index: u32) {
DynContext::compute_pass_write_timestamp(
&*self.inner.context,
self.inner.data.as_mut(),
query_set.data.as_ref(),
query_index,
)
}
}
impl<'encoder> ComputePass<'encoder> {
pub fn begin_pipeline_statistics_query(&mut self, query_set: &QuerySet, query_index: u32) {
DynContext::compute_pass_begin_pipeline_statistics_query(
&*self.inner.context,
self.inner.data.as_mut(),
query_set.data.as_ref(),
query_index,
);
}
pub fn end_pipeline_statistics_query(&mut self) {
DynContext::compute_pass_end_pipeline_statistics_query(
&*self.inner.context,
self.inner.data.as_mut(),
);
}
}
#[derive(Debug)]
pub(crate) struct ComputePassInner {
pub(crate) data: Box<Data>,
pub(crate) context: Arc<C>,
}
impl Drop for ComputePassInner {
fn drop(&mut self) {
if !thread::panicking() {
self.context.compute_pass_end(self.data.as_mut());
}
}
}
#[derive(Clone, Debug)]
pub struct ComputePassTimestampWrites<'a> {
pub query_set: &'a QuerySet,
pub beginning_of_pass_write_index: Option<u32>,
pub end_of_pass_write_index: Option<u32>,
}
#[cfg(send_sync)]
static_assertions::assert_impl_all!(ComputePassTimestampWrites<'_>: Send, Sync);
#[derive(Clone, Default, Debug)]
pub struct ComputePassDescriptor<'a> {
pub label: Label<'a>,
pub timestamp_writes: Option<ComputePassTimestampWrites<'a>>,
}
#[cfg(send_sync)]
static_assertions::assert_impl_all!(ComputePassDescriptor<'_>: Send, Sync);