49 lines
1.3 KiB
Rust
49 lines
1.3 KiB
Rust
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<RawDisplayHandle>,
|
|
window: impl Into<RawWindowHandle>,
|
|
size: UVec2,
|
|
) -> Box<Core> {
|
|
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<c_void>,
|
|
window: NonZero<u32>,
|
|
width: u32,
|
|
height: u32,
|
|
) -> Box<Core> {
|
|
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<Core>) {
|
|
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);
|
|
}
|