Skip to content

Commit

Permalink
Don't use a callback to return backend instance handles.
Browse files Browse the repository at this point in the history
Change `Instance::as_hal<A>` to simply return an
`Option<&A::Instance>`, rather than passing it to a callback. We're
just borrowing a reference to some `wgpu_hal::Api::Instance` owned by
the `wgpu_core::instance::Instance`, so there's no special scoping or
locking magic required here.
  • Loading branch information
jimblandy committed Aug 27, 2022
1 parent 2cd08a1 commit ec44db1
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 21 deletions.
10 changes: 3 additions & 7 deletions wgpu-core/src/hub.rs
Original file line number Diff line number Diff line change
Expand Up @@ -947,13 +947,9 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {

/// # Safety
///
/// - The raw handle obtained from the hal Instance must not be manually destroyed
pub unsafe fn instance_as_hal<A: HalApi, F: FnOnce(Option<&A::Instance>) -> R, R>(
&self,
hal_instance_callback: F,
) -> R {
let hal_instance = A::instance_as_hal(&self.instance);
hal_instance_callback(hal_instance)
/// - The raw instance handle returned must not be manually destroyed.
pub unsafe fn instance_as_hal<A: HalApi>(&self) -> Option<&A::Instance> {
A::instance_as_hal(&self.instance)
}

/// # Safety
Expand Down
10 changes: 5 additions & 5 deletions wgpu/src/backend/direct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ impl Context {
))
}

pub unsafe fn instance_as_hal<A: wgc::hub::HalApi, F: FnOnce(Option<&A::Instance>) -> R, R>(
&self,
hal_instance_callback: F,
) -> R {
self.0.instance_as_hal::<A, F, R>(hal_instance_callback)
/// # Safety
///
/// - The raw instance handle returned must not be manually destroyed.
pub unsafe fn instance_as_hal<A: wgc::hub::HalApi>(&self) -> Option<&A::Instance> {
self.0.instance_as_hal::<A>()
}

pub unsafe fn from_core_instance(core_instance: wgc::instance::Instance) -> Self {
Expand Down
18 changes: 9 additions & 9 deletions wgpu/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1671,19 +1671,19 @@ impl Instance {
}
}

/// Returns the inner hal Instance using a callback. The hal instance will be `None` if the
/// backend type argument does not match with this wgpu Instance
/// Return a reference to a specific backend instance, if available.
///
/// If this `Instance` has a wgpu-hal [`Instance`] for backend
/// `A`, return a reference to it. Otherwise, return `None`.
///
/// # Safety
///
/// - The raw handle obtained from the hal Instance must not be manually destroyed
/// - The raw instance handle returned must not be manually destroyed.
///
/// [`Instance`]: hal::Api::Instance
#[cfg(any(not(target_arch = "wasm32"), feature = "webgl"))]
pub unsafe fn as_hal<A: wgc::hub::HalApi, F: FnOnce(Option<&A::Instance>) -> R, R>(
&self,
hal_instance_callback: F,
) -> R {
self.context
.instance_as_hal::<A, F, R>(hal_instance_callback)
pub unsafe fn as_hal<A: wgc::hub::HalApi>(&self) -> Option<&A::Instance> {
self.context.instance_as_hal::<A>()
}

/// Create an new instance of wgpu from a wgpu-core instance.
Expand Down

0 comments on commit ec44db1

Please sign in to comment.