Преглед изворни кода

app/gfx: in RenderApi::replace_draw_calls() make the batch_id optional. None makes the op immediate.

jkds пре 6 месеци
родитељ
комит
102bde547e

+ 6 - 5
bin/app/src/gfx/api.rs

@@ -246,7 +246,7 @@ impl RenderApi {
         self.send_with_epoch(method, epoch);
     }
 
-    pub fn replace_draw_calls(&self, batch_id: BatchGuardId, dcs: Vec<(DcId, DrawCall)>) {
+    pub fn replace_draw_calls(&self, batch_id: Option<BatchGuardId>, dcs: Vec<(DcId, DrawCall)>) {
         let method = GraphicsMethod::ReplaceGfxDrawCalls { batch_id, dcs };
         self.send(method);
 
@@ -290,7 +290,7 @@ pub enum GraphicsMethod {
     NewSeqAnim { id: AnimId, frames_len: usize, oneshot: bool, tag: DebugTag },
     UpdateSeqAnim { id: AnimId, frame_idx: usize, frame: AnimFrame, tag: DebugTag },
     DeleteSeqAnim((AnimId, DebugTag)),
-    ReplaceGfxDrawCalls { batch_id: BatchGuardId, dcs: Vec<(DcId, DrawCall)> },
+    ReplaceGfxDrawCalls { batch_id: Option<BatchGuardId>, dcs: Vec<(DcId, DrawCall)> },
     StartBatch { batch_id: BatchGuardId, tag: DebugTag },
     EndBatch { batch_id: BatchGuardId, timest: u64 },
     Noop,
@@ -307,9 +307,10 @@ impl std::fmt::Debug for GraphicsMethod {
             Self::NewSeqAnim { .. } => write!(f, "NewSeqAnim"),
             Self::UpdateSeqAnim { .. } => write!(f, "UpdateSeqAnim"),
             Self::DeleteSeqAnim(_) => write!(f, "DeleteSeqAnim"),
-            Self::ReplaceGfxDrawCalls { batch_id: bid, dcs: _ } => {
-                write!(f, "ReplaceGfxDrawCalls({bid})")
-            }
+            Self::ReplaceGfxDrawCalls { batch_id, dcs: _ } => match batch_id {
+                Some(bid) => write!(f, "ReplaceGfxDrawCalls({bid})"),
+                None => write!(f, "ReplaceGfxDrawCalls(immediate)"),
+            },
             Self::StartBatch { batch_id, tag } => write!(f, "StartBatch({batch_id}, {tag:?})"),
             Self::EndBatch { batch_id, timest } => write!(f, "EndBatch({batch_id}, {timest})"),
             Self::Noop => write!(f, "Noop"),

+ 24 - 12
bin/app/src/gfx/mod.rs

@@ -714,18 +714,28 @@ impl Stage {
                 self.method_update_anim(*id, *frame_idx, frame.clone())
             }
             GraphicsMethod::DeleteSeqAnim((ganim_id, _)) => self.method_delete_anim(*ganim_id),
-            GraphicsMethod::ReplaceGfxDrawCalls { batch_id, .. } => {
-                //let debug_strs: Vec<_> = dcs.iter().map(|(_, dc)| dc.debug_str).collect();
-                //t!("Commit dc to {batch_id}: {debug_strs:?}");
-                if self.dropped_batches.contains(batch_id) {
-                    t!("Discarding ReplaceGfxDrawCalls from dropped {batch_id}");
-                    return
+            GraphicsMethod::ReplaceGfxDrawCalls { batch_id, ref mut dcs } => {
+                match batch_id {
+                    Some(bid) => {
+                        //let debug_strs: Vec<_> = dcs.iter().map(|(_, dc)| dc.debug_str).collect();
+                        //t!("Commit dc to {bid}: {debug_strs:?}");
+                        if self.dropped_batches.contains(&bid) {
+                            t!("Discarding ReplaceGfxDrawCalls from dropped {bid}");
+                            return
+                        }
+                        let Some(batch) = self.pending_batches.get_mut(&bid) else {
+                            panic!("unknown batch {bid}")
+                        };
+                        let method = std::mem::take(&mut method);
+                        batch.push(method);
+                    }
+                    None => {
+                        // Process immediately without batching
+                        let timest = unixtime();
+                        let dcs = std::mem::take(dcs);
+                        self.method_replace_draw_calls(timest, dcs);
+                    }
                 }
-                let Some(batch) = self.pending_batches.get_mut(batch_id) else {
-                    panic!("unknown batch {batch_id}")
-                };
-                let method = std::mem::take(&mut method);
-                batch.push(method);
                 if DEBUG_TRAX {
                     get_trax().lock().put_stat(0);
                 }
@@ -975,7 +985,9 @@ impl Stage {
                 //trax.del_buf(epoch, *gbuff_id, *tag, *buftype);
             }
             GraphicsMethod::ReplaceGfxDrawCalls { batch_id, dcs } => {
-                trax.put_dcs(epoch, *batch_id, dcs);
+                if let Some(bid) = batch_id {
+                    trax.put_dcs(epoch, *bid, dcs);
+                }
             }
             GraphicsMethod::StartBatch { batch_id, tag } => {
                 trax.put_start_batch(epoch, *batch_id, *tag);

+ 3 - 2
bin/app/src/ui/chatview/mod.rs

@@ -787,7 +787,7 @@ impl ChatView {
         let draw_calls =
             vec![(self.dc_key, DrawCall::new(instrs, vec![], self.z_index.get(), "chatview"))];
 
-        self.render_api.replace_draw_calls(batch_id, draw_calls);
+        self.render_api.replace_draw_calls(Some(batch_id), draw_calls);
     }
 
     /// Invalidates cache and redraws everything
@@ -1195,7 +1195,8 @@ impl UIObject for ChatView {
 impl Drop for ChatView {
     fn drop(&mut self) {
         let atom = self.render_api.make_guard(gfxtag!("ChatView::drop"));
-        self.render_api.replace_draw_calls(atom.batch_id, vec![(self.dc_key, Default::default())]);
+        self.render_api
+            .replace_draw_calls(Some(atom.batch_id), vec![(self.dc_key, Default::default())]);
     }
 }
 

+ 1 - 1
bin/app/src/ui/edit/action.rs

@@ -175,6 +175,6 @@ impl ActionMode {
     pub fn redraw(&self, batch_id: BatchGuardId) {
         let dcs =
             vec![(self.dc_key, DrawCall::new(self.get_instrs(), vec![], 1, "chatedit_action"))];
-        self.render_api.replace_draw_calls(batch_id, dcs);
+        self.render_api.replace_draw_calls(Some(batch_id), dcs);
     }
 }

+ 5 - 5
bin/app/src/ui/edit/mod.rs

@@ -1034,7 +1034,7 @@ impl BaseEdit {
     #[instrument(target = "ui::edit")]
     fn redraw(&self, atom: &mut PropertyAtomicGuard) {
         let draw_update = self.make_draw_calls();
-        self.render_api.replace_draw_calls(atom.batch_id, draw_update.draw_calls);
+        self.render_api.replace_draw_calls(Some(atom.batch_id), draw_update.draw_calls);
     }
 
     /// Called when scroll changes. Moves content up or down. Nothing more.
@@ -1060,13 +1060,13 @@ impl BaseEdit {
                 "chatedit_content",
             ),
         )];
-        self.render_api.replace_draw_calls(batch_id, draw_main);
+        self.render_api.replace_draw_calls(Some(batch_id), draw_main);
     }
 
     fn redraw_cursor(&self, batch_id: BatchGuardId) {
         let instrs = self.get_cursor_instrs();
         let draw_calls = vec![(self.cursor_dc_key, DrawCall::new(instrs, vec![], 2, "curs_redr"))];
-        self.render_api.replace_draw_calls(batch_id, draw_calls);
+        self.render_api.replace_draw_calls(Some(batch_id), draw_calls);
     }
 
     fn redraw_select(&self, batch_id: BatchGuardId) {
@@ -1080,7 +1080,7 @@ impl BaseEdit {
                 DrawCall::new(phone_sel_instrs, vec![], 1, "chatedit_phone_sel_redraw_sel"),
             ),
         ];
-        self.render_api.replace_draw_calls(batch_id, draw_calls);
+        self.render_api.replace_draw_calls(Some(batch_id), draw_calls);
     }
 
     fn get_cursor_instrs(&self) -> Vec<DrawInstruction> {
@@ -1381,7 +1381,7 @@ impl Drop for BaseEdit {
     fn drop(&mut self) {
         let atom = self.render_api.make_guard(gfxtag!("BaseEdit::drop"));
         self.render_api
-            .replace_draw_calls(atom.batch_id, vec![(self.text_dc_key, Default::default())]);
+            .replace_draw_calls(Some(atom.batch_id), vec![(self.text_dc_key, Default::default())]);
     }
 }
 

+ 3 - 2
bin/app/src/ui/emoji_picker/mod.rs

@@ -190,7 +190,7 @@ impl EmojiPicker {
             error!(target: "ui:emoji_picker", "Emoji picker failed to draw");
             return
         };
-        self.render_api.replace_draw_calls(atom.batch_id, draw_update.draw_calls);
+        self.render_api.replace_draw_calls(Some(atom.batch_id), draw_update.draw_calls);
     }
 
     fn get_draw_calls(
@@ -384,7 +384,8 @@ impl UIObject for EmojiPicker {
 impl Drop for EmojiPicker {
     fn drop(&mut self) {
         let atom = self.render_api.make_guard(gfxtag!("EmojiPicker::drop"));
-        self.render_api.replace_draw_calls(atom.batch_id, vec![(self.dc_key, Default::default())]);
+        self.render_api
+            .replace_draw_calls(Some(atom.batch_id), vec![(self.dc_key, Default::default())]);
     }
 }
 

+ 3 - 2
bin/app/src/ui/image.rs

@@ -128,7 +128,7 @@ impl Image {
             error!(target: "ui::image", "Image failed to draw");
             return
         };
-        self.render_api.replace_draw_calls(batch.id, draw_update.draw_calls);
+        self.render_api.replace_draw_calls(Some(batch.id), draw_update.draw_calls);
     }
 
     /// Called whenever any property changes.
@@ -217,7 +217,8 @@ impl UIObject for Image {
 impl Drop for Image {
     fn drop(&mut self) {
         let atom = self.render_api.make_guard(gfxtag!("Image::drop"));
-        self.render_api.replace_draw_calls(atom.batch_id, vec![(self.dc_key, Default::default())]);
+        self.render_api
+            .replace_draw_calls(Some(atom.batch_id), vec![(self.dc_key, Default::default())]);
     }
 }
 

+ 1 - 1
bin/app/src/ui/layer.rs

@@ -95,7 +95,7 @@ impl Layer {
             error!(target: "ui:layer", "Layer failed to draw");
             return
         };
-        self.render_api.replace_draw_calls(batch.id, draw_update.draw_calls);
+        self.render_api.replace_draw_calls(Some(batch.id), draw_update.draw_calls);
     }
 
     async fn get_draw_calls(

+ 4 - 4
bin/app/src/ui/menu.rs

@@ -309,10 +309,10 @@ impl Menu {
         let atom = &mut batch.spawn();
         let Some(draw_update) = self.get_draw_calls(atom, parent_rect) else { return };
 
-        self.render_api.replace_draw_calls(atom.batch_id, draw_update.draw_calls);
+        self.render_api.replace_draw_calls(Some(atom.batch_id), draw_update.draw_calls);
     }
 
-    fn redraw_scroll(&self, batch_id: BatchGuardId) {
+    fn redraw_scroll(&self) {
         let rect = self.rect.get();
         let scroll = self.scroll.get();
 
@@ -328,7 +328,7 @@ impl Menu {
         };
 
         let draw_calls = vec![(self.root_dc_key, root_dc)];
-        self.render_api.replace_draw_calls(batch_id, draw_calls);
+        self.render_api.replace_draw_calls(None, draw_calls);
     }
 
     fn scrollview(&self, scroll: f32, atom: &mut PropertyAtomicGuard) {
@@ -345,7 +345,7 @@ impl Menu {
         self.scroll.set(atom, scroll);
 
         // Only update root draw call with new scroll position
-        self.redraw_scroll(atom.batch_id);
+        self.redraw_scroll();
     }
 
     fn start_scroll(&self, delta: f32) {

+ 3 - 2
bin/app/src/ui/text.rs

@@ -144,7 +144,7 @@ impl Text {
             error!(target: "ui::text", "Text failed to draw");
             return
         };
-        self.render_api.replace_draw_calls(batch.id, draw_update.draw_calls);
+        self.render_api.replace_draw_calls(Some(batch.id), draw_update.draw_calls);
     }
 
     fn get_draw_calls(
@@ -219,7 +219,8 @@ impl UIObject for Text {
 impl Drop for Text {
     fn drop(&mut self) {
         let atom = self.render_api.make_guard(gfxtag!("Text::drop"));
-        self.render_api.replace_draw_calls(atom.batch_id, vec![(self.dc_key, Default::default())]);
+        self.render_api
+            .replace_draw_calls(Some(atom.batch_id), vec![(self.dc_key, Default::default())]);
     }
 }
 

+ 3 - 2
bin/app/src/ui/vector_art/mod.rs

@@ -91,7 +91,7 @@ impl VectorArt {
             error!(target: "ui:vector_art", "Mesh failed to draw");
             return
         };
-        self.render_api.replace_draw_calls(batch.id, draw_update.draw_calls);
+        self.render_api.replace_draw_calls(Some(batch.id), draw_update.draw_calls);
     }
 
     fn get_draw_instrs(&self) -> Vec<DrawInstruction> {
@@ -169,7 +169,8 @@ impl UIObject for VectorArt {
 impl Drop for VectorArt {
     fn drop(&mut self) {
         let atom = self.render_api.make_guard(gfxtag!("VectorArt::drop"));
-        self.render_api.replace_draw_calls(atom.batch_id, vec![(self.dc_key, Default::default())]);
+        self.render_api
+            .replace_draw_calls(Some(atom.batch_id), vec![(self.dc_key, Default::default())]);
     }
 }
 

+ 3 - 2
bin/app/src/ui/vid/mod.rs

@@ -150,7 +150,7 @@ impl Video {
             error!(target: "ui:video", "Video failed to draw");
             return
         };
-        self.render_api.replace_draw_calls(batch.id, draw_update.draw_calls);
+        self.render_api.replace_draw_calls(Some(batch.id), draw_update.draw_calls);
     }
 
     fn regen_mesh(&self) -> MeshInfo {
@@ -306,7 +306,8 @@ impl UIObject for Video {
 impl Drop for Video {
     fn drop(&mut self) {
         let atom = self.render_api.make_guard(gfxtag!("Video::drop"));
-        self.render_api.replace_draw_calls(atom.batch_id, vec![(self.dc_key, Default::default())]);
+        self.render_api
+            .replace_draw_calls(Some(atom.batch_id), vec![(self.dc_key, Default::default())]);
     }
 }
 

+ 1 - 1
bin/app/src/ui/win.rs

@@ -502,7 +502,7 @@ impl Window {
         draw_calls.push((0, dc));
         //t!("  => {:?}", draw_calls);
 
-        self.render_api.replace_draw_calls(atom.batch_id, draw_calls);
+        self.render_api.replace_draw_calls(Some(atom.batch_id), draw_calls);
     }
 
     async fn reload_locale(&self, atom: &mut PropertyAtomicGuard) {