wgui: reuse WGfxPass on text & rect renderers
This commit is contained in:
@@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user