use wasm_bindgen::prelude::*;
use crate::gpu::GpuCapabilities;
use super::backend::GpuBackendWasm;
use super::limits::GpuLimitsWasm;
#[wasm_bindgen]
#[derive(Debug, Clone)]
pub struct GpuCapabilitiesWasm {
pub(super) backend: GpuBackendWasm,
pub(super) device_name: String,
pub(super) vendor_name: String,
pub(super) driver_info: String,
pub(super) supports_f16: bool,
pub(super) supports_timestamp_query: bool,
pub(super) limits: GpuLimitsWasm,
}
#[wasm_bindgen]
impl GpuCapabilitiesWasm {
#[wasm_bindgen(getter)]
pub fn backend(&self) -> GpuBackendWasm {
self.backend
}
#[wasm_bindgen(getter, js_name = deviceName)]
pub fn device_name(&self) -> String {
self.device_name.clone()
}
#[wasm_bindgen(getter, js_name = vendorName)]
pub fn vendor_name(&self) -> String {
self.vendor_name.clone()
}
#[wasm_bindgen(getter, js_name = driverInfo)]
pub fn driver_info(&self) -> String {
self.driver_info.clone()
}
#[wasm_bindgen(getter, js_name = supportsF16)]
pub fn supports_f16(&self) -> bool {
self.supports_f16
}
#[wasm_bindgen(getter, js_name = supportsTimestampQuery)]
pub fn supports_timestamp_query(&self) -> bool {
self.supports_timestamp_query
}
#[wasm_bindgen(getter)]
pub fn limits(&self) -> GpuLimitsWasm {
self.limits.clone()
}
#[wasm_bindgen(js_name = backendName)]
pub fn backend_name(&self) -> String {
match self.backend {
GpuBackendWasm::Vulkan => "Vulkan".to_string(),
GpuBackendWasm::Metal => "Metal".to_string(),
GpuBackendWasm::Dx12 => "DirectX 12".to_string(),
GpuBackendWasm::BrowserWebGpu => "WebGPU".to_string(),
GpuBackendWasm::Gl => "OpenGL".to_string(),
GpuBackendWasm::None => "None".to_string(),
}
}
#[wasm_bindgen]
pub fn summary(&self) -> String {
format!(
"GPU: {} ({}) | Backend: {} | F16: {} | Max Buffer: {:.0}MB",
self.device_name,
self.vendor_name,
self.backend_name(),
if self.supports_f16 { "Yes" } else { "No" },
self.limits.max_buffer_size_mb()
)
}
}
impl From<GpuCapabilities> for GpuCapabilitiesWasm {
fn from(caps: GpuCapabilities) -> Self {
Self {
backend: caps.backend.into(),
device_name: caps.name,
vendor_name: caps.vendor,
driver_info: String::new(), supports_f16: caps.supports_f16,
supports_timestamp_query: caps.supports_timestamp_query,
limits: caps.limits.into(),
}
}
}