diff --git a/bin/darkwallet/Cargo.toml b/bin/darkwallet/Cargo.toml index e76f5df43..f45370968 100644 --- a/bin/darkwallet/Cargo.toml +++ b/bin/darkwallet/Cargo.toml @@ -8,8 +8,7 @@ edition = "2021" [workspace] [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 #harfbuzz-sys = "0.6.1" #harfbuzz-sys = { git = "https://github.com/servo/rust-harfbuzz", features = ["bundled"] } diff --git a/bin/darkwallet/src/gfx2.rs b/bin/darkwallet/src/gfx2.rs index 69be4687a..98f9f22ba 100644 --- a/bin/darkwallet/src/gfx2.rs +++ b/bin/darkwallet/src/gfx2.rs @@ -358,6 +358,9 @@ impl<'a> RenderContext<'a> { // Reset view back again if let Some(view) = prev_view { + if DEBUG_RENDER { + debug!(target: "gfx", "{}reset viewport to {:?}", ws, view); + } self.apply_view(&view); self.current_view = view; } diff --git a/bin/darkwallet/src/ui/chatview.rs b/bin/darkwallet/src/ui/chatview.rs index 41184ca69..62f69bc52 100644 --- a/bin/darkwallet/src/ui/chatview.rs +++ b/bin/darkwallet/src/ui/chatview.rs @@ -239,6 +239,8 @@ impl ChatView { let mut drawcalls = self.regen_mesh(rect.clone()).await; // TODO: delete old buffers + let mut freed_textures = vec![]; + let mut freed_buffers = vec![]; // Apply scroll and scissor // We use the scissor for scrolling @@ -258,6 +260,8 @@ impl ChatView { self.dc_key, DrawCall { instrs, dcs: vec![], z_index: self.z_index.get() }, )], + freed_textures, + freed_buffers, }) } } diff --git a/bin/darkwallet/src/ui/editbox.rs b/bin/darkwallet/src/ui/editbox.rs index 475389131..25f78f778 100644 --- a/bin/darkwallet/src/ui/editbox.rs +++ b/bin/darkwallet/src/ui/editbox.rs @@ -1189,6 +1189,12 @@ impl EditBox { }; self.render_api.replace_draw_calls(draw_update.draw_calls).await; 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 { @@ -1211,11 +1217,14 @@ impl EditBox { let render_info = self.regen_mesh(rect.clone()).await; let old_render_info = std::mem::replace(&mut *self.render_info.lock().unwrap(), Some(render_info.clone())); + // 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 { - 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 { @@ -1242,6 +1251,8 @@ impl EditBox { z_index: self.z_index.get(), }, )], + freed_textures, + freed_buffers, }) } diff --git a/bin/darkwallet/src/ui/layer.rs b/bin/darkwallet/src/ui/layer.rs index 5c8caee1f..45e4d1f41 100644 --- a/bin/darkwallet/src/ui/layer.rs +++ b/bin/darkwallet/src/ui/layer.rs @@ -131,6 +131,9 @@ impl RenderLayer { let mut draw_calls = vec![]; let mut child_calls = vec![]; + let mut freed_textures = vec![]; + let mut freed_buffers = vec![]; + for child_inf in node.get_children2() { let node = sg.get_node(child_inf.id).unwrap(); @@ -148,6 +151,8 @@ impl RenderLayer { let Some(mut draw_update) = dcs else { continue }; draw_calls.append(&mut draw_update.draw_calls); 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 { @@ -156,7 +161,7 @@ impl RenderLayer { z_index: 0, }; 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 }) } } diff --git a/bin/darkwallet/src/ui/mesh.rs b/bin/darkwallet/src/ui/mesh.rs index 1847652d4..d1b2f917f 100644 --- a/bin/darkwallet/src/ui/mesh.rs +++ b/bin/darkwallet/src/ui/mesh.rs @@ -145,6 +145,8 @@ impl Mesh { z_index: self.z_index.get(), }, )], + freed_textures: vec![], + freed_buffers: vec![], }) } } diff --git a/bin/darkwallet/src/ui/mod.rs b/bin/darkwallet/src/ui/mod.rs index 393cf4ff8..c93ac52b7 100644 --- a/bin/darkwallet/src/ui/mod.rs +++ b/bin/darkwallet/src/ui/mod.rs @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +use miniquad::{BufferId, TextureId}; use std::sync::{Arc, Weak}; use crate::{ @@ -46,6 +47,8 @@ pub trait Stoppable { pub struct DrawUpdate { pub key: u64, pub draw_calls: Vec<(u64, DrawCall)>, + pub freed_textures: Vec, + pub freed_buffers: Vec, } pub struct OnModify { diff --git a/bin/darkwallet/src/ui/text.rs b/bin/darkwallet/src/ui/text.rs index 66b6fd68e..1a26fffaf 100644 --- a/bin/darkwallet/src/ui/text.rs +++ b/bin/darkwallet/src/ui/text.rs @@ -234,6 +234,8 @@ impl Text { z_index: self.z_index.get(), }, )], + freed_textures: vec![], + freed_buffers: vec![], }) } }