use std::{ops::Range, sync::Arc};
use crate::{
api::{
blas::BlasBuildEntry,
tlas::{TlasBuildEntry, TlasPackage},
},
*,
};
#[derive(Debug)]
pub struct CommandEncoder {
pub(crate) inner: dispatch::DispatchCommandEncoder,
}
#[cfg(send_sync)]
static_assertions::assert_impl_all!(CommandEncoder: Send, Sync);
crate::cmp::impl_eq_ord_hash_proxy!(CommandEncoder => .inner);
pub type CommandEncoderDescriptor<'a> = wgt::CommandEncoderDescriptor<Label<'a>>;
static_assertions::assert_impl_all!(CommandEncoderDescriptor<'_>: Send, Sync);
use parking_lot::Mutex;
pub use wgt::TexelCopyBufferInfo as TexelCopyBufferInfoBase;
pub type TexelCopyBufferInfo<'a> = TexelCopyBufferInfoBase<&'a Buffer>;
#[cfg(send_sync)]
static_assertions::assert_impl_all!(TexelCopyBufferInfo<'_>: Send, Sync);
pub use wgt::TexelCopyTextureInfo as TexelCopyTextureInfoBase;
pub type TexelCopyTextureInfo<'a> = TexelCopyTextureInfoBase<&'a Texture>;
#[cfg(send_sync)]
static_assertions::assert_impl_all!(TexelCopyTextureInfo<'_>: Send, Sync);
impl CommandEncoder {
pub fn finish(mut self) -> CommandBuffer {
let buffer = self.inner.finish();
CommandBuffer {
inner: Arc::new(Mutex::new(Some(buffer))),
}
}
pub fn begin_render_pass<'encoder>(
&'encoder mut self,
desc: &RenderPassDescriptor<'_>,
) -> RenderPass<'encoder> {
let rpass = self.inner.begin_render_pass(desc);
RenderPass {
inner: rpass,
_encoder_guard: api::PhantomDrop::default(),
}
}
pub fn begin_compute_pass<'encoder>(
&'encoder mut self,
desc: &ComputePassDescriptor<'_>,
) -> ComputePass<'encoder> {
let cpass = self.inner.begin_compute_pass(desc);
ComputePass {
inner: cpass,
_encoder_guard: api::PhantomDrop::default(),
}
}
pub fn copy_buffer_to_buffer(
&mut self,
source: &Buffer,
source_offset: BufferAddress,
destination: &Buffer,
destination_offset: BufferAddress,
copy_size: BufferAddress,
) {
self.inner.copy_buffer_to_buffer(
&source.inner,
source_offset,
&destination.inner,
destination_offset,
copy_size,
);
}
pub fn copy_buffer_to_texture(
&mut self,
source: TexelCopyBufferInfo<'_>,
destination: TexelCopyTextureInfo<'_>,
copy_size: Extent3d,
) {
self.inner
.copy_buffer_to_texture(source, destination, copy_size);
}
pub fn copy_texture_to_buffer(
&mut self,
source: TexelCopyTextureInfo<'_>,
destination: TexelCopyBufferInfo<'_>,
copy_size: Extent3d,
) {
self.inner
.copy_texture_to_buffer(source, destination, copy_size);
}
pub fn copy_texture_to_texture(
&mut self,
source: TexelCopyTextureInfo<'_>,
destination: TexelCopyTextureInfo<'_>,
copy_size: Extent3d,
) {
self.inner
.copy_texture_to_texture(source, destination, copy_size);
}
pub fn clear_texture(&mut self, texture: &Texture, subresource_range: &ImageSubresourceRange) {
self.inner.clear_texture(&texture.inner, subresource_range);
}
pub fn clear_buffer(
&mut self,
buffer: &Buffer,
offset: BufferAddress,
size: Option<BufferAddress>,
) {
self.inner.clear_buffer(&buffer.inner, offset, size);
}
pub fn insert_debug_marker(&mut self, label: &str) {
self.inner.insert_debug_marker(label);
}
pub fn push_debug_group(&mut self, label: &str) {
self.inner.push_debug_group(label);
}
pub fn pop_debug_group(&mut self) {
self.inner.pop_debug_group();
}
pub fn resolve_query_set(
&mut self,
query_set: &QuerySet,
query_range: Range<u32>,
destination: &Buffer,
destination_offset: BufferAddress,
) {
self.inner.resolve_query_set(
&query_set.inner,
query_range.start,
query_range.end - query_range.start,
&destination.inner,
destination_offset,
);
}
#[cfg(wgpu_core)]
pub unsafe fn as_hal_mut<
A: wgc::hal_api::HalApi,
F: FnOnce(Option<&mut A::CommandEncoder>) -> R,
R,
>(
&mut self,
hal_command_encoder_callback: F,
) -> R {
if let Some(encoder) = self.inner.as_core_mut_opt() {
unsafe {
encoder
.context
.command_encoder_as_hal_mut::<A, F, R>(encoder, hal_command_encoder_callback)
}
} else {
hal_command_encoder_callback(None)
}
}
}
impl CommandEncoder {
pub fn write_timestamp(&mut self, query_set: &QuerySet, query_index: u32) {
self.inner.write_timestamp(&query_set.inner, query_index);
}
}
impl CommandEncoder {
pub fn build_acceleration_structures<'a>(
&mut self,
blas: impl IntoIterator<Item = &'a BlasBuildEntry<'a>>,
tlas: impl IntoIterator<Item = &'a TlasPackage>,
) {
self.inner
.build_acceleration_structures(&mut blas.into_iter(), &mut tlas.into_iter());
}
pub unsafe fn build_acceleration_structures_unsafe_tlas<'a>(
&mut self,
blas: impl IntoIterator<Item = &'a BlasBuildEntry<'a>>,
tlas: impl IntoIterator<Item = &'a TlasBuildEntry<'a>>,
) {
self.inner.build_acceleration_structures_unsafe_tlas(
&mut blas.into_iter(),
&mut tlas.into_iter(),
);
}
}