Compare commits
2 commits
master
...
cmc/zero_s
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5407c6b7ed | ||
![]() |
b629108eb9 |
1 changed files with 62 additions and 51 deletions
|
@ -102,6 +102,8 @@ impl WebPainter for WebPainterWgpu {
|
||||||
pixels_per_point: f32,
|
pixels_per_point: f32,
|
||||||
textures_delta: &egui::TexturesDelta,
|
textures_delta: &egui::TexturesDelta,
|
||||||
) -> Result<(), JsValue> {
|
) -> Result<(), JsValue> {
|
||||||
|
let size_in_pixels = [self.canvas.width(), self.canvas.height()];
|
||||||
|
|
||||||
let render_state = if let Some(render_state) = &self.render_state {
|
let render_state = if let Some(render_state) = &self.render_state {
|
||||||
render_state
|
render_state
|
||||||
} else {
|
} else {
|
||||||
|
@ -110,32 +112,6 @@ impl WebPainter for WebPainterWgpu {
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
|
|
||||||
// Resize surface if needed
|
|
||||||
let size_in_pixels = [self.canvas.width(), self.canvas.height()];
|
|
||||||
if size_in_pixels[0] != self.surface_configuration.width
|
|
||||||
|| size_in_pixels[1] != self.surface_configuration.height
|
|
||||||
{
|
|
||||||
self.surface_configuration.width = size_in_pixels[0];
|
|
||||||
self.surface_configuration.height = size_in_pixels[1];
|
|
||||||
self.surface
|
|
||||||
.configure(&render_state.device, &self.surface_configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
let frame = match self.surface.get_current_texture() {
|
|
||||||
Ok(frame) => frame,
|
|
||||||
#[allow(clippy::single_match_else)]
|
|
||||||
Err(e) => match (*self.on_surface_error)(e) {
|
|
||||||
SurfaceErrorAction::RecreateSurface => {
|
|
||||||
self.surface
|
|
||||||
.configure(&render_state.device, &self.surface_configuration);
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
SurfaceErrorAction::SkipFrame => {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut encoder =
|
let mut encoder =
|
||||||
render_state
|
render_state
|
||||||
.device
|
.device
|
||||||
|
@ -169,6 +145,35 @@ impl WebPainter for WebPainterWgpu {
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Resize surface if needed
|
||||||
|
let is_zero_sized_surface = size_in_pixels[0] == 0 || size_in_pixels[1] == 0;
|
||||||
|
let frame = if is_zero_sized_surface {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
if size_in_pixels[0] != self.surface_configuration.width
|
||||||
|
|| size_in_pixels[1] != self.surface_configuration.height
|
||||||
|
{
|
||||||
|
self.surface_configuration.width = size_in_pixels[0];
|
||||||
|
self.surface_configuration.height = size_in_pixels[1];
|
||||||
|
self.surface
|
||||||
|
.configure(&render_state.device, &self.surface_configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
let frame = match self.surface.get_current_texture() {
|
||||||
|
Ok(frame) => frame,
|
||||||
|
#[allow(clippy::single_match_else)]
|
||||||
|
Err(e) => match (*self.on_surface_error)(e) {
|
||||||
|
SurfaceErrorAction::RecreateSurface => {
|
||||||
|
self.surface
|
||||||
|
.configure(&render_state.device, &self.surface_configuration);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
SurfaceErrorAction::SkipFrame => {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
let renderer = render_state.renderer.read();
|
let renderer = render_state.renderer.read();
|
||||||
let frame_view = frame
|
let frame_view = frame
|
||||||
|
@ -195,6 +200,9 @@ impl WebPainter for WebPainterWgpu {
|
||||||
renderer.render(&mut render_pass, clipped_primitives, &screen_descriptor);
|
renderer.render(&mut render_pass, clipped_primitives, &screen_descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some(frame)
|
||||||
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut renderer = render_state.renderer.write();
|
let mut renderer = render_state.renderer.write();
|
||||||
for id in &textures_delta.free {
|
for id in &textures_delta.free {
|
||||||
|
@ -208,7 +216,10 @@ impl WebPainter for WebPainterWgpu {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.chain(std::iter::once(encoder.finish())),
|
.chain(std::iter::once(encoder.finish())),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if let Some(frame) = frame {
|
||||||
frame.present();
|
frame.present();
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue