wgui: reuse WGfxPass on text & rect renderers

This commit is contained in:
galister
2025-06-18 04:18:07 +09:00
parent 1b7f9c8843
commit 9c1bd5b4f2
3 changed files with 66 additions and 31 deletions

View File

@@ -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<RectVertex>,
res: [u32; 2],
}
pub struct RectRenderer {
pipeline: RectPipeline,
rect_vertices: Vec<RectVertex>,
vert_buffer: Subbuffer<[RectVertex]>,
vert_buffer_size: usize,
model_buffer: ModelBuffer,
pass: Option<CachedPass>,
}
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(())
}
}