use std::{ffi::c_void, num::NonZero, ptr::NonNull}; use glam::{UVec2, uvec2}; use photon_light::{Core, RedrawArgs, init_gpu_inner}; use raw_window_handle::{RawDisplayHandle, RawWindowHandle, XcbDisplayHandle, XcbWindowHandle}; unsafe fn create_viewport( display: impl Into, window: impl Into, size: UVec2, ) -> Box { let target = wgpu::SurfaceTargetUnsafe::RawHandle { raw_display_handle: display.into(), raw_window_handle: window.into(), }; let gpu = pollster::block_on(init_gpu_inner(|instance| unsafe { instance.create_surface_unsafe(target) })) .unwrap(); Box::new(Core::new(gpu, size)) } #[unsafe(no_mangle)] unsafe extern "C" fn rt4_viewport_create( connection: NonNull, window: NonZero, width: u32, height: u32, ) -> Box { let display = XcbDisplayHandle::new(Some(connection), 0); let window = XcbWindowHandle::new(window); unsafe { create_viewport(display, window, uvec2(width, height)) } } #[unsafe(no_mangle)] unsafe extern "C" fn rt4_viewport_destroy(viewport: Box) { drop(viewport); } #[unsafe(no_mangle)] unsafe extern "C" fn rt4_viewport_configure(viewport: &mut Core, width: u32, height: u32) { viewport.configure(uvec2(width, height)); } #[unsafe(no_mangle)] unsafe extern "C" fn rt4_viewport_redraw(viewport: &mut Core, args: &RedrawArgs) { viewport.redraw(args); }