@@ -102,6 +102,8 @@ impl WebPainter for WebPainterWgpu {
102
102
pixels_per_point : f32 ,
103
103
textures_delta : & egui:: TexturesDelta ,
104
104
) -> Result < ( ) , JsValue > {
105
+ let size_in_pixels = [ self . canvas . width ( ) , self . canvas . height ( ) ] ;
106
+
105
107
let render_state = if let Some ( render_state) = & self . render_state {
106
108
render_state
107
109
} else {
@@ -110,32 +112,6 @@ impl WebPainter for WebPainterWgpu {
110
112
) ) ;
111
113
} ;
112
114
113
- // Resize surface if needed
114
- let size_in_pixels = [ self . canvas . width ( ) , self . canvas . height ( ) ] ;
115
- if size_in_pixels[ 0 ] != self . surface_configuration . width
116
- || size_in_pixels[ 1 ] != self . surface_configuration . height
117
- {
118
- self . surface_configuration . width = size_in_pixels[ 0 ] ;
119
- self . surface_configuration . height = size_in_pixels[ 1 ] ;
120
- self . surface
121
- . configure ( & render_state. device , & self . surface_configuration ) ;
122
- }
123
-
124
- let frame = match self . surface . get_current_texture ( ) {
125
- Ok ( frame) => frame,
126
- #[ allow( clippy:: single_match_else) ]
127
- Err ( e) => match ( * self . on_surface_error ) ( e) {
128
- SurfaceErrorAction :: RecreateSurface => {
129
- self . surface
130
- . configure ( & render_state. device , & self . surface_configuration ) ;
131
- return Ok ( ( ) ) ;
132
- }
133
- SurfaceErrorAction :: SkipFrame => {
134
- return Ok ( ( ) ) ;
135
- }
136
- } ,
137
- } ;
138
-
139
115
let mut encoder =
140
116
render_state
141
117
. device
@@ -169,31 +145,63 @@ impl WebPainter for WebPainterWgpu {
169
145
)
170
146
} ;
171
147
172
- {
173
- let renderer = render_state. renderer . read ( ) ;
174
- let frame_view = frame
175
- . texture
176
- . create_view ( & wgpu:: TextureViewDescriptor :: default ( ) ) ;
177
- let mut render_pass = encoder. begin_render_pass ( & wgpu:: RenderPassDescriptor {
178
- color_attachments : & [ Some ( wgpu:: RenderPassColorAttachment {
179
- view : & frame_view,
180
- resolve_target : None ,
181
- ops : wgpu:: Operations {
182
- load : wgpu:: LoadOp :: Clear ( wgpu:: Color {
183
- r : clear_color. r ( ) as f64 ,
184
- g : clear_color. g ( ) as f64 ,
185
- b : clear_color. b ( ) as f64 ,
186
- a : clear_color. a ( ) as f64 ,
187
- } ) ,
188
- store : true ,
189
- } ,
190
- } ) ] ,
191
- depth_stencil_attachment : None ,
192
- label : Some ( "egui_render" ) ,
193
- } ) ;
194
-
195
- renderer. render ( & mut render_pass, clipped_primitives, & screen_descriptor) ;
196
- }
148
+ // Resize surface if needed
149
+ let is_zero_sized_surface = size_in_pixels[ 0 ] == 0 || size_in_pixels[ 1 ] == 0 ;
150
+ let frame = if is_zero_sized_surface {
151
+ None
152
+ } else {
153
+ if size_in_pixels[ 0 ] != self . surface_configuration . width
154
+ || size_in_pixels[ 1 ] != self . surface_configuration . height
155
+ {
156
+ self . surface_configuration . width = size_in_pixels[ 0 ] ;
157
+ self . surface_configuration . height = size_in_pixels[ 1 ] ;
158
+ self . surface
159
+ . configure ( & render_state. device , & self . surface_configuration ) ;
160
+ }
161
+
162
+ let frame = match self . surface . get_current_texture ( ) {
163
+ Ok ( frame) => frame,
164
+ #[ allow( clippy:: single_match_else) ]
165
+ Err ( e) => match ( * self . on_surface_error ) ( e) {
166
+ SurfaceErrorAction :: RecreateSurface => {
167
+ self . surface
168
+ . configure ( & render_state. device , & self . surface_configuration ) ;
169
+ return Ok ( ( ) ) ;
170
+ }
171
+ SurfaceErrorAction :: SkipFrame => {
172
+ return Ok ( ( ) ) ;
173
+ }
174
+ } ,
175
+ } ;
176
+
177
+ {
178
+ let renderer = render_state. renderer . read ( ) ;
179
+ let frame_view = frame
180
+ . texture
181
+ . create_view ( & wgpu:: TextureViewDescriptor :: default ( ) ) ;
182
+ let mut render_pass = encoder. begin_render_pass ( & wgpu:: RenderPassDescriptor {
183
+ color_attachments : & [ Some ( wgpu:: RenderPassColorAttachment {
184
+ view : & frame_view,
185
+ resolve_target : None ,
186
+ ops : wgpu:: Operations {
187
+ load : wgpu:: LoadOp :: Clear ( wgpu:: Color {
188
+ r : clear_color. r ( ) as f64 ,
189
+ g : clear_color. g ( ) as f64 ,
190
+ b : clear_color. b ( ) as f64 ,
191
+ a : clear_color. a ( ) as f64 ,
192
+ } ) ,
193
+ store : true ,
194
+ } ,
195
+ } ) ] ,
196
+ depth_stencil_attachment : None ,
197
+ label : Some ( "egui_render" ) ,
198
+ } ) ;
199
+
200
+ renderer. render ( & mut render_pass, clipped_primitives, & screen_descriptor) ;
201
+ }
202
+
203
+ Some ( frame)
204
+ } ;
197
205
198
206
{
199
207
let mut renderer = render_state. renderer . write ( ) ;
@@ -208,7 +216,10 @@ impl WebPainter for WebPainterWgpu {
208
216
. into_iter ( )
209
217
. chain ( std:: iter:: once ( encoder. finish ( ) ) ) ,
210
218
) ;
211
- frame. present ( ) ;
219
+
220
+ if let Some ( frame) = frame {
221
+ frame. present ( ) ;
222
+ }
212
223
213
224
Ok ( ( ) )
214
225
}
0 commit comments