use alloc::{borrow::ToOwned as _, boxed::Box, vec::Vec}; use crate::{ AccelerationStructureBuildSizes, AccelerationStructureDescriptor, Api, BindGroupDescriptor, BindGroupLayoutDescriptor, BufferDescriptor, BufferMapping, CommandEncoderDescriptor, ComputePipelineDescriptor, Device, DeviceError, FenceValue, GetAccelerationStructureBuildSizesDescriptor, Label, MemoryRange, PipelineCacheDescriptor, PipelineCacheError, PipelineError, PipelineLayoutDescriptor, RenderPipelineDescriptor, SamplerDescriptor, ShaderError, ShaderInput, ShaderModuleDescriptor, TextureDescriptor, TextureViewDescriptor, TlasInstance, }; use super::{ DynAccelerationStructure, DynBindGroup, DynBindGroupLayout, DynBuffer, DynCommandEncoder, DynComputePipeline, DynFence, DynPipelineCache, DynPipelineLayout, DynQuerySet, DynQueue, DynRenderPipeline, DynResource, DynResourceExt as _, DynSampler, DynShaderModule, DynTexture, DynTextureView, }; pub trait DynDevice: DynResource { unsafe fn create_buffer( &self, desc: &BufferDescriptor, ) -> Result, DeviceError>; unsafe fn destroy_buffer(&self, buffer: Box); unsafe fn add_raw_buffer(&self, buffer: &dyn DynBuffer); unsafe fn map_buffer( &self, buffer: &dyn DynBuffer, range: MemoryRange, ) -> Result; unsafe fn unmap_buffer(&self, buffer: &dyn DynBuffer); unsafe fn flush_mapped_ranges(&self, buffer: &dyn DynBuffer, ranges: &[MemoryRange]); unsafe fn invalidate_mapped_ranges(&self, buffer: &dyn DynBuffer, ranges: &[MemoryRange]); unsafe fn create_texture( &self, desc: &TextureDescriptor, ) -> Result, DeviceError>; unsafe fn destroy_texture(&self, texture: Box); unsafe fn add_raw_texture(&self, texture: &dyn DynTexture); unsafe fn create_texture_view( &self, texture: &dyn DynTexture, desc: &TextureViewDescriptor, ) -> Result, DeviceError>; unsafe fn destroy_texture_view(&self, view: Box); unsafe fn create_sampler( &self, desc: &SamplerDescriptor, ) -> Result, DeviceError>; unsafe fn destroy_sampler(&self, sampler: Box); unsafe fn create_command_encoder( &self, desc: &CommandEncoderDescriptor, ) -> Result, DeviceError>; unsafe fn create_bind_group_layout( &self, desc: &BindGroupLayoutDescriptor, ) -> Result, DeviceError>; unsafe fn destroy_bind_group_layout(&self, bg_layout: Box); unsafe fn create_pipeline_layout( &self, desc: &PipelineLayoutDescriptor, ) -> Result, DeviceError>; unsafe fn destroy_pipeline_layout(&self, pipeline_layout: Box); unsafe fn create_bind_group( &self, desc: &BindGroupDescriptor< dyn DynBindGroupLayout, dyn DynBuffer, dyn DynSampler, dyn DynTextureView, dyn DynAccelerationStructure, >, ) -> Result, DeviceError>; unsafe fn destroy_bind_group(&self, group: Box); unsafe fn create_shader_module( &self, desc: &ShaderModuleDescriptor, shader: ShaderInput, ) -> Result, ShaderError>; unsafe fn destroy_shader_module(&self, module: Box); unsafe fn create_render_pipeline( &self, desc: &RenderPipelineDescriptor< dyn DynPipelineLayout, dyn DynShaderModule, dyn DynPipelineCache, >, ) -> Result, PipelineError>; unsafe fn destroy_render_pipeline(&self, pipeline: Box); unsafe fn create_compute_pipeline( &self, desc: &ComputePipelineDescriptor< dyn DynPipelineLayout, dyn DynShaderModule, dyn DynPipelineCache, >, ) -> Result, PipelineError>; unsafe fn destroy_compute_pipeline(&self, pipeline: Box); unsafe fn create_pipeline_cache( &self, desc: &PipelineCacheDescriptor<'_>, ) -> Result, PipelineCacheError>; fn pipeline_cache_validation_key(&self) -> Option<[u8; 16]> { None } unsafe fn destroy_pipeline_cache(&self, cache: Box); unsafe fn create_query_set( &self, desc: &wgt::QuerySetDescriptor