Explorar el Código

wallet: Image and Text no longer need to keep old mesh and textures around

darkfi hace 1 año
padre
commit
2d3a093711

+ 1 - 1
bin/darkwallet/src/app/mod.rs

@@ -162,7 +162,7 @@ impl App {
 
 
         let window = window.setup(|me| Window::new(me, self.render_api.clone())).await;
         let window = window.setup(|me| Window::new(me, self.render_api.clone())).await;
         self.sg_root.clone().link(window.clone());
         self.sg_root.clone().link(window.clone());
-        schema::make(&self, window).await;
+        schema::make_test(&self, window).await;
 
 
         debug!(target: "app", "Schema loaded");
         debug!(target: "app", "Schema loaded");
     }
     }

+ 1 - 1
bin/darkwallet/src/gfx/mod.rs

@@ -231,7 +231,7 @@ impl GfxDrawInstruction {
     }
     }
 }
 }
 
 
-#[derive(Clone, Debug)]
+#[derive(Clone, Debug, Default)]
 pub struct GfxDrawCall {
 pub struct GfxDrawCall {
     pub instrs: Vec<GfxDrawInstruction>,
     pub instrs: Vec<GfxDrawInstruction>,
     pub dcs: Vec<u64>,
     pub dcs: Vec<u64>,

+ 1 - 9
bin/darkwallet/src/ui/image.rs

@@ -44,7 +44,6 @@ pub struct Image {
     render_api: RenderApi,
     render_api: RenderApi,
     tasks: OnceLock<Vec<smol::Task<()>>>,
     tasks: OnceLock<Vec<smol::Task<()>>>,
 
 
-    mesh: SyncMutex<Option<MeshInfo>>,
     texture: SyncMutex<Option<ManagedTexturePtr>>,
     texture: SyncMutex<Option<ManagedTexturePtr>>,
     dc_key: u64,
     dc_key: u64,
 
 
@@ -74,7 +73,6 @@ impl Image {
             render_api,
             render_api,
             tasks: OnceLock::new(),
             tasks: OnceLock::new(),
 
 
-            mesh: SyncMutex::new(None),
             texture: SyncMutex::new(None),
             texture: SyncMutex::new(None),
             dc_key: OsRng.gen(),
             dc_key: OsRng.gen(),
 
 
@@ -153,8 +151,6 @@ impl Image {
         self.uv.eval(&rect).ok()?;
         self.uv.eval(&rect).ok()?;
 
 
         let mesh = self.regen_mesh();
         let mesh = self.regen_mesh();
-        let old_mesh = std::mem::replace(&mut *self.mesh.lock().unwrap(), Some(mesh.clone()));
-
         let texture = self.texture.lock().unwrap().clone().expect("Node missing texture_id!");
         let texture = self.texture.lock().unwrap().clone().expect("Node missing texture_id!");
 
 
         let mesh = GfxDrawMesh {
         let mesh = GfxDrawMesh {
@@ -212,10 +208,6 @@ impl UIObject for Image {
 
 
 impl Drop for Image {
 impl Drop for Image {
     fn drop(&mut self) {
     fn drop(&mut self) {
-        // TODO: Delete own draw call
-
-        // Free buffers
-        // Should this be in drop?
-        *self.mesh.lock().unwrap() = None;
+        self.render_api.replace_draw_calls(vec![(self.dc_key, Default::default())]);
     }
     }
 }
 }

+ 15 - 55
bin/darkwallet/src/ui/text.rs

@@ -51,7 +51,6 @@ pub struct Text {
     text_shaper: TextShaperPtr,
     text_shaper: TextShaperPtr,
     tasks: OnceLock<Vec<smol::Task<()>>>,
     tasks: OnceLock<Vec<smol::Task<()>>>,
 
 
-    render_info: SyncMutex<TextRenderInfo>,
     dc_key: u64,
     dc_key: u64,
 
 
     rect: PropertyRect,
     rect: PropertyRect,
@@ -88,23 +87,11 @@ impl Text {
         let node_name = node_ref.name.clone();
         let node_name = node_ref.name.clone();
         let node_id = node_ref.id;
         let node_id = node_ref.id;
 
 
-        let render_info = Self::regen_mesh(
-            &render_api,
-            &text_shaper,
-            text.get(),
-            font_size.get(),
-            text_color.get(),
-            baseline.get(),
-            debug.get(),
-            window_scale.get(),
-        );
-
         let self_ = Arc::new(Self {
         let self_ = Arc::new(Self {
             node,
             node,
             render_api,
             render_api,
             text_shaper,
             text_shaper,
             tasks: OnceLock::new(),
             tasks: OnceLock::new(),
-            render_info: SyncMutex::new(render_info),
             dc_key: OsRng.gen(),
             dc_key: OsRng.gen(),
 
 
             rect,
             rect,
@@ -122,19 +109,17 @@ impl Text {
         Pimpl::Text(self_)
         Pimpl::Text(self_)
     }
     }
 
 
-    fn regen_mesh(
-        render_api: &RenderApi,
-        text_shaper: &TextShaper,
-        text: String,
-        font_size: f32,
-        text_color: Color,
-        baseline: f32,
-        debug: bool,
-        window_scale: f32,
-    ) -> TextRenderInfo {
+    fn regen_mesh(&self) -> TextRenderInfo {
+        let text = self.text.get();
+        let font_size = self.font_size.get();
+        let text_color = self.text_color.get();
+        let baseline = self.baseline.get();
+        let debug = self.debug.get();
+        let window_scale = self.window_scale.get();
+
         debug!(target: "ui::text", "Rendering label '{}'", text);
         debug!(target: "ui::text", "Rendering label '{}'", text);
-        let glyphs = text_shaper.shape(text, font_size, window_scale);
-        let atlas = text::make_texture_atlas(render_api, &glyphs);
+        let glyphs = self.text_shaper.shape(text, font_size, window_scale);
+        let atlas = text::make_texture_atlas(&self.render_api, &glyphs);
 
 
         let mut mesh = MeshBuilder::new();
         let mut mesh = MeshBuilder::new();
         let glyph_pos_iter = GlyphPositionIter::new(font_size, window_scale, &glyphs, baseline);
         let glyph_pos_iter = GlyphPositionIter::new(font_size, window_scale, &glyphs, baseline);
@@ -152,7 +137,7 @@ impl Text {
             mesh.draw_box(&glyph_rect, color, uv_rect);
             mesh.draw_box(&glyph_rect, color, uv_rect);
         }
         }
 
 
-        let mesh = mesh.alloc(&render_api);
+        let mesh = mesh.alloc(&self.render_api);
 
 
         TextRenderInfo { mesh, texture: atlas.texture }
         TextRenderInfo { mesh, texture: atlas.texture }
     }
     }
@@ -173,20 +158,7 @@ impl Text {
         self.rect.eval(&parent_rect).ok()?;
         self.rect.eval(&parent_rect).ok()?;
         let rect = self.rect.get();
         let rect = self.rect.get();
 
 
-        let old_render_info = self.render_info.lock().unwrap().clone();
-
-        let render_info = Self::regen_mesh(
-            &self.render_api,
-            &self.text_shaper,
-            self.text.get(),
-            self.font_size.get(),
-            self.text_color.get(),
-            self.baseline.get(),
-            self.debug.get(),
-            self.window_scale.get(),
-        );
-
-        *self.render_info.lock().unwrap() = render_info.clone();
+        let render_info = self.regen_mesh();
 
 
         let mesh = GfxDrawMesh {
         let mesh = GfxDrawMesh {
             vertex_buffer: render_info.mesh.vertex_buffer,
             vertex_buffer: render_info.mesh.vertex_buffer,
@@ -244,20 +216,8 @@ impl UIObject for Text {
     }
     }
 }
 }
 
 
-/*
-impl Stoppable for Text {
-    async fn stop(&self) {
-        // TODO: Delete own draw call
-
-        // Free buffers
-        // Should this be in drop?
-        let render_info = self.render_info.lock().unwrap().clone();
-        let vertex_buffer = render_info.mesh.vertex_buffer;
-        let index_buffer = render_info.mesh.index_buffer;
-        let texture_id = render_info.texture_id;
-        self.render_api.delete_buffer(vertex_buffer);
-        self.render_api.delete_buffer(index_buffer);
-        self.render_api.delete_texture(texture_id);
+impl Drop for Text {
+    fn drop(&mut self) {
+        self.render_api.replace_draw_calls(vec![(self.dc_key, Default::default())]);
     }
     }
 }
 }
-*/