mirror of https://github.com/wayvr-org/wayvr.git
dont cache passes
This commit is contained in:
parent
0666bbd668
commit
b398880fa9
|
|
@ -14,10 +14,9 @@ use vulkano::{
|
||||||
use crate::{
|
use crate::{
|
||||||
drawing::{Boundary, ImagePrimitive},
|
drawing::{Boundary, ImagePrimitive},
|
||||||
gfx::{
|
gfx::{
|
||||||
BLEND_ALPHA, WGfx,
|
|
||||||
cmd::GfxCommandBuffer,
|
cmd::GfxCommandBuffer,
|
||||||
pass::WGfxPass,
|
|
||||||
pipeline::{WGfxPipeline, WPipelineCreateInfo},
|
pipeline::{WGfxPipeline, WPipelineCreateInfo},
|
||||||
|
WGfx, BLEND_ALPHA,
|
||||||
},
|
},
|
||||||
renderer_vk::{
|
renderer_vk::{
|
||||||
model_buffer::ModelBuffer,
|
model_buffer::ModelBuffer,
|
||||||
|
|
@ -71,10 +70,10 @@ struct ImageVertexWithContent {
|
||||||
content_key: usize, // identifies an image tag.
|
content_key: usize, // identifies an image tag.
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CachedPass {
|
struct CachedView {
|
||||||
content_id: usize,
|
content_id: usize,
|
||||||
vert_buffer: Subbuffer<[ImageVertex]>,
|
vert_buffer: Subbuffer<[ImageVertex]>,
|
||||||
inner: WGfxPass<ImageVertex>,
|
view: Arc<ImageView>,
|
||||||
res: [u32; 2],
|
res: [u32; 2],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,7 +81,7 @@ pub struct ImageRenderer {
|
||||||
pipeline: ImagePipeline,
|
pipeline: ImagePipeline,
|
||||||
image_verts: Vec<ImageVertexWithContent>,
|
image_verts: Vec<ImageVertexWithContent>,
|
||||||
model_buffer: ModelBuffer,
|
model_buffer: ModelBuffer,
|
||||||
cached_passes: HashMap<usize, CachedPass>,
|
cached_views: HashMap<usize, CachedView>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ImageRenderer {
|
impl ImageRenderer {
|
||||||
|
|
@ -91,7 +90,7 @@ impl ImageRenderer {
|
||||||
model_buffer: ModelBuffer::new(&pipeline.gfx)?,
|
model_buffer: ModelBuffer::new(&pipeline.gfx)?,
|
||||||
pipeline,
|
pipeline,
|
||||||
image_verts: vec![],
|
image_verts: vec![],
|
||||||
cached_passes: HashMap::new(),
|
cached_views: HashMap::new(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,17 +163,14 @@ impl ImageRenderer {
|
||||||
self.model_buffer.upload(gfx)?;
|
self.model_buffer.upload(gfx)?;
|
||||||
|
|
||||||
for img in &self.image_verts {
|
for img in &self.image_verts {
|
||||||
let pass = if let Some(x) = self.cached_passes.get_mut(&img.content_key) {
|
let cached_view = if let Some(x) = self.cached_views.get_mut(&img.content_key) {
|
||||||
if x.content_id != img.content.id || x.res != res {
|
if x.content_id != img.content.id || x.res != res {
|
||||||
// image changed
|
// image changed
|
||||||
let Some(image_view) = Self::upload_image(&self.pipeline.gfx, res, img)? else {
|
let Some(view) = Self::upload_image(&self.pipeline.gfx, res, img)? else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
x.view = view;
|
||||||
x.inner
|
|
||||||
.update_sampler(2, image_view, self.pipeline.gfx.texture_filter)?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
x
|
x
|
||||||
} else {
|
} else {
|
||||||
let vert_buffer = self.pipeline.gfx.empty_buffer(
|
let vert_buffer = self.pipeline.gfx.empty_buffer(
|
||||||
|
|
@ -182,42 +178,43 @@ impl ImageRenderer {
|
||||||
(std::mem::size_of::<ImageVertex>()) as _,
|
(std::mem::size_of::<ImageVertex>()) as _,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let Some(image_view) = Self::upload_image(&self.pipeline.gfx, res, img)? else {
|
let Some(view) = Self::upload_image(&self.pipeline.gfx, res, img)? else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
self.cached_views.insert(
|
||||||
|
img.content_key,
|
||||||
|
CachedView {
|
||||||
|
content_id: img.content.id,
|
||||||
|
vert_buffer,
|
||||||
|
view,
|
||||||
|
res,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
self.cached_views.get_mut(&img.content_key).unwrap() // safe
|
||||||
|
};
|
||||||
|
|
||||||
let set0 = viewport.get_image_descriptor(&self.pipeline);
|
let set0 = viewport.get_image_descriptor(&self.pipeline);
|
||||||
let set1 = self.model_buffer.get_image_descriptor(&self.pipeline);
|
let set1 = self.model_buffer.get_image_descriptor(&self.pipeline);
|
||||||
let set2 = self
|
let set2 = self
|
||||||
.pipeline
|
.pipeline
|
||||||
.inner
|
.inner
|
||||||
.uniform_sampler(2, image_view, self.pipeline.gfx.texture_filter)?;
|
.uniform_sampler(2, cached_view.view.clone(), self.pipeline.gfx.texture_filter)?;
|
||||||
|
|
||||||
let pass = self.pipeline.inner.create_pass(
|
let pass = self.pipeline.inner.create_pass(
|
||||||
[res[0] as _, res[1] as _],
|
[res[0] as _, res[1] as _],
|
||||||
[0.0, 0.0],
|
[0.0, 0.0],
|
||||||
vert_buffer.clone(),
|
cached_view.vert_buffer.clone(),
|
||||||
0..4,
|
0..4,
|
||||||
0..1,
|
0..1,
|
||||||
vec![set0, set1, set2],
|
vec![set0, set1, set2],
|
||||||
vk_scissor,
|
vk_scissor,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
self.cached_passes.insert(
|
cached_view.vert_buffer.write()?[0..1].clone_from_slice(&[img.vert]);
|
||||||
img.content_key,
|
|
||||||
CachedPass {
|
|
||||||
content_id: img.content.id,
|
|
||||||
vert_buffer,
|
|
||||||
inner: pass,
|
|
||||||
res,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
self.cached_passes.get_mut(&img.content_key).unwrap()
|
|
||||||
};
|
|
||||||
|
|
||||||
pass.vert_buffer.write()?[0..1].clone_from_slice(&[img.vert]);
|
cmd_buf.run_ref(&pass)?;
|
||||||
|
|
||||||
cmd_buf.run_ref(&pass.inner)?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ use crate::{
|
||||||
drawing::{Boundary, Rectangle},
|
drawing::{Boundary, Rectangle},
|
||||||
gfx::{
|
gfx::{
|
||||||
cmd::GfxCommandBuffer,
|
cmd::GfxCommandBuffer,
|
||||||
pass::WGfxPass,
|
|
||||||
pipeline::{WGfxPipeline, WPipelineCreateInfo},
|
pipeline::{WGfxPipeline, WPipelineCreateInfo},
|
||||||
WGfx, BLEND_ALPHA,
|
WGfx, BLEND_ALPHA,
|
||||||
},
|
},
|
||||||
|
|
@ -59,18 +58,12 @@ impl RectPipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CachedPass {
|
|
||||||
pass: WGfxPass<RectVertex>,
|
|
||||||
res: [u32; 2],
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct RectRenderer {
|
pub struct RectRenderer {
|
||||||
pipeline: RectPipeline,
|
pipeline: RectPipeline,
|
||||||
rect_vertices: Vec<RectVertex>,
|
rect_vertices: Vec<RectVertex>,
|
||||||
vert_buffer: Subbuffer<[RectVertex]>,
|
vert_buffer: Subbuffer<[RectVertex]>,
|
||||||
vert_buffer_len: usize,
|
vert_buffer_len: usize,
|
||||||
model_buffer: ModelBuffer,
|
model_buffer: ModelBuffer,
|
||||||
pass: Option<CachedPass>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RectRenderer {
|
impl RectRenderer {
|
||||||
|
|
@ -88,7 +81,6 @@ impl RectRenderer {
|
||||||
rect_vertices: vec![],
|
rect_vertices: vec![],
|
||||||
vert_buffer,
|
vert_buffer,
|
||||||
vert_buffer_len: BUFFER_SIZE,
|
vert_buffer_len: BUFFER_SIZE,
|
||||||
pass: None,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -144,9 +136,6 @@ impl RectRenderer {
|
||||||
self.model_buffer.upload(gfx)?;
|
self.model_buffer.upload(gfx)?;
|
||||||
self.upload_verts()?;
|
self.upload_verts()?;
|
||||||
|
|
||||||
let cache = match self.pass.take() {
|
|
||||||
Some(p) if p.res == res => p,
|
|
||||||
_ => {
|
|
||||||
let set0 = viewport.get_rect_descriptor(&self.pipeline);
|
let set0 = viewport.get_rect_descriptor(&self.pipeline);
|
||||||
let set1 = self.model_buffer.get_rect_descriptor(&self.pipeline);
|
let set1 = self.model_buffer.get_rect_descriptor(&self.pipeline);
|
||||||
let pass = self.pipeline.color_rect.create_pass(
|
let pass = self.pipeline.color_rect.create_pass(
|
||||||
|
|
@ -158,13 +147,9 @@ impl RectRenderer {
|
||||||
vec![set0, set1],
|
vec![set0, set1],
|
||||||
vk_scissor,
|
vk_scissor,
|
||||||
)?;
|
)?;
|
||||||
CachedPass { pass, res }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
self.rect_vertices.clear();
|
self.rect_vertices.clear();
|
||||||
cmd_buf.run_ref(&cache.pass)?;
|
cmd_buf.run_ref(&pass)?;
|
||||||
self.pass = Some(cache);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
gfx::{cmd::GfxCommandBuffer, pass::WGfxPass},
|
gfx::cmd::GfxCommandBuffer,
|
||||||
renderer_vk::{model_buffer::ModelBuffer, text::text_atlas::TEXT_ATLAS_ISLAND_PADDING_PX, viewport::Viewport},
|
renderer_vk::{model_buffer::ModelBuffer, text::text_atlas::TEXT_ATLAS_ISLAND_PADDING_PX, viewport::Viewport},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -17,11 +17,6 @@ use vulkano::{
|
||||||
pipeline::graphics,
|
pipeline::graphics,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CachedPass {
|
|
||||||
pass: WGfxPass<GlyphVertex>,
|
|
||||||
res: [u32; 2],
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A text renderer that uses cached glyphs to render text into an existing render pass.
|
/// A text renderer that uses cached glyphs to render text into an existing render pass.
|
||||||
pub struct TextRenderer {
|
pub struct TextRenderer {
|
||||||
pipeline: TextPipeline,
|
pipeline: TextPipeline,
|
||||||
|
|
@ -29,7 +24,6 @@ pub struct TextRenderer {
|
||||||
vertex_buffer_capacity: usize,
|
vertex_buffer_capacity: usize,
|
||||||
glyph_vertices: Vec<GlyphVertex>,
|
glyph_vertices: Vec<GlyphVertex>,
|
||||||
model_buffer: ModelBuffer,
|
model_buffer: ModelBuffer,
|
||||||
pass: Option<CachedPass>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TextRenderer {
|
impl TextRenderer {
|
||||||
|
|
@ -49,14 +43,12 @@ impl TextRenderer {
|
||||||
vertex_buffer,
|
vertex_buffer,
|
||||||
vertex_buffer_capacity: INITIAL_CAPACITY,
|
vertex_buffer_capacity: INITIAL_CAPACITY,
|
||||||
glyph_vertices: Vec::new(),
|
glyph_vertices: Vec::new(),
|
||||||
pass: None,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn begin(&mut self) {
|
pub fn begin(&mut self) {
|
||||||
self.glyph_vertices.clear();
|
self.glyph_vertices.clear();
|
||||||
self.model_buffer.begin();
|
self.model_buffer.begin();
|
||||||
self.pass.take(); // FIXME: this currently makes 0 sense
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Prepares all of the provided text areas for rendering.
|
/// Prepares all of the provided text areas for rendering.
|
||||||
|
|
@ -265,9 +257,6 @@ impl TextRenderer {
|
||||||
let res = viewport.resolution();
|
let res = viewport.resolution();
|
||||||
self.model_buffer.upload(&atlas.common.gfx)?;
|
self.model_buffer.upload(&atlas.common.gfx)?;
|
||||||
|
|
||||||
let cache = match self.pass.take() {
|
|
||||||
Some(p) if p.res == res => p,
|
|
||||||
_ => {
|
|
||||||
let descriptor_sets = vec![
|
let descriptor_sets = vec![
|
||||||
atlas.color_atlas.image_descriptor.clone(),
|
atlas.color_atlas.image_descriptor.clone(),
|
||||||
atlas.mask_atlas.image_descriptor.clone(),
|
atlas.mask_atlas.image_descriptor.clone(),
|
||||||
|
|
@ -284,12 +273,8 @@ impl TextRenderer {
|
||||||
descriptor_sets,
|
descriptor_sets,
|
||||||
vk_scissor,
|
vk_scissor,
|
||||||
)?;
|
)?;
|
||||||
CachedPass { pass, res }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
cmd_buf.run_ref(&cache.pass)?;
|
cmd_buf.run_ref(&pass)?;
|
||||||
self.pass = Some(cache);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue