wgpu_core

Macro gfx_select

Source
macro_rules! gfx_select {
    ($id:expr => $c0:ident.$c1:tt.$method:ident $params:tt) => { ... };
    ($id:expr => $c0:ident.$method:ident $params:tt) => { ... };
    ($id:expr => {$($c:tt)*}, $method:ident $params:tt) => { ... };
}
Expand description

Dispatch on an Id’s backend to a backend-generic method.

Uses of this macro have the form:


    gfx_select!(id => value.method(args...))

This expands to an expression that calls value.method::<A>(args...) for the backend A selected by id. The expansion matches on id.backend(), with an arm for each backend type in wgpu_types::Backend which calls the specialization of method for the given backend. This allows resource identifiers to select backends dynamically, even though many wgpu_core methods are compiled and optimized for a specific back end.

This macro is typically used to call methods on wgpu_core::global::Global, many of which take a single hal::Api type parameter. For example, to create a new buffer on the device indicated by device_id, one would say:

gfx_select!(device_id => global.device_create_buffer(device_id, ...))

where the device_create_buffer method is defined like this:

impl Global {
   pub fn device_create_buffer<A: HalApi>(&self, ...) -> ...
   { ... }
}

That gfx_select! call uses device_id’s backend to select the right backend type A for a call to Global::device_create_buffer<A>.

However, there’s nothing about this macro that is specific to hub::Global. For example, Firefox’s embedding of wgpu_core defines its own types with methods that take hal::Api type parameters. Firefox uses gfx_select! to dynamically dispatch to the right specialization based on the resource’s id.