Add initial MeshPass

This commit is contained in:
mars 2022-04-04 22:21:14 -06:00
parent 67f0eb6ef1
commit 314e842dc1
5 changed files with 80 additions and 66 deletions

View File

@ -2,6 +2,7 @@
//! in Rust.
use rayon::prelude::*;
use std::sync::{Arc, RwLock};
use strum::IntoEnumIterator;
pub mod pass;
@ -11,10 +12,34 @@ use pass::*;
use phase::*;
pub struct Renderer {
pub frames_in_flight: usize,
pub render_passes: Vec<Box<dyn RenderPassBoxTrait>>,
}
impl Default for Renderer {
fn default() -> Self {
Self {
frames_in_flight: 2,
render_passes: Vec::new(),
}
}
}
impl Renderer {
pub fn add_pass<T: 'static + RenderPass>(&mut self, pass: T) {
let pass = Arc::new(RwLock::new(pass));
self.add_pass_arc(pass);
}
pub fn add_pass_arc<T: 'static + RenderPass>(&mut self, pass: Arc<RwLock<T>>) {
let pass = RenderPassBox::new(pass, self.frames_in_flight);
self.add_pass_box(pass);
}
pub fn add_pass_box(&mut self, pass: Box<dyn RenderPassBoxTrait>) {
self.render_passes.push(pass);
}
pub fn render(&mut self) {
let frame_index = 0;
@ -65,68 +90,3 @@ pub mod gpu {
/// - secondary command buffer in Vulkan
pub struct RenderBundleEncoder;
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Copy, Clone)]
struct DummyPass;
impl RenderPass for DummyPass {
type FrameData = usize;
fn create_frame_data(&mut self) -> usize {
0
}
fn begin_frame(&mut self, data: &mut Self::FrameData, phases: &mut PhaseList) {
println!("begin_frame()");
for phase in PrePhase::iter() {
phases.insert_pre(phase);
}
for phase in ViewportPhase::iter() {
phases.insert_viewport(phase);
}
}
fn render_pre(
&self,
phase: PrePhase,
data: &Self::FrameData,
cmds: &mut gpu::RenderBundleEncoder,
) {
println!("render_pre(phase: {:?})", phase);
}
fn render_viewport(
&self,
phase: ViewportPhase,
data: &Self::FrameData,
viewport: &ViewportData,
cmds: &mut gpu::RenderBundleEncoder,
) {
println!("render_viewport(phase: {:?})", phase);
}
}
#[test]
fn dummy_pass() {
use std::sync::{Arc, RwLock};
let render_passes = (0..10)
.map(|_| {
let dummy_pass = DummyPass;
let dummy_pass = Arc::new(RwLock::new(dummy_pass));
RenderPassBox::new(dummy_pass, 1)
})
.collect();
let mut renderer = Renderer { render_passes };
for n in 0..10 {
println!("Frame #{}", n);
renderer.render();
}
}
}

9
src/main.rs Normal file
View File

@ -0,0 +1,9 @@
use cyborg::{pass, Renderer};
fn main() {
let mut renderer = Renderer::default();
let mesh_pass = pass::mesh::MeshPass::new();
renderer.add_pass(mesh_pass);
renderer.render();
}

View File

@ -4,6 +4,8 @@ use crate::gpu;
use crate::phase::*;
use std::sync::{Arc, RwLock};
pub mod mesh;
/// Viewport data shared by all passes, once the [ViewportPhase] group is
/// entered.
pub struct ViewportData;

43
src/pass/mesh.rs Normal file
View File

@ -0,0 +1,43 @@
use super::*;
pub struct FrameData {}
pub struct MeshPass {}
impl MeshPass {
pub fn new() -> Self {
Self {}
}
}
impl RenderPass for MeshPass {
type FrameData = FrameData;
fn create_frame_data(&mut self) -> FrameData {
FrameData {}
}
fn begin_frame(&mut self, data: &mut FrameData, phases: &mut PhaseList) {
println!("MeshPass::begin_frame()");
phases.insert_pre(PrePhase::VertexSkinning);
phases.insert_viewport(ViewportPhase::Depth);
phases.insert_viewport(ViewportPhase::Opaque);
phases.insert_viewport(ViewportPhase::Transparent);
}
fn render_pre(&self, phase: PrePhase, data: &FrameData, cmds: &mut gpu::RenderBundleEncoder) {
println!("MeshPass::render_pre(phase: {:?})", phase);
}
fn render_viewport(
&self,
phase: ViewportPhase,
data: &FrameData,
viewport: &ViewportData,
cmds: &mut gpu::RenderBundleEncoder,
) {
println!("MeshPass::render_viewport(phase: {:?})", phase);
}
}

View File

@ -35,7 +35,7 @@ pub enum ViewportPhase {
Transparent,
Bloom,
Overlay,
Composite
Composite,
}
/// A container of phases of each group.