#[cfg(target_os = "macos")]
pub(super) mod angle;
#[cfg(target_os = "linux")]
pub(super) mod linux;
#[cfg(target_os = "macos")]
pub(super) mod macos;
use super::EglDisplayKind;
use edgefirst_tensor::{PixelFormat, Tensor};
#[derive(Debug, Clone, Copy)]
pub(crate) struct PlatformCaps {
pub(crate) transfer_backend: super::TransferBackend,
pub(crate) render_dtypes: crate::RenderDtypeSupport,
pub(crate) serialize_gl: bool,
#[allow(dead_code)]
pub(crate) external_oes: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum PackedImportFormat {
Rgba8888,
Rgba16161616F,
}
impl PackedImportFormat {
pub(crate) fn bytes_per_pixel(self) -> usize {
match self {
PackedImportFormat::Rgba8888 => 4,
PackedImportFormat::Rgba16161616F => 8,
}
}
}
pub(super) trait GlPlatform {
type Display;
type Import;
type ImportHandle: Copy;
const PERSISTENT_TEX_BINDINGS: bool;
const EXTERNAL_OES: bool;
fn load_gl_once(display: &Self::Display);
fn init_display(kind: Option<EglDisplayKind>) -> crate::Result<Self::Display>;
fn import_buffer(
display: &Self::Display,
img: &Tensor<u8>,
fmt: PixelFormat,
for_dst: bool,
) -> crate::Result<Self::Import>;
fn import_buffer_nv_r8(
display: &Self::Display,
img: &Tensor<u8>,
fmt: PixelFormat,
) -> crate::Result<Self::Import>;
fn import_buffer_packed<T>(
display: &Self::Display,
img: &Tensor<T>,
width: usize,
height: usize,
fmt: PackedImportFormat,
) -> crate::Result<Self::Import>
where
T: num_traits::Num + Clone + std::fmt::Debug + Send + Sync;
fn import_handle(import: &Self::Import) -> Self::ImportHandle;
unsafe fn attach_tex_image_2d(
display: &Self::Display,
handle: Self::ImportHandle,
) -> crate::Result<()>;
unsafe fn attach_tex_image_external(
display: &Self::Display,
handle: Self::ImportHandle,
) -> crate::Result<()>;
unsafe fn attach_renderbuffer_storage(
display: &Self::Display,
handle: Self::ImportHandle,
) -> crate::Result<()>;
fn end_gpu_pass(display: &Self::Display);
}
#[cfg(target_os = "linux")]
pub(super) type Platform = linux::LinuxEgl;
#[cfg(target_os = "macos")]
pub(super) type Platform = angle::AngleClientBuffer;
const _: fn() = || {
fn assert_platform<P: GlPlatform>() {}
assert_platform::<Platform>();
};