@@ -38,7 +38,9 @@ pub(crate) struct CefHandler {
3838 window_size_receiver : Arc < Mutex < WindowSizeReceiver > > ,
3939 event_loop_proxy : EventLoopProxy < CustomEvent > ,
4040 wgpu_context : WgpuContext ,
41+ cached_ui_texture : Arc < Mutex < Option < wgpu:: Texture > > > ,
4142}
43+
4244struct WindowSizeReceiver {
4345 receiver : Receiver < WindowSize > ,
4446 window_size : WindowSize ,
@@ -57,8 +59,37 @@ impl CefHandler {
5759 window_size_receiver : Arc :: new ( Mutex :: new ( WindowSizeReceiver :: new ( window_size_receiver) ) ) ,
5860 event_loop_proxy,
5961 wgpu_context,
62+ cached_ui_texture : Arc :: new ( Mutex :: new ( None . into ( ) ) ) ,
6063 }
6164 }
65+
66+ fn try_resize_texture ( & self , width : u32 , height : u32 ) {
67+ let create_new_texture = self . cached_ui_texture . lock ( ) . unwrap ( ) . as_ref ( ) . map_or ( true , |texture| {
68+ let size = texture. size ( ) ;
69+ size. width != width || size. height != height
70+ } ) ;
71+
72+ if create_new_texture {
73+ self . create_texture ( width, height) ;
74+ }
75+ }
76+
77+ fn create_texture ( & self , width : u32 , height : u32 ) {
78+ * self . cached_ui_texture . lock ( ) . unwrap ( ) = Some ( self . wgpu_context . device . create_texture ( & wgpu:: TextureDescriptor {
79+ label : Some ( "CEF Texture" ) ,
80+ size : wgpu:: Extent3d {
81+ width,
82+ height,
83+ depth_or_array_layers : 1 ,
84+ } ,
85+ mip_level_count : 1 ,
86+ sample_count : 1 ,
87+ dimension : wgpu:: TextureDimension :: D2 ,
88+ format : wgpu:: TextureFormat :: Bgra8UnormSrgb ,
89+ usage : wgpu:: TextureUsages :: TEXTURE_BINDING | wgpu:: TextureUsages :: COPY_DST ,
90+ view_formats : & [ ] ,
91+ } ) ) ;
92+ }
6293}
6394
6495impl CefEventHandler for CefHandler {
@@ -76,23 +107,12 @@ impl CefEventHandler for CefHandler {
76107 fn draw < ' a > ( & self , frame_buffer : FrameBufferRef < ' a > ) {
77108 let width = frame_buffer. width ( ) as u32 ;
78109 let height = frame_buffer. height ( ) as u32 ;
79- let texture = self . wgpu_context . device . create_texture ( & wgpu:: TextureDescriptor {
80- label : Some ( "CEF Texture" ) ,
81- size : wgpu:: Extent3d {
82- width,
83- height,
84- depth_or_array_layers : 1 ,
85- } ,
86- mip_level_count : 1 ,
87- sample_count : 1 ,
88- dimension : wgpu:: TextureDimension :: D2 ,
89- format : wgpu:: TextureFormat :: Bgra8UnormSrgb ,
90- usage : wgpu:: TextureUsages :: TEXTURE_BINDING | wgpu:: TextureUsages :: COPY_DST ,
91- view_formats : & [ ] ,
92- } ) ;
110+ self . try_resize_texture ( width, height) ;
111+ let binding = self . cached_ui_texture . lock ( ) . unwrap ( ) ;
112+ let texture = binding. as_ref ( ) . expect ( "Texture must be initialized before drawing" ) ;
93113 self . wgpu_context . queue . write_texture (
94114 wgpu:: TexelCopyTextureInfo {
95- texture : & texture ,
115+ texture,
96116 mip_level : 0 ,
97117 origin : wgpu:: Origin3d :: ZERO ,
98118 aspect : wgpu:: TextureAspect :: All ,
@@ -110,7 +130,7 @@ impl CefEventHandler for CefHandler {
110130 } ,
111131 ) ;
112132
113- let _ = self . event_loop_proxy . send_event ( CustomEvent :: UiUpdate ( ( texture, width, height) ) ) ;
133+ let _ = self . event_loop_proxy . send_event ( CustomEvent :: UiUpdate ( ( texture. clone ( ) , width, height) ) ) ;
114134 }
115135
116136 fn schedule_cef_message_loop_work ( & self , scheduled_time : std:: time:: Instant ) {
0 commit comments