@@ -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 ,
@@ -162,23 +162,23 @@ impl App {
162162 } ) ;
163163 }
164164 DesktopFrontendMessage :: UpdateViewportPhysicalBounds { x, y, width, height } => {
165- if let Some ( graphics_state ) = & mut self . graphics_state
165+ if let Some ( render_state ) = & mut self . render_state
166166 && let Some ( window) = & self . window
167167 {
168168 let window_size = window. surface_size ( ) ;
169169
170170 let viewport_offset_x = x / window_size. width as f64 ;
171171 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 ] ) ;
172+ render_state . set_viewport_offset ( [ viewport_offset_x as f32 , viewport_offset_y as f32 ] ) ;
173173
174174 let viewport_scale_x = if width != 0.0 { window_size. width as f64 / width } else { 1.0 } ;
175175 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 ] ) ;
176+ render_state . set_viewport_scale ( [ viewport_scale_x as f32 , viewport_scale_y as f32 ] ) ;
177177 }
178178 }
179179 DesktopFrontendMessage :: UpdateOverlays ( scene) => {
180- if let Some ( graphics_state ) = & mut self . graphics_state {
181- graphics_state . set_overlays_scene ( scene) ;
180+ if let Some ( render_state ) = & mut self . render_state {
181+ render_state . set_overlays_scene ( scene) ;
182182 }
183183 }
184184 DesktopFrontendMessage :: PersistenceWriteDocument { id, document } => {
@@ -331,19 +331,18 @@ impl App {
331331 NodeGraphExecutionResult :: HasRun ( texture) => {
332332 self . dispatch_desktop_wrapper_message ( DesktopWrapperMessage :: PollNodeGraphEvaluation ) ;
333333 if let Some ( texture) = texture
334- && let Some ( graphics_state ) = self . graphics_state . as_mut ( )
334+ && let Some ( render_state ) = self . render_state . as_mut ( )
335335 && let Some ( window) = self . window . as_ref ( )
336336 {
337- graphics_state . bind_viewport_texture ( texture) ;
337+ render_state . bind_viewport_texture ( texture) ;
338338 window. request_redraw ( ) ;
339339 }
340340 }
341341 NodeGraphExecutionResult :: NotRun => { }
342342 } ,
343343 AppEvent :: UiUpdate ( texture) => {
344- if let Some ( graphics_state) = self . graphics_state . as_mut ( ) {
345- graphics_state. resize ( texture. width ( ) , texture. height ( ) ) ;
346- graphics_state. bind_ui_texture ( texture) ;
344+ if let Some ( render_state) = self . render_state . as_mut ( ) {
345+ render_state. bind_ui_texture ( texture) ;
347346 let elapsed = self . last_ui_update . elapsed ( ) . as_secs_f32 ( ) ;
348347 self . last_ui_update = Instant :: now ( ) ;
349348 if elapsed < 0.5 {
@@ -385,13 +384,18 @@ impl ApplicationHandler for App {
385384
386385 self . window_scale = window. scale_factor ( ) ;
387386 let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Scale ( self . window_scale ) ) ;
387+
388+ // Ensures the CEF texture does not remain at 1x1 pixels until the window is resized by the user
389+ // Affects only some Mac devices (issue found on 2023 M2 Mac Mini).
390+ let PhysicalSize { width, height } = window. surface_size ( ) ;
391+ let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Size { width, height } ) ;
392+
388393 self . cef_context . notify_view_info_changed ( ) ;
389394
390395 self . window = Some ( window) ;
391396
392- let graphics_state = GraphicsState :: new ( self . window . as_ref ( ) . unwrap ( ) , self . wgpu_context . clone ( ) ) ;
393-
394- self . graphics_state = Some ( graphics_state) ;
397+ let render_state = RenderState :: new ( self . window . as_ref ( ) . unwrap ( ) , self . wgpu_context . clone ( ) ) ;
398+ self . render_state = Some ( render_state) ;
395399
396400 self . desktop_wrapper . init ( self . wgpu_context . clone ( ) ) ;
397401
@@ -418,14 +422,18 @@ impl ApplicationHandler for App {
418422 self . app_event_scheduler . schedule ( AppEvent :: CloseWindow ) ;
419423 }
420424 WindowEvent :: SurfaceResized ( PhysicalSize { width, height } ) => {
421- let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Size {
422- width : width as usize ,
423- height : height as usize ,
424- } ) ;
425+ let _ = self . cef_view_info_sender . send ( cef:: ViewInfoUpdate :: Size { width, height } ) ;
425426 self . cef_context . notify_view_info_changed ( ) ;
427+
428+ if let Some ( render_state) = & mut self . render_state {
429+ render_state. resize ( width, height) ;
430+ }
431+
426432 if let Some ( window) = & self . window {
427433 let maximized = window. is_maximized ( ) ;
428434 self . app_event_scheduler . schedule ( AppEvent :: DesktopWrapperMessage ( DesktopWrapperMessage :: UpdateMaximized { maximized } ) ) ;
435+
436+ window. request_redraw ( ) ;
429437 }
430438 }
431439 WindowEvent :: ScaleFactorChanged { scale_factor, .. } => {
@@ -434,18 +442,24 @@ impl ApplicationHandler for App {
434442 self . cef_context . notify_view_info_changed ( ) ;
435443 }
436444 WindowEvent :: RedrawRequested => {
437- let Some ( ref mut graphics_state) = self . graphics_state else { return } ;
438- // Only rerender once we have a new UI texture to display
445+ let Some ( render_state) = & mut self . render_state else { return } ;
439446 if let Some ( window) = & self . window {
440- match graphics_state. render ( window) {
447+ let size = window. surface_size ( ) ;
448+ render_state. resize ( size. width , size. height ) ;
449+
450+ match render_state. render ( window) {
441451 Ok ( _) => { }
442- Err ( wgpu:: SurfaceError :: Lost ) => {
452+ Err ( RenderError :: OutdatedUITextureError ) => {
453+ self . cef_context . notify_view_info_changed ( ) ;
454+ }
455+ Err ( RenderError :: SurfaceError ( wgpu:: SurfaceError :: Lost ) ) => {
443456 tracing:: warn!( "lost surface" ) ;
444457 }
445- Err ( wgpu:: SurfaceError :: OutOfMemory ) => {
458+ Err ( RenderError :: SurfaceError ( wgpu:: SurfaceError :: OutOfMemory ) ) => {
459+ tracing:: error!( "GPU out of memory" ) ;
446460 event_loop. exit ( ) ;
447461 }
448- Err ( e ) => tracing:: error!( "{:?}" , e) ,
462+ Err ( RenderError :: SurfaceError ( e ) ) => tracing:: error!( "Render error: {:?}" , e) ,
449463 }
450464 let _ = self . start_render_sender . try_send ( ( ) ) ;
451465 }
0 commit comments