mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-04-28 03:00:18 -04:00
wallet: fix panic caused by freeing textures/buffers before we updated the draw call.
This commit is contained in:
@@ -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"] }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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 })
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -145,6 +145,8 @@ impl Mesh {
|
||||
z_index: self.z_index.get(),
|
||||
},
|
||||
)],
|
||||
freed_textures: vec![],
|
||||
freed_buffers: vec![],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -234,6 +234,8 @@ impl Text {
|
||||
z_index: self.z_index.get(),
|
||||
},
|
||||
)],
|
||||
freed_textures: vec![],
|
||||
freed_buffers: vec![],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user