#[cfg(feature = "rafx-metal")]
use crate::metal::RafxApiMetal;
#[cfg(feature = "rafx-vulkan")]
use crate::vulkan::{RafxApiDefVulkan, RafxApiVulkan};
use crate::*;
use raw_window_handle::HasRawWindowHandle;
pub enum RafxApi {
#[cfg(feature = "rafx-vulkan")]
Vk(RafxApiVulkan),
#[cfg(feature = "rafx-metal")]
Metal(RafxApiMetal),
}
impl RafxApi {
#[cfg(feature = "rafx-vulkan")]
pub fn new_vulkan(
window: &dyn HasRawWindowHandle,
api_def: &RafxApiDef,
vk_api_def: &RafxApiDefVulkan,
) -> RafxResult<Self> {
Ok(RafxApi::Vk(RafxApiVulkan::new(
window, api_def, vk_api_def,
)?))
}
pub fn device_context(&self) -> RafxDeviceContext {
match self {
#[cfg(feature = "rafx-vulkan")]
RafxApi::Vk(inner) => RafxDeviceContext::Vk(inner.device_context().clone()),
#[cfg(feature = "rafx-metal")]
RafxApi::Metal(_inner) => unimplemented!(),
}
}
pub fn destroy(&mut self) -> RafxResult<()> {
match self {
#[cfg(feature = "rafx-vulkan")]
RafxApi::Vk(inner) => inner.destroy(),
#[cfg(feature = "rafx-metal")]
RafxApi::Metal(_inner) => unimplemented!(),
}
}
#[cfg(feature = "rafx-vulkan")]
pub fn vk_api(&self) -> Option<&RafxApiVulkan> {
match self {
#[cfg(feature = "rafx-vulkan")]
RafxApi::Vk(inner) => Some(inner),
#[cfg(feature = "rafx-metal")]
RafxApi::Metal(_) => None,
}
}
#[cfg(feature = "rafx-metal")]
pub fn metal_api(&self) -> Option<&RafxApiMetal> {
match self {
#[cfg(feature = "rafx-vulkan")]
RafxApi::Vk(_) => None,
#[cfg(feature = "rafx-metal")]
RafxApi::Metal(inner) => Some(inner),
}
}
}