Skip to content

Commit

Permalink
wallet: for draw calls add a trace_id used to correlate draw() trace!…
Browse files Browse the repository at this point in the history
…() logs
  • Loading branch information
darkfi committed Jan 18, 2025
1 parent 7fa7015 commit fe391b8
Show file tree
Hide file tree
Showing 11 changed files with 93 additions and 80 deletions.
2 changes: 1 addition & 1 deletion bin/darkwallet/src/ui/button.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ impl UIObject for Button {
self.priority.get()
}

async fn draw(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
async fn draw(&self, parent_rect: Rectangle, trace_id: u32) -> Option<DrawUpdate> {
let _ = self.rect.eval(&parent_rect);
None
}
Expand Down
19 changes: 9 additions & 10 deletions bin/darkwallet/src/ui/chatedit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,7 @@ impl ChatEdit {
}

/// Called whenever the text or any text property changes.
fn regen_text_mesh(&self) -> GfxDrawMesh {
fn regen_text_mesh(&self, trace_id: u32) -> GfxDrawMesh {
let is_focused = self.is_focused.get();
let text = self.text.get();
let font_size = self.font_size.get();
Expand Down Expand Up @@ -734,15 +734,13 @@ impl ChatEdit {
);

let mut clip = self.rect.get();
//debug!(target: "ui::chatedit", "Rendering text '{text}' rect={clip:?} width={width}");
t!("Rendering text '{text}' rect={clip:?} width={width} [trace_id={trace_id}]");
clip.x = 0.;
clip.y = 0.;

let mut mesh = MeshBuilder::with_clip(clip.clone());
let mut curr_y = -scroll;

//debug!(target: "ui::chatedit", "regen_text_mesh() selections={selections:?}");

for (line_idx, wrap_line) in wrapped_lines.lines.iter().enumerate() {
// Instead of bools, maybe we should have a GlyphStyle enum
let select_marks = self.mark_selected_glyphs(&wrap_line, &selections);
Expand Down Expand Up @@ -1710,9 +1708,10 @@ impl ChatEdit {
}

async fn redraw(&self) {
let trace_id = rand::random();
let timest = unixtime();
t!("redraw()");
let Some(draw_update) = self.make_draw_calls() else {
let Some(draw_update) = self.make_draw_calls(trace_id) else {
error!(target: "ui::chatedit", "Text failed to draw");
return;
};
Expand Down Expand Up @@ -1762,8 +1761,8 @@ impl ChatEdit {
cursor_instrs
}

fn make_draw_calls(&self) -> Option<DrawUpdate> {
let text_mesh = self.regen_text_mesh();
fn make_draw_calls(&self, trace_id: u32) -> Option<DrawUpdate> {
let text_mesh = self.regen_text_mesh(trace_id);
let cursor_instrs = self.get_cursor_instrs();

let rect = self.rect.get();
Expand Down Expand Up @@ -1942,11 +1941,11 @@ impl UIObject for ChatEdit {
self.tasks.set(tasks);
}

async fn draw(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
t!("ChatEdit::draw({:?})", self.node.upgrade().unwrap());
async fn draw(&self, parent_rect: Rectangle, trace_id: u32) -> Option<DrawUpdate> {
t!("ChatEdit::draw({:?}, {trace_id})", self.node.upgrade().unwrap());
*self.parent_rect.lock() = Some(parent_rect);

self.make_draw_calls()
self.make_draw_calls(trace_id)
}

async fn handle_char(&self, key: char, mods: KeyMods, repeat: bool) -> bool {
Expand Down
53 changes: 30 additions & 23 deletions bin/darkwallet/src/ui/chatview/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,8 @@ impl ChatView {

/// Mark line as selected
async fn select_line(&self, mut y: f32) {
let trace_id = rand::random();
t!("select_line({y}) [trace_id={trace_id}]");
// The cursor is inside the rect. We just have to find which line it clicked.
let rect = self.rect.get();

Expand All @@ -363,7 +365,7 @@ impl ChatView {
let mut msgbuf = self.msgbuf.lock().await;
msgbuf.select_line(y).await;

self.redraw_cached(&mut msgbuf).await;
self.redraw_cached(&mut msgbuf, trace_id).await;
}

fn end_touch_phase(&self, touch_y: f32) {
Expand Down Expand Up @@ -434,7 +436,8 @@ impl ChatView {
nick: String,
text: String,
) {
t!("handle_insert_line({timest}, {msg_id}, {nick}, {text})");
let trace_id = rand::random();
t!("handle_insert_line({timest}, {msg_id}, {nick}, {text}) [trace_id={trace_id}]");

// Lock message buffer so background loader doesn't load the message as soon as it's
// inserted into the DB.
Expand All @@ -460,7 +463,7 @@ impl ChatView {
}
}

self.redraw_cached(&mut msgbuf).await;
self.redraw_cached(&mut msgbuf, trace_id).await;
self.bgload_cv.notify();
}
async fn handle_insert_unconf_line(
Expand All @@ -470,15 +473,16 @@ impl ChatView {
nick: String,
text: String,
) {
t!("handle_insert_unconf_line({timest}, {msg_id}, {nick}, {text})");
let trace_id = rand::random();
t!("handle_insert_unconf_line({timest}, {msg_id}, {nick}, {text}) [trace_id={trace_id}]");

// We don't add unconfirmed lines to the db. Maybe we should?

// Add message to page
let mut msgbuf = self.msgbuf.lock().await;
let Some(privmsg) = msgbuf.insert_privmsg(timest, msg_id, nick, text) else { return };
privmsg.confirmed = false;
self.redraw_cached(&mut msgbuf).await;
self.redraw_cached(&mut msgbuf, trace_id).await;
self.bgload_cv.notify();
}

Expand Down Expand Up @@ -527,7 +531,8 @@ impl ChatView {
}

async fn handle_bgload(&self) {
t!("ChatView::handle_bgload()");
let trace_id = rand::random();
t!("ChatView::handle_bgload() [trace_id={trace_id}]");
// Do we need to load some more?
let scroll = self.scroll.get();
let rect = self.rect.get();
Expand All @@ -540,20 +545,20 @@ impl ChatView {
let total_height = msgbuf.calc_total_height().await;
if total_height > top + preload_height {
// Nothing to do here
t!("bgloader: buffer is sufficient");
t!("bgloader: buffer is sufficient [trace_id={trace_id}]");
return
}

// Keep loading until this is below 0
let mut remaining_load_height = top + preload_height - total_height;
let mut remaining_visible = top - total_height;
t!("bgloader: remaining px = {remaining_load_height}, remaining_visible={remaining_visible}");
t!("bgloader: remaining px = {remaining_load_height}, remaining_visible={remaining_visible} [trace_id={trace_id}]");

// Get the current earliest timestamp
let iter = match msgbuf.oldest_timestamp() {
Some(oldest_timest) => {
// iterate from there
t!("preloading from {oldest_timest}");
t!("preloading from {oldest_timest} [trace_id={trace_id}]");
let timest = (oldest_timest - 1).to_be_bytes();
let mut key = [0u8; 8 + 32];
key[..8].clone_from_slice(&timest);
Expand All @@ -562,7 +567,7 @@ impl ChatView {
iter
}
None => {
t!("initial load");
t!("initial load [trace_id={trace_id}]");
self.tree.iter().rev()
}
};
Expand All @@ -576,7 +581,7 @@ impl ChatView {
let timest = Timestamp::from_be_bytes(timest_bytes);
let chatmsg: ChatMsg = deserialize(&v).unwrap();

t!("{timest:?} {chatmsg:?}");
t!("{timest:?} {chatmsg:?} [trace_id={trace_id}]");
let msg_height = msgbuf.push_privmsg(timest, msg_id, chatmsg.nick, chatmsg.text);

remaining_load_height -= msg_height;
Expand All @@ -590,14 +595,15 @@ impl ChatView {
}
remaining_visible -= msg_height;
}
t!("do_redraw = {do_redraw}");
t!("do_redraw = {do_redraw} [trace_id={trace_id}]");
if do_redraw {
self.redraw_cached(&mut msgbuf).await;
self.redraw_cached(&mut msgbuf, trace_id).await;
}
}

async fn scrollview(&self, mut scroll: f32) -> f32 {
t!("scrollview()");
let trace_id = rand::random();
t!("scrollview({scroll}) [trace_id={trace_id}]");
let old_scroll = self.scroll.get();

let rect = self.rect.get();
Expand All @@ -610,7 +616,7 @@ impl ChatView {
}

// 2/3 of time spent here ~3.3ms
self.redraw_cached(&mut msgbuf).await;
self.redraw_cached(&mut msgbuf, trace_id).await;

self.scroll.set(scroll);
self.bgload_cv.notify();
Expand Down Expand Up @@ -683,8 +689,8 @@ impl ChatView {
instrs
}

async fn redraw_cached(&self, msgbuf: &mut MessageBuffer) {
t!("ChatView::redraw_cached()");
async fn redraw_cached(&self, msgbuf: &mut MessageBuffer, trace_id: u32) {
t!("ChatView::redraw_cached() [trace_id={trace_id}]");
let timest = unixtime();
let rect = self.rect.get();

Expand All @@ -697,20 +703,21 @@ impl ChatView {
vec![(self.dc_key, GfxDrawCall { instrs, dcs: vec![], z_index: self.z_index.get() })];

self.render_api.replace_draw_calls(timest, draw_calls);
t!("ChatView::redraw_cached() DONE");
t!("ChatView::redraw_cached() DONE [trace_id={trace_id}]");
}

/// Invalidates cache and redraws everything
async fn redraw_all(&self) {
t!("ChatView::redraw_all()");
let trace_id = rand::random();
t!("ChatView::redraw_all() [trace_id={trace_id}]");
let parent_rect = self.parent_rect.lock().unwrap().unwrap().clone();
self.rect.eval(&parent_rect).expect("unable to eval rect");

let mut msgbuf = self.msgbuf.lock().await;
msgbuf.adjust_params();
msgbuf.clear_meshes();
self.redraw_cached(&mut msgbuf).await;
t!("ChatView::redraw_all() DONE");
self.redraw_cached(&mut msgbuf, trace_id).await;
t!("ChatView::redraw_all() DONE [trace_id={trace_id}]");
}
}

Expand Down Expand Up @@ -800,8 +807,8 @@ impl UIObject for ChatView {
self.tasks.set(tasks);
}

async fn draw(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
t!("ChatView::draw({:?})", self.node.upgrade().unwrap());
async fn draw(&self, parent_rect: Rectangle, trace_id: u32) -> Option<DrawUpdate> {
t!("ChatView::draw({:?}, {trace_id})", self.node.upgrade().unwrap());

*self.parent_rect.lock().unwrap() = Some(parent_rect.clone());
self.rect.eval(&parent_rect).ok()?;
Expand Down
4 changes: 2 additions & 2 deletions bin/darkwallet/src/ui/editbox/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1330,8 +1330,8 @@ impl UIObject for EditBox {
self.tasks.set(tasks);
}

async fn draw(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
t!("EditBox::draw()");
async fn draw(&self, parent_rect: Rectangle, trace_id: u32) -> Option<DrawUpdate> {
t!("EditBox::draw() [trace_id={trace_id}]");
*self.parent_rect.lock().unwrap() = Some(parent_rect);
self.rect.eval(&parent_rect).ok()?;

Expand Down
11 changes: 6 additions & 5 deletions bin/darkwallet/src/ui/emoji_picker/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,18 +247,19 @@ impl EmojiPicker {
}

fn redraw(&self) {
let trace_id = rand::random();
let timest = unixtime();
let Some(parent_rect) = self.parent_rect.lock().unwrap().clone() else { return };

let Some(draw_update) = self.get_draw_calls(parent_rect) else {
let Some(draw_update) = self.get_draw_calls(parent_rect, trace_id) else {
error!(target: "ui::emoji_picker", "Emoji picker failed to draw");
return;
};
self.render_api.replace_draw_calls(timest, draw_update.draw_calls);
t!("replace draw calls done");
}

fn get_draw_calls(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
fn get_draw_calls(&self, parent_rect: Rectangle, trace_id: u32) -> Option<DrawUpdate> {
if let Err(e) = self.rect.eval(&parent_rect) {
warn!(target: "ui::emoji_picker", "Rect eval failed: {e}");
return None
Expand Down Expand Up @@ -330,10 +331,10 @@ impl UIObject for EmojiPicker {
self.tasks.set(on_modify.tasks);
}

async fn draw(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
t!("EmojiPicker::draw()");
async fn draw(&self, parent_rect: Rectangle, trace_id: u32) -> Option<DrawUpdate> {
t!("EmojiPicker::draw({parent_rect:?}, {trace_id})");
*self.parent_rect.lock().unwrap() = Some(parent_rect);
self.get_draw_calls(parent_rect)
self.get_draw_calls(parent_rect, trace_id)
}

async fn handle_mouse_move(&self, mut mouse_pos: Point) -> bool {
Expand Down
14 changes: 8 additions & 6 deletions bin/darkwallet/src/ui/image.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,15 +131,17 @@ impl Image {
}

async fn redraw(self: Arc<Self>) {
let trace_id = rand::random();
let timest = unixtime();
t!("redraw({:?}) [trace_id={trace_id}]", self.node.upgrade().unwrap());
let Some(parent_rect) = self.parent_rect.lock().unwrap().clone() else { return };

let Some(draw_update) = self.get_draw_calls(parent_rect).await else {
let Some(draw_update) = self.get_draw_calls(parent_rect, trace_id).await else {
error!(target: "ui::image", "Image failed to draw");
return;
};
self.render_api.replace_draw_calls(timest, draw_update.draw_calls);
t!("replace draw calls done");
t!("redraw() DONE [trace_id={trace_id}]");
}

/// Called whenever any property changes.
Expand All @@ -152,7 +154,7 @@ impl Image {
mesh.alloc(&self.render_api)
}

async fn get_draw_calls(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
async fn get_draw_calls(&self, parent_rect: Rectangle, _: u32) -> Option<DrawUpdate> {
self.rect.eval(&parent_rect).ok()?;
let rect = self.rect.get();
self.uv.eval(&rect).ok()?;
Expand Down Expand Up @@ -202,10 +204,10 @@ impl UIObject for Image {
self.tasks.set(on_modify.tasks);
}

async fn draw(&self, parent_rect: Rectangle) -> Option<DrawUpdate> {
t!("Image::draw()");
async fn draw(&self, parent_rect: Rectangle, trace_id: u32) -> Option<DrawUpdate> {
t!("Image::draw() [trace_id={trace_id}]");
*self.parent_rect.lock().unwrap() = Some(parent_rect);
self.get_draw_calls(parent_rect).await
self.get_draw_calls(parent_rect, trace_id).await
}
}

Expand Down
Loading

0 comments on commit fe391b8

Please sign in to comment.