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

This commit is contained in:
darkfi
2024-07-23 11:25:39 +02:00
parent fa6a4be257
commit df0c938ee4
8 changed files with 35 additions and 6 deletions

View File

@@ -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"] }

View File

@@ -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;
}

View File

@@ -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,
})
}
}

View File

@@ -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<DrawUpdate> {
@@ -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,
})
}

View File

@@ -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 })
}
}

View File

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

View File

@@ -16,6 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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<TextureId>,
pub freed_buffers: Vec<BufferId>,
}
pub struct OnModify<T> {

View File

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