From a8f72096d8805fb25e46920af9600b5c74412cfb Mon Sep 17 00:00:00 2001 From: numzero Date: Mon, 24 Nov 2025 18:08:03 +0300 Subject: [PATCH] pass size on creation --- src/lib.rs | 8 +++++--- src/main.rs | 3 +-- ui/src/api.cxx | 6 +++--- ui/src/api.hxx | 2 +- ui/src/lib.rs | 9 ++++++--- ui/src/viewport.cxx | 4 ++-- 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 79e027d..87c1922 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -124,7 +124,7 @@ impl OrbitalCamera { } impl Core { - pub fn new(gpu: Gpu) -> Self { + pub fn new(gpu: Gpu, pixel_size: UVec2) -> Self { let Gpu { device, queue, @@ -136,14 +136,16 @@ impl Core { let tripod = new_tripod(&device); queue.submit([]); // flush buffer updates - Self { + let mut this = Self { device, queue, surface, pipeline, tripod, mesh_pipe, - } + }; + this.configure(pixel_size); + this } fn render(&self, output: &wgpu::Texture, args: &RedrawArgs) { diff --git a/src/main.rs b/src/main.rs index cb11049..adce210 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,8 +26,7 @@ impl MainWindow { instance.create_surface(Arc::clone(&window)) })) .unwrap(); - let mut core = Core::new(gpu); - core.configure(uvec2(1, 1)); + let core = Core::new(gpu, uvec2(1, 1)); Self { window, core } } diff --git a/ui/src/api.cxx b/ui/src/api.cxx index d65a690..aaa2b64 100644 --- a/ui/src/api.cxx +++ b/ui/src/api.cxx @@ -4,7 +4,7 @@ #include namespace ffi { -extern "C" Core* rt4_viewport_create(xcb_connection_t* connection, std::uint32_t window); +extern "C" Core* rt4_viewport_create(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height); extern "C" void rt4_viewport_destroy(Core* viewport); extern "C" void rt4_viewport_configure(Core* viewport, std::uint32_t width, std::uint32_t height); extern "C" void rt4_viewport_redraw(Core* viewport, const RedrawArgs* args); @@ -26,13 +26,13 @@ BoxCore& BoxCore::operator=(BoxCore&& b) { return *this; } -BoxCore BoxCore::from_xcb(xcb_connection_t* connection, std::uint32_t window) { +BoxCore BoxCore::from_xcb(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height) { if (!connection) throw std::logic_error("attempt to use a null connection"); if (!window) throw std::logic_error("attempt to use a null window"); BoxCore out; - out.ptr.ptr = ffi::rt4_viewport_create(connection, window); + out.ptr.ptr = ffi::rt4_viewport_create(connection, window, width, height); return out; } diff --git a/ui/src/api.hxx b/ui/src/api.hxx index bc96bc8..d46272e 100644 --- a/ui/src/api.hxx +++ b/ui/src/api.hxx @@ -69,7 +69,7 @@ public: void reset(); - static BoxCore from_xcb(xcb_connection_t* connection, std::uint32_t window); + static BoxCore from_xcb(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height); private: MutCore ptr; diff --git a/ui/src/lib.rs b/ui/src/lib.rs index 9ee96ef..c7a85f8 100644 --- a/ui/src/lib.rs +++ b/ui/src/lib.rs @@ -1,12 +1,13 @@ use std::{ffi::c_void, num::NonZero, ptr::NonNull}; -use glam::uvec2; +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(), @@ -16,17 +17,19 @@ unsafe fn create_viewport( instance.create_surface_unsafe(target) })) .unwrap(); - Box::new(Core::new(gpu)) + 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) } + unsafe { create_viewport(display, window, uvec2(width, height)) } } #[unsafe(no_mangle)] diff --git a/ui/src/viewport.cxx b/ui/src/viewport.cxx index 483ba07..e681bd9 100644 --- a/ui/src/viewport.cxx +++ b/ui/src/viewport.cxx @@ -61,9 +61,9 @@ void Viewport::recreate() try { fprintf(stderr, "connection %p, window %#08x\n", xcb_connection, x11_window); + const QSize device_size = size() * devicePixelRatio(); core.reset(); - core = BoxCore::from_xcb(xcb_connection, x11_window); - updateSize(); + core = BoxCore::from_xcb(xcb_connection, x11_window, device_size.width(), device_size.height()); } catch (const std::exception& e) { fprintf(stderr, "failed to recreate the viewport: %s", e.what()); }