pub struct Hal {
pub instance: Instance,
pub adapter: Adapter,
pub device: Device,
pub queue: Queue,
}Expand description
Estado wgpu compartido. Una instancia por proceso. Device y Queue
son Arc internamente, así que clonar es barato.
Fields§
§instance: Instance§adapter: Adapter§device: Device§queue: QueueImplementations§
Source§impl Hal
impl Hal
Sourcepub async fn new(
compatible_surface: Option<&Surface<'static>>,
) -> Result<Self, HalError>
pub async fn new( compatible_surface: Option<&Surface<'static>>, ) -> Result<Self, HalError>
Construye Hal pidiendo un adapter compatible con una surface dada
(recomendado: pasar Some(&surface) para garantizar que el adapter
elegido sabe presentar a esa surface).
Examples found in repository?
38 fn resumed(&mut self, event_loop: &ActiveEventLoop) {
39 if self.state.is_some() {
40 return;
41 }
42 let window = event_loop
43 .create_window(
44 WindowAttributes::default()
45 .with_title("llimphi · clear_screen")
46 .with_inner_size(LogicalSize::new(960u32, 540u32)),
47 )
48 .expect("create window");
49 let window = Arc::new(window);
50 let hal = pollster::block_on(Hal::new(None)).expect("hal");
51 let surface = WinitSurface::new(&hal, window.clone()).expect("surface");
52 window.request_redraw();
53 self.state = Some(State {
54 window,
55 hal,
56 surface,
57 });
58 }Sourcepub async unsafe fn new_for_raw_surface(
make_target: impl Fn() -> SurfaceTargetUnsafe,
width: u32,
height: u32,
) -> Result<(Self, RawSurface), HalError>
pub async unsafe fn new_for_raw_surface( make_target: impl Fn() -> SurfaceTargetUnsafe, width: u32, height: u32, ) -> Result<(Self, RawSurface), HalError>
Construye el Hal y una RawSurface a la vez, eligiendo el adaptador
compatible con esa surface — el dispositivo que el compositor sabe
presentar. Es el camino correcto para el backend layer-shell de pata.
El problema que resuelve: en sistemas multi-GPU (Optimus), pedir el
adaptador sin pista de surface (new(None) con HighPerformance) puede
elegir la dGPU mientras el compositor compone en la iGPU → los dmabuf
cruzan dispositivos y get_capabilities devuelve 0 formatos (la surface
“no expone formatos”). Pasar compatible_surface ata el adaptador al
dispositivo del compositor. Como la surface hace falta ANTES de pedir el
adaptador, y new crea la instancia internamente, este constructor une los
dos pasos.
make_target reconstruye el SurfaceTargetUnsafe cada vez que se llama
(los RawHandle son Copy): create_surface_unsafe consume el target y
puede que probemos dos instancias (PRIMARY y, si no hay adaptador, todos
los backends — el GL de Mesa/Wayland revienta en teardown, por eso PRIMARY
primero, igual que Hal::new).
§Safety
Los handles que produce make_target deben apuntar a objetos Wayland/…
vivos durante toda la vida de la RawSurface devuelta.
Auto Trait Implementations§
impl !RefUnwindSafe for Hal
impl !UnwindSafe for Hal
impl Freeze for Hal
impl Send for Hal
impl Sync for Hal
impl Unpin for Hal
impl UnsafeUnpin for Hal
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.