From 41e275c7783369a3b209791bdda1e2715448075f Mon Sep 17 00:00:00 2001 From: ipc Date: Fri, 11 Aug 2023 15:48:45 +0200 Subject: [PATCH] implement ring buffer for gpu log --- src/lib.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 13b1f56..9b272da 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,8 @@ const FB_HEIGHT: u32 = 600; const WINDOW_WIDTH: u32 = 1024; const WINDOW_HEIGHT: u32 = 768; +const GPU_SCROLLBACK: usize = 128; + const TILE_SIZE: u32 = 16; #[derive(Debug)] @@ -41,9 +43,15 @@ trait Memory { fn write(&mut self, addr: u32, val: Store); } +struct RingBuffer { + buf: Vec, + len: usize, + head: usize, +} + struct Gui { window_open: bool, - gpu_log: Vec, + gpu_log: RingBuffer, } struct State { @@ -57,14 +65,48 @@ struct State { cpu: Cpu, } +impl RingBuffer { + fn new(len: usize) -> Self { + Self { + buf: Vec::new(), + len, + head: 0, + } + } + + fn push(&mut self, value: T) { + if self.head == self.len { + let len = self.len / 2; + let _ = self.buf.drain(..len).collect::>(); + self.head = len; + } + + if self.head >= self.buf.len() { + self.buf.push(value); + } else { + self.buf[self.head] = value; + } + + self.head += 1; + } + + fn vec(&mut self) -> &mut Vec { + &mut self.buf + } +} + impl Gui { fn new() -> Self { Self { window_open: true, - gpu_log: Vec::new(), + gpu_log: RingBuffer::new(GPU_SCROLLBACK), } } + fn log(&mut self, buf: Vec) { + buf.iter().for_each(|l| self.gpu_log.push(l.to_string())); + } + fn ui(&mut self, ctx: &Context, cpu: &Cpu) { egui::Window::new("regs") .open(&mut self.window_open) @@ -84,7 +126,7 @@ impl Gui { .open(&mut self.window_open) .constrain(true) .show(ctx, |ui| { - let mut log = self.gpu_log.join("\n"); + let mut log = self.gpu_log.vec().join("\n"); egui::ScrollArea::vertical() .stick_to_bottom(true) .show(ui, |ui| { @@ -255,7 +297,7 @@ impl State { }) .collect(); - self.gui.gpu_log.extend(log); + self.gui.log(log); self.gpu_clear(); }