@@ -18,22 +18,22 @@ use crate::cef;
1818use crate :: consts:: CEF_MESSAGE_LOOP_MAX_ITERATIONS ;
1919use crate :: event:: { AppEvent , AppEventScheduler } ;
2020use crate :: persist:: PersistentData ;
21- use crate :: render:: GraphicsState ;
21+ use crate :: render:: { RenderError , RenderState } ;
2222use crate :: window:: Window ;
2323use crate :: wrapper:: messages:: { DesktopFrontendMessage , DesktopWrapperMessage , Platform } ;
2424use crate :: wrapper:: { DesktopWrapper , NodeGraphExecutionResult , WgpuContext , serialize_frontend_messages} ;
2525
2626pub ( crate ) struct App {
27- cef_context : Box < dyn cef:: CefContext > ,
27+ render_state : Option < RenderState > ,
28+ wgpu_context : WgpuContext ,
2829 window : Option < Window > ,
2930 window_scale : f64 ,
30- cef_schedule : Option < Instant > ,
31- cef_view_info_sender : Sender < cef:: ViewInfoUpdate > ,
32- graphics_state : Option < GraphicsState > ,
33- wgpu_context : WgpuContext ,
3431 app_event_receiver : Receiver < AppEvent > ,
3532 app_event_scheduler : AppEventScheduler ,
3633 desktop_wrapper : DesktopWrapper ,
34+ cef_context : Box < dyn cef:: CefContext > ,
35+ cef_schedule : Option < Instant > ,
36+ cef_view_info_sender : Sender < cef:: ViewInfoUpdate > ,
3737 last_ui_update : Instant ,
3838 avg_frame_time : f32 ,
3939 start_render_sender : SyncSender < ( ) > ,
@@ -77,17 +77,17 @@ impl App {
7777 persistent_data. load_from_disk ( ) ;
7878
7979 Self {
80- cef_context,
81- window : None ,
82- window_scale : 1.0 ,
83- cef_schedule : Some ( Instant :: now ( ) ) ,
84- graphics_state : None ,
85- cef_view_info_sender,
80+ render_state : None ,
8681 wgpu_context,
82+ window : None ,
83+ window_scale : 1. ,
8784 app_event_receiver,
8885 app_event_scheduler,
8986 desktop_wrapper : DesktopWrapper :: new ( ) ,
9087 last_ui_update : Instant :: now ( ) ,
88+ cef_context,
89+ cef_schedule : Some ( Instant :: now ( ) ) ,
90+ cef_view_info_sender,
9191 avg_frame_time : 0. ,
9292 start_render_sender,
9393 web_communication_initialized : false ,
@@ -97,6 +97,17 @@ impl App {
9797 }
9898 }
9999
100+ fn resize_window ( & mut self , width : u32 , height : u32 ) {
101+ let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Size { width, height } ) ;
102+ self . cef_context . notify_view_info_changed ( ) ;
103+ if let Some ( render_state) = & mut self . render_state {
104+ render_state. resize ( width, height) ;
105+ }
106+ if let Some ( window) = & self . window {
107+ window. request_redraw ( ) ;
108+ }
109+ }
110+
100111 fn handle_desktop_frontend_message ( & mut self , message : DesktopFrontendMessage , responses : & mut Vec < DesktopWrapperMessage > ) {
101112 match message {
102113 DesktopFrontendMessage :: ToWeb ( messages) => {
@@ -162,23 +173,23 @@ impl App {
162173 } ) ;
163174 }
164175 DesktopFrontendMessage :: UpdateViewportPhysicalBounds { x, y, width, height } => {
165- if let Some ( graphics_state ) = & mut self . graphics_state
176+ if let Some ( render_state ) = & mut self . render_state
166177 && let Some ( window) = & self . window
167178 {
168179 let window_size = window. surface_size ( ) ;
169180
170181 let viewport_offset_x = x / window_size. width as f64 ;
171182 let viewport_offset_y = y / window_size. height as f64 ;
172- graphics_state . set_viewport_offset ( [ viewport_offset_x as f32 , viewport_offset_y as f32 ] ) ;
183+ render_state . set_viewport_offset ( [ viewport_offset_x as f32 , viewport_offset_y as f32 ] ) ;
173184
174185 let viewport_scale_x = if width != 0.0 { window_size. width as f64 / width } else { 1.0 } ;
175186 let viewport_scale_y = if height != 0.0 { window_size. height as f64 / height } else { 1.0 } ;
176- graphics_state . set_viewport_scale ( [ viewport_scale_x as f32 , viewport_scale_y as f32 ] ) ;
187+ render_state . set_viewport_scale ( [ viewport_scale_x as f32 , viewport_scale_y as f32 ] ) ;
177188 }
178189 }
179190 DesktopFrontendMessage :: UpdateOverlays ( scene) => {
180- if let Some ( graphics_state ) = & mut self . graphics_state {
181- graphics_state . set_overlays_scene ( scene) ;
191+ if let Some ( render_state ) = & mut self . render_state {
192+ render_state . set_overlays_scene ( scene) ;
182193 }
183194 }
184195 DesktopFrontendMessage :: PersistenceWriteDocument { id, document } => {
@@ -331,42 +342,25 @@ impl App {
331342 NodeGraphExecutionResult :: HasRun ( texture) => {
332343 self . dispatch_desktop_wrapper_message ( DesktopWrapperMessage :: PollNodeGraphEvaluation ) ;
333344 if let Some ( texture) = texture
334- && let Some ( graphics_state ) = self . graphics_state . as_mut ( )
345+ && let Some ( render_state ) = self . render_state . as_mut ( )
335346 && let Some ( window) = self . window . as_ref ( )
336347 {
337- graphics_state . bind_viewport_texture ( texture) ;
348+ render_state . bind_viewport_texture ( texture) ;
338349 window. request_redraw ( ) ;
339350 }
340351 }
341352 NodeGraphExecutionResult :: NotRun => { }
342353 } ,
343354 AppEvent :: UiUpdate ( texture) => {
344- let width = texture. width ( ) ;
345- let height = texture. height ( ) ;
346- if let Some ( graphics_state) = self . graphics_state . as_mut ( ) {
347- graphics_state. resize ( width, height) ;
348- graphics_state. bind_ui_texture ( texture) ;
355+ if let Some ( render_state) = self . render_state . as_mut ( ) {
356+ render_state. bind_ui_texture ( texture) ;
349357 let elapsed = self . last_ui_update . elapsed ( ) . as_secs_f32 ( ) ;
350358 self . last_ui_update = Instant :: now ( ) ;
351359 if elapsed < 0.5 {
352360 self . avg_frame_time = ( self . avg_frame_time * 3. + elapsed) / 4. ;
353361 }
354362 }
355363 if let Some ( window) = & self . window {
356- // Workaround for missing resize events on mac
357- // TODO: Find a cleaner solution
358- #[ cfg( target_os = "macos" ) ]
359- {
360- let surface_size = window. surface_size ( ) ;
361- if width != surface_size. width || height != surface_size. height {
362- let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Size {
363- width : surface_size. width as usize ,
364- height : surface_size. height as usize ,
365- } ) ;
366- self . cef_context . notify_view_info_changed ( ) ;
367- }
368- }
369-
370364 window. request_redraw ( ) ;
371365 }
372366 }
@@ -405,9 +399,8 @@ impl ApplicationHandler for App {
405399
406400 self . window = Some ( window) ;
407401
408- let graphics_state = GraphicsState :: new ( self . window . as_ref ( ) . unwrap ( ) , self . wgpu_context . clone ( ) ) ;
409-
410- self . graphics_state = Some ( graphics_state) ;
402+ let render_state = RenderState :: new ( self . window . as_ref ( ) . unwrap ( ) , self . wgpu_context . clone ( ) ) ;
403+ self . render_state = Some ( render_state) ;
411404
412405 self . desktop_wrapper . init ( self . wgpu_context . clone ( ) ) ;
413406
@@ -434,11 +427,8 @@ impl ApplicationHandler for App {
434427 self . app_event_scheduler . schedule ( AppEvent :: CloseWindow ) ;
435428 }
436429 WindowEvent :: SurfaceResized ( PhysicalSize { width, height } ) => {
437- let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Size {
438- width : width as usize ,
439- height : height as usize ,
440- } ) ;
441- self . cef_context . notify_view_info_changed ( ) ;
430+ self . resize_window ( width, height) ;
431+
442432 if let Some ( window) = & self . window {
443433 let maximized = window. is_maximized ( ) ;
444434 self . app_event_scheduler . schedule ( AppEvent :: DesktopWrapperMessage ( DesktopWrapperMessage :: UpdateMaximized { maximized } ) ) ;
@@ -450,18 +440,21 @@ impl ApplicationHandler for App {
450440 self . cef_context . notify_view_info_changed ( ) ;
451441 }
452442 WindowEvent :: RedrawRequested => {
453- let Some ( ref mut graphics_state) = self . graphics_state else { return } ;
454- // Only rerender once we have a new UI texture to display
443+ let Some ( render_state) = & mut self . render_state else { return } ;
455444 if let Some ( window) = & self . window {
456- match graphics_state . render ( window) {
445+ match render_state . render ( window) {
457446 Ok ( _) => { }
458- Err ( wgpu:: SurfaceError :: Lost ) => {
447+ Err ( RenderError :: OutdatedUITextureError ) => {
448+ self . cef_context . notify_view_info_changed ( ) ;
449+ }
450+ Err ( RenderError :: SurfaceError ( wgpu:: SurfaceError :: Lost ) ) => {
459451 tracing:: warn!( "lost surface" ) ;
460452 }
461- Err ( wgpu:: SurfaceError :: OutOfMemory ) => {
453+ Err ( RenderError :: SurfaceError ( wgpu:: SurfaceError :: OutOfMemory ) ) => {
454+ tracing:: error!( "GPU out of memory" ) ;
462455 event_loop. exit ( ) ;
463456 }
464- Err ( e ) => tracing:: error!( "{:?}" , e) ,
457+ Err ( RenderError :: SurfaceError ( e ) ) => tracing:: error!( "Render error: {:?}" , e) ,
465458 }
466459 let _ = self . start_render_sender . try_send ( ( ) ) ;
467460 }
0 commit comments