Explorar el Código

wallet: fix panic caused by freeing textures/buffers before we updated the draw call.

darkfi hace 2 años
padre
commit
df0c938ee4

+ 1 - 2
bin/darkwallet/Cargo.toml

@@ -8,8 +8,7 @@ edition = "2021"
 [workspace]
 [workspace]
 
 
 [dependencies]
 [dependencies]
-#miniquad = { git = "https://github.com/not-fl3/miniquad" }
-miniquad = { git = "https://github.com/narodnik/miniquad" }
+miniquad = { git = "https://github.com/not-fl3/miniquad" }
 # Currently latest version links to freetype-sys 0.19 but we use 0.21
 # Currently latest version links to freetype-sys 0.19 but we use 0.21
 #harfbuzz-sys = "0.6.1"
 #harfbuzz-sys = "0.6.1"
 #harfbuzz-sys = { git = "https://github.com/servo/rust-harfbuzz", features = ["bundled"] }
 #harfbuzz-sys = { git = "https://github.com/servo/rust-harfbuzz", features = ["bundled"] }

+ 3 - 0
bin/darkwallet/src/gfx2.rs

@@ -358,6 +358,9 @@ impl<'a> RenderContext<'a> {
 
 
         // Reset view back again
         // Reset view back again
         if let Some(view) = prev_view {
         if let Some(view) = prev_view {
+            if DEBUG_RENDER {
+                debug!(target: "gfx", "{}reset viewport to {:?}", ws, view);
+            }
             self.apply_view(&view);
             self.apply_view(&view);
             self.current_view = view;
             self.current_view = view;
         }
         }

+ 4 - 0
bin/darkwallet/src/ui/chatview.rs

@@ -239,6 +239,8 @@ impl ChatView {
 
 
         let mut drawcalls = self.regen_mesh(rect.clone()).await;
         let mut drawcalls = self.regen_mesh(rect.clone()).await;
         // TODO: delete old buffers
         // TODO: delete old buffers
+        let mut freed_textures = vec![];
+        let mut freed_buffers = vec![];
 
 
         // Apply scroll and scissor
         // Apply scroll and scissor
         // We use the scissor for scrolling
         // We use the scissor for scrolling
@@ -258,6 +260,8 @@ impl ChatView {
                 self.dc_key,
                 self.dc_key,
                 DrawCall { instrs, dcs: vec![], z_index: self.z_index.get() },
                 DrawCall { instrs, dcs: vec![], z_index: self.z_index.get() },
             )],
             )],
+            freed_textures,
+            freed_buffers,
         })
         })
     }
     }
 }
 }

+ 14 - 3
bin/darkwallet/src/ui/editbox.rs

@@ -1189,6 +1189,12 @@ impl EditBox {
         };
         };
         self.render_api.replace_draw_calls(draw_update.draw_calls).await;
         self.render_api.replace_draw_calls(draw_update.draw_calls).await;
         debug!(target: "ui::editbox", "replace draw calls done");
         debug!(target: "ui::editbox", "replace draw calls done");
+        for buffer_id in draw_update.freed_buffers {
+            self.render_api.delete_buffer(buffer_id);
+        }
+        for texture_id in draw_update.freed_textures {
+            self.render_api.delete_texture(texture_id);
+        }
     }
     }
 
 
     pub async fn draw(&self, sg: &SceneGraph, parent_rect: &Rectangle) -> Option<DrawUpdate> {
     pub async fn draw(&self, sg: &SceneGraph, parent_rect: &Rectangle) -> Option<DrawUpdate> {
@@ -1211,11 +1217,14 @@ impl EditBox {
         let render_info = self.regen_mesh(rect.clone()).await;
         let render_info = self.regen_mesh(rect.clone()).await;
         let old_render_info =
         let old_render_info =
             std::mem::replace(&mut *self.render_info.lock().unwrap(), Some(render_info.clone()));
             std::mem::replace(&mut *self.render_info.lock().unwrap(), Some(render_info.clone()));
+
         // We're finished with these so clean up.
         // We're finished with these so clean up.
+        let mut freed_textures = vec![];
+        let mut freed_buffers = vec![];
         if let Some(old) = old_render_info {
         if let Some(old) = old_render_info {
-            self.render_api.delete_buffer(old.mesh.vertex_buffer);
-            self.render_api.delete_buffer(old.mesh.index_buffer);
-            self.render_api.delete_texture(old.texture_id);
+            freed_textures.push(old.texture_id);
+            freed_buffers.push(old.mesh.vertex_buffer);
+            freed_buffers.push(old.mesh.index_buffer);
         }
         }
 
 
         let mesh = DrawMesh {
         let mesh = DrawMesh {
@@ -1242,6 +1251,8 @@ impl EditBox {
                     z_index: self.z_index.get(),
                     z_index: self.z_index.get(),
                 },
                 },
             )],
             )],
+            freed_textures,
+            freed_buffers,
         })
         })
     }
     }
 
 

+ 6 - 1
bin/darkwallet/src/ui/layer.rs

@@ -131,6 +131,9 @@ impl RenderLayer {
 
 
         let mut draw_calls = vec![];
         let mut draw_calls = vec![];
         let mut child_calls = vec![];
         let mut child_calls = vec![];
+        let mut freed_textures = vec![];
+        let mut freed_buffers = vec![];
+
         for child_inf in node.get_children2() {
         for child_inf in node.get_children2() {
             let node = sg.get_node(child_inf.id).unwrap();
             let node = sg.get_node(child_inf.id).unwrap();
 
 
@@ -148,6 +151,8 @@ impl RenderLayer {
             let Some(mut draw_update) = dcs else { continue };
             let Some(mut draw_update) = dcs else { continue };
             draw_calls.append(&mut draw_update.draw_calls);
             draw_calls.append(&mut draw_update.draw_calls);
             child_calls.push(draw_update.key);
             child_calls.push(draw_update.key);
+            freed_textures.append(&mut draw_update.freed_textures);
+            freed_buffers.append(&mut draw_update.freed_buffers);
         }
         }
 
 
         let dc = DrawCall {
         let dc = DrawCall {
@@ -156,7 +161,7 @@ impl RenderLayer {
             z_index: 0,
             z_index: 0,
         };
         };
         draw_calls.push((self.dc_key, dc));
         draw_calls.push((self.dc_key, dc));
-        Some(DrawUpdate { key: self.dc_key, draw_calls })
+        Some(DrawUpdate { key: self.dc_key, draw_calls, freed_textures, freed_buffers })
     }
     }
 }
 }
 
 

+ 2 - 0
bin/darkwallet/src/ui/mesh.rs

@@ -145,6 +145,8 @@ impl Mesh {
                     z_index: self.z_index.get(),
                     z_index: self.z_index.get(),
                 },
                 },
             )],
             )],
+            freed_textures: vec![],
+            freed_buffers: vec![],
         })
         })
     }
     }
 }
 }

+ 3 - 0
bin/darkwallet/src/ui/mod.rs

@@ -16,6 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
  */
 
 
+use miniquad::{BufferId, TextureId};
 use std::sync::{Arc, Weak};
 use std::sync::{Arc, Weak};
 
 
 use crate::{
 use crate::{
@@ -46,6 +47,8 @@ pub trait Stoppable {
 pub struct DrawUpdate {
 pub struct DrawUpdate {
     pub key: u64,
     pub key: u64,
     pub draw_calls: Vec<(u64, DrawCall)>,
     pub draw_calls: Vec<(u64, DrawCall)>,
+    pub freed_textures: Vec<TextureId>,
+    pub freed_buffers: Vec<BufferId>,
 }
 }
 
 
 pub struct OnModify<T> {
 pub struct OnModify<T> {

+ 2 - 0
bin/darkwallet/src/ui/text.rs

@@ -234,6 +234,8 @@ impl Text {
                     z_index: self.z_index.get(),
                     z_index: self.z_index.get(),
                 },
                 },
             )],
             )],
+            freed_textures: vec![],
+            freed_buffers: vec![],
         })
         })
     }
     }
 }
 }