Skip to main content

surfman/base/egl/
ffi.rs

1//! FFI-related functionality common to the various EGL backends.
2
3#![allow(dead_code)]
4
5use crate::egl::types::{EGLAttrib, EGLBoolean, EGLContext, EGLDeviceEXT, EGLDisplay, EGLSurface};
6use crate::egl::types::{EGLenum, EGLint};
7
8use std::os::raw::c_void;
9use std::sync::LazyLock;
10
11pub enum EGLClientBufferOpaque {}
12pub type EGLClientBuffer = *mut EGLClientBufferOpaque;
13
14pub enum EGLImageKHROpaque {}
15pub type EGLImageKHR = *mut EGLImageKHROpaque;
16
17pub const EGL_GL_TEXTURE_2D_KHR: EGLenum = 0x30b1;
18pub const EGL_IMAGE_PRESERVED_KHR: EGLenum = 0x30d2;
19pub const EGL_CONTEXT_MINOR_VERSION_KHR: EGLenum = 0x30fb;
20pub const EGL_CONTEXT_OPENGL_PROFILE_MASK: EGLenum = 0x30fd;
21pub const EGL_PLATFORM_DEVICE_EXT: EGLenum = 0x313f;
22pub const EGL_NATIVE_BUFFER_ANDROID: EGLenum = 0x3140;
23pub const EGL_PLATFORM_X11_KHR: EGLenum = 0x31d5;
24pub const EGL_PLATFORM_WAYLAND_KHR: EGLenum = 0x31d8;
25pub const EGL_PLATFORM_SURFACELESS_MESA: EGLenum = 0x31dd;
26pub const EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: EGLenum = 0x3200;
27pub const EGL_BAD_DEVICE_EXT: EGLenum = 0x322b;
28pub const EGL_DEVICE_EXT: EGLenum = 0x322c;
29pub const EGL_D3D11_DEVICE_ANGLE: EGLenum = 0x33a1;
30pub const EGL_DXGI_KEYED_MUTEX_ANGLE: EGLenum = 0x33a2;
31pub const EGL_D3D_TEXTURE_ANGLE: EGLenum = 0x33a3;
32
33pub const EGL_NO_DEVICE_EXT: EGLDeviceEXT = 0 as EGLDeviceEXT;
34pub const EGL_NO_IMAGE_KHR: EGLImageKHR = 0 as EGLImageKHR;
35
36pub const EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT: EGLint = 1;
37pub const EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT: EGLint = 2;
38
39#[allow(non_snake_case)]
40pub(crate) struct EGLExtensionFunctions {
41    // Ubiquitous extensions assumed to be present
42    pub(crate) CreateImageKHR: extern "C" fn(
43        dpy: EGLDisplay,
44        ctx: EGLContext,
45        target: EGLenum,
46        buffer: EGLClientBuffer,
47        attrib_list: *const EGLint,
48    ) -> EGLImageKHR,
49    pub(crate) DestroyImageKHR: extern "C" fn(dpy: EGLDisplay, image: EGLImageKHR) -> EGLBoolean,
50    pub(crate) ImageTargetTexture2DOES: extern "C" fn(target: EGLenum, image: EGLImageKHR),
51
52    // Optional extensions
53    pub(crate) CreateDeviceANGLE: Option<
54        extern "C" fn(
55            device_type: EGLint,
56            native_device: *mut c_void,
57            attrib_list: *const EGLAttrib,
58        ) -> EGLDeviceEXT,
59    >,
60    pub(crate) GetNativeClientBufferANDROID:
61        Option<extern "C" fn(buffer: *const c_void) -> EGLClientBuffer>,
62    pub(crate) QueryDeviceAttribEXT: Option<
63        extern "C" fn(device: EGLDeviceEXT, attribute: EGLint, value: *mut EGLAttrib) -> EGLBoolean,
64    >,
65    pub(crate) QueryDisplayAttribEXT: Option<
66        extern "C" fn(dpy: EGLDisplay, attribute: EGLint, value: *mut EGLAttrib) -> EGLBoolean,
67    >,
68    pub(crate) QuerySurfacePointerANGLE: Option<
69        extern "C" fn(
70            dpy: EGLDisplay,
71            surface: EGLSurface,
72            attribute: EGLint,
73            value: *mut *mut c_void,
74        ) -> EGLBoolean,
75    >,
76}
77
78pub(crate) static EGL_EXTENSION_FUNCTIONS: LazyLock<EGLExtensionFunctions> = LazyLock::new(|| {
79    use crate::base::egl::device::lookup_egl_extension as get;
80    use std::mem::transmute as cast;
81    unsafe {
82        EGLExtensionFunctions {
83            CreateImageKHR: cast(get(c"eglCreateImageKHR")),
84            DestroyImageKHR: cast(get(c"eglDestroyImageKHR")),
85            ImageTargetTexture2DOES: cast(get(c"glEGLImageTargetTexture2DOES")),
86
87            CreateDeviceANGLE: cast(get(c"eglCreateDeviceANGLE")),
88            GetNativeClientBufferANDROID: cast(get(c"eglGetNativeClientBufferANDROID")),
89            QueryDeviceAttribEXT: cast(get(c"eglQueryDeviceAttribEXT")),
90            QueryDisplayAttribEXT: cast(get(c"eglQueryDisplayAttribEXT")),
91            QuerySurfacePointerANGLE: cast(get(c"eglQuerySurfacePointerANGLE")),
92        }
93    }
94});