summaryrefslogtreecommitdiffstats
path: root/third_party/rust/wgpu-core/src/hal_api.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/wgpu-core/src/hal_api.rs')
-rw-r--r--third_party/rust/wgpu-core/src/hal_api.rs116
1 files changed, 116 insertions, 0 deletions
diff --git a/third_party/rust/wgpu-core/src/hal_api.rs b/third_party/rust/wgpu-core/src/hal_api.rs
new file mode 100644
index 0000000000..179024baed
--- /dev/null
+++ b/third_party/rust/wgpu-core/src/hal_api.rs
@@ -0,0 +1,116 @@
+use wgt::{Backend, WasmNotSendSync};
+
+use crate::{
+ global::Global,
+ hub::Hub,
+ instance::{Instance, Surface},
+};
+
+pub trait HalApi: hal::Api + 'static + WasmNotSendSync {
+ const VARIANT: Backend;
+ fn create_instance_from_hal(name: &str, hal_instance: Self::Instance) -> Instance;
+ fn instance_as_hal(instance: &Instance) -> Option<&Self::Instance>;
+ fn hub(global: &Global) -> &Hub<Self>;
+ fn get_surface(surface: &Surface) -> Option<&Self::Surface>;
+}
+
+impl HalApi for hal::api::Empty {
+ const VARIANT: Backend = Backend::Empty;
+ fn create_instance_from_hal(_: &str, _: Self::Instance) -> Instance {
+ unimplemented!("called empty api")
+ }
+ fn instance_as_hal(_: &Instance) -> Option<&Self::Instance> {
+ unimplemented!("called empty api")
+ }
+ fn hub(_: &Global) -> &Hub<Self> {
+ unimplemented!("called empty api")
+ }
+ fn get_surface(_: &Surface) -> Option<&Self::Surface> {
+ unimplemented!("called empty api")
+ }
+}
+
+#[cfg(vulkan)]
+impl HalApi for hal::api::Vulkan {
+ const VARIANT: Backend = Backend::Vulkan;
+ fn create_instance_from_hal(name: &str, hal_instance: Self::Instance) -> Instance {
+ Instance {
+ name: name.to_owned(),
+ vulkan: Some(hal_instance),
+ ..Default::default()
+ }
+ }
+ fn instance_as_hal(instance: &Instance) -> Option<&Self::Instance> {
+ instance.vulkan.as_ref()
+ }
+ fn hub(global: &Global) -> &Hub<Self> {
+ &global.hubs.vulkan
+ }
+ fn get_surface(surface: &Surface) -> Option<&Self::Surface> {
+ surface.raw.downcast_ref::<Self>()
+ }
+}
+
+#[cfg(metal)]
+impl HalApi for hal::api::Metal {
+ const VARIANT: Backend = Backend::Metal;
+ fn create_instance_from_hal(name: &str, hal_instance: Self::Instance) -> Instance {
+ Instance {
+ name: name.to_owned(),
+ metal: Some(hal_instance),
+ ..Default::default()
+ }
+ }
+ fn instance_as_hal(instance: &Instance) -> Option<&Self::Instance> {
+ instance.metal.as_ref()
+ }
+ fn hub(global: &Global) -> &Hub<Self> {
+ &global.hubs.metal
+ }
+ fn get_surface(surface: &Surface) -> Option<&Self::Surface> {
+ surface.raw.downcast_ref::<Self>()
+ }
+}
+
+#[cfg(dx12)]
+impl HalApi for hal::api::Dx12 {
+ const VARIANT: Backend = Backend::Dx12;
+ fn create_instance_from_hal(name: &str, hal_instance: Self::Instance) -> Instance {
+ Instance {
+ name: name.to_owned(),
+ dx12: Some(hal_instance),
+ ..Default::default()
+ }
+ }
+ fn instance_as_hal(instance: &Instance) -> Option<&Self::Instance> {
+ instance.dx12.as_ref()
+ }
+ fn hub(global: &Global) -> &Hub<Self> {
+ &global.hubs.dx12
+ }
+ fn get_surface(surface: &Surface) -> Option<&Self::Surface> {
+ surface.raw.downcast_ref::<Self>()
+ }
+}
+
+#[cfg(gles)]
+impl HalApi for hal::api::Gles {
+ const VARIANT: Backend = Backend::Gl;
+ fn create_instance_from_hal(name: &str, hal_instance: Self::Instance) -> Instance {
+ #[allow(clippy::needless_update)]
+ Instance {
+ name: name.to_owned(),
+ gl: Some(hal_instance),
+ ..Default::default()
+ }
+ }
+ fn instance_as_hal(instance: &Instance) -> Option<&Self::Instance> {
+ instance.gl.as_ref()
+ }
+ fn hub(global: &Global) -> &Hub<Self> {
+ &global.hubs.gl
+ }
+ fn get_surface(surface: &Surface) -> Option<&Self::Surface> {
+ surface.raw.downcast_ref::<Self>()
+ }
+}