From 9c1bd5b4f2cee35ac71329ea7553c093ce8a36c7 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Wed, 18 Jun 2025 04:18:07 +0900 Subject: [PATCH] wgui: reuse WGfxPass on text & rect renderers --- wgui/src/renderer_vk/rect.rs | 40 ++++++++++++------ wgui/src/renderer_vk/text/text_renderer.rs | 48 ++++++++++++++-------- wlx-overlay-s/src/overlays/keyboard.rs | 9 +++- 3 files changed, 66 insertions(+), 31 deletions(-) diff --git a/wgui/src/renderer_vk/rect.rs b/wgui/src/renderer_vk/rect.rs index 263548f7..9b1df60a 100644 --- a/wgui/src/renderer_vk/rect.rs +++ b/wgui/src/renderer_vk/rect.rs @@ -9,7 +9,7 @@ use vulkano::{ use crate::{ drawing::{Boundary, Rectangle}, - gfx::{BLEND_ALPHA, WGfx, cmd::GfxCommandBuffer, pipeline::WGfxPipeline}, + gfx::{BLEND_ALPHA, WGfx, cmd::GfxCommandBuffer, pass::WGfxPass, pipeline::WGfxPipeline}, renderer_vk::model_buffer::ModelBuffer, }; @@ -59,12 +59,18 @@ impl RectPipeline { } } +struct CachedPass { + pass: WGfxPass, + res: [u32; 2], +} + pub struct RectRenderer { pipeline: RectPipeline, rect_vertices: Vec, vert_buffer: Subbuffer<[RectVertex]>, vert_buffer_size: usize, model_buffer: ModelBuffer, + pass: Option, } impl RectRenderer { @@ -82,6 +88,7 @@ impl RectRenderer { rect_vertices: vec![], vert_buffer, vert_buffer_size: BUFFER_SIZE, + pass: None, }) } @@ -134,24 +141,31 @@ impl RectRenderer { viewport: &mut Viewport, cmd_buf: &mut GfxCommandBuffer, ) -> anyhow::Result<()> { - let vp = viewport.resolution(); + let res = viewport.resolution(); self.model_buffer.upload(gfx)?; self.upload_verts()?; - let set0 = viewport.get_rect_descriptor(&self.pipeline); - let set1 = self.model_buffer.get_rect_descriptor(&self.pipeline); - let pass = self.pipeline.color_rect.create_pass( - [vp[0] as _, vp[1] as _], - self.vert_buffer.clone(), - 0..4, - 0..self.rect_vertices.len() as _, - vec![set0, set1], - )?; + let cache = match self.pass.take() { + Some(p) if p.res == res => p, + _ => { + let set0 = viewport.get_rect_descriptor(&self.pipeline); + let set1 = self.model_buffer.get_rect_descriptor(&self.pipeline); + let pass = self.pipeline.color_rect.create_pass( + [res[0] as _, res[1] as _], + self.vert_buffer.clone(), + 0..4, + 0..self.rect_vertices.len() as _, + vec![set0, set1], + )?; + CachedPass { pass, res } + } + }; self.rect_vertices.clear(); - - cmd_buf.run_ref(&pass) + cmd_buf.run_ref(&cache.pass)?; + self.pass = Some(cache); + Ok(()) } } diff --git a/wgui/src/renderer_vk/text/text_renderer.rs b/wgui/src/renderer_vk/text/text_renderer.rs index d95328c4..b2e09ded 100644 --- a/wgui/src/renderer_vk/text/text_renderer.rs +++ b/wgui/src/renderer_vk/text/text_renderer.rs @@ -1,5 +1,5 @@ use crate::{ - gfx::cmd::GfxCommandBuffer, + gfx::{cmd::GfxCommandBuffer, pass::WGfxPass}, renderer_vk::{model_buffer::ModelBuffer, viewport::Viewport}, }; @@ -15,6 +15,11 @@ use vulkano::{ command_buffer::CommandBufferUsage, }; +struct CachedPass { + pass: WGfxPass, + res: [u32; 2], +} + /// A text renderer that uses cached glyphs to render text into an existing render pass. pub struct TextRenderer { pipeline: TextPipeline, @@ -22,6 +27,7 @@ pub struct TextRenderer { vertex_buffer_capacity: usize, glyph_vertices: Vec, model_buffer: ModelBuffer, + pass: Option, } impl TextRenderer { @@ -41,6 +47,7 @@ impl TextRenderer { vertex_buffer, vertex_buffer_capacity: INITIAL_CAPACITY, glyph_vertices: Vec::new(), + pass: None, }) } @@ -250,26 +257,33 @@ impl TextRenderer { return Ok(()); } + let res = viewport.resolution(); self.model_buffer.upload(&atlas.common.gfx)?; - let descriptor_sets = vec![ - atlas.color_atlas.image_descriptor.clone(), - atlas.mask_atlas.image_descriptor.clone(), - viewport.get_text_descriptor(&self.pipeline), - self.model_buffer.get_text_descriptor(&self.pipeline), - ]; + let cache = match self.pass.take() { + Some(p) if p.res == res => p, + _ => { + let descriptor_sets = vec![ + atlas.color_atlas.image_descriptor.clone(), + atlas.mask_atlas.image_descriptor.clone(), + viewport.get_text_descriptor(&self.pipeline), + self.model_buffer.get_text_descriptor(&self.pipeline), + ]; - let res = viewport.resolution(); + let pass = self.pipeline.inner.create_pass( + [res[0] as _, res[1] as _], + self.vertex_buffer.clone(), + 0..4, + 0..self.glyph_vertices.len() as u32, + descriptor_sets, + )?; + CachedPass { pass, res } + } + }; - let pass = self.pipeline.inner.create_pass( - [res[0] as _, res[1] as _], - self.vertex_buffer.clone(), - 0..4, - 0..self.glyph_vertices.len() as u32, - descriptor_sets, - )?; - - cmd_buf.run_ref(&pass) + cmd_buf.run_ref(&cache.pass)?; + self.pass = Some(cache); + Ok(()) } } diff --git a/wlx-overlay-s/src/overlays/keyboard.rs b/wlx-overlay-s/src/overlays/keyboard.rs index bfcd9e1f..f44b577d 100644 --- a/wlx-overlay-s/src/overlays/keyboard.rs +++ b/wlx-overlay-s/src/overlays/keyboard.rs @@ -237,7 +237,14 @@ where } else { let _ = panel.layout.add_child( div, - Div::create().unwrap(), + Rectangle::create(RectangleParams { + border_color: wgui::drawing::Color::new(0., 0., 0., 0.), + color: wgui::drawing::Color::new(0., 0., 0., 0.), + border: 2.0, + round: WLength::Units(4.0), + ..Default::default() + }) + .unwrap(), taffy::Style { size: my_size, min_size: my_size,