Reduce Generics in pipeline rendering
This commit is contained in:
parent
90a5b5d117
commit
0174aeb60e
8 changed files with 92 additions and 76 deletions
|
@ -1,4 +1,4 @@
|
|||
use std::{error::Error, sync::Arc};
|
||||
use std::{collections::HashMap, error::Error, sync::Arc};
|
||||
|
||||
use vulkano::{
|
||||
buffer::Subbuffer,
|
||||
|
@ -28,17 +28,12 @@ use vulkano::{
|
|||
|
||||
use crate::core::render::{
|
||||
primitives::{
|
||||
AsBindableDescriptorSet, AsRecordable, AsRenderableMesh, AsRenderableMeshInstance,
|
||||
mvp::Mvp, transform::TransformRaw, vertex::Vertex3D,
|
||||
AsDescriptorSet, AsDescriptorSetLayoutBindings, AsRecordable, AsRenderableMesh,
|
||||
AsRenderableMeshInstance, mvp::Mvp, transform::TransformRaw, vertex::Vertex3D,
|
||||
},
|
||||
resources::texture::Texture,
|
||||
};
|
||||
|
||||
pub struct SimplePipelineRenderData<'a> {
|
||||
pub mvp_uniform: &'a Subbuffer<[Mvp]>,
|
||||
pub texture: &'a Texture,
|
||||
}
|
||||
|
||||
pub struct SimplePipeline {
|
||||
pipeline: Arc<GraphicsPipeline>,
|
||||
}
|
||||
|
@ -125,33 +120,35 @@ impl SimplePipeline {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> AsRecordable<SimplePipelineRenderData<'a>, Vertex3D, Subbuffer<[u32]>, TransformRaw>
|
||||
for SimplePipeline
|
||||
{
|
||||
impl AsRecordable<Vertex3D, Subbuffer<[u32]>, TransformRaw> for SimplePipeline {
|
||||
fn record_bind_commands(
|
||||
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
||||
descriptor_set_allocator: &Arc<StandardDescriptorSetAllocator>,
|
||||
pipeline: &Arc<GraphicsPipeline>,
|
||||
mesh: &impl AsRenderableMesh<Vertex3D, Subbuffer<[u32]>>,
|
||||
instances: &impl AsRenderableMeshInstance<TransformRaw>,
|
||||
data: &SimplePipelineRenderData<'a>,
|
||||
descriptor_sets: Vec<Arc<dyn AsDescriptorSet>>,
|
||||
) -> Result<(), Box<dyn Error>> {
|
||||
let layouts = pipeline.layout().set_layouts();
|
||||
|
||||
let uniform_descriptor_set =
|
||||
Mvp::as_descriptor_set(descriptor_set_allocator, &layouts[0], data.mvp_uniform)?;
|
||||
|
||||
let texture_descriptor_set =
|
||||
Texture::as_descriptor_set(descriptor_set_allocator, &layouts[1], data.texture)?;
|
||||
|
||||
builder.bind_pipeline_graphics(pipeline.clone())?;
|
||||
|
||||
builder.bind_descriptor_sets(
|
||||
PipelineBindPoint::Graphics,
|
||||
pipeline.layout().clone(),
|
||||
0,
|
||||
vec![uniform_descriptor_set, texture_descriptor_set],
|
||||
)?;
|
||||
if !descriptor_sets.is_empty() {
|
||||
let layouts = pipeline.layout().set_layouts();
|
||||
|
||||
let descriptor_sets = descriptor_sets
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(layout_index, data)| {
|
||||
data.as_descriptor_set(descriptor_set_allocator, &layouts[layout_index])
|
||||
})
|
||||
.collect::<Result<Vec<_>, _>>()?;
|
||||
|
||||
builder.bind_descriptor_sets(
|
||||
PipelineBindPoint::Graphics,
|
||||
pipeline.layout().clone(),
|
||||
0,
|
||||
descriptor_sets,
|
||||
)?;
|
||||
}
|
||||
|
||||
builder.bind_vertex_buffers(
|
||||
0,
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
use std::collections::HashMap;
|
||||
use std::error::Error;
|
||||
use std::sync::Arc;
|
||||
|
||||
use super::settings_scene::SettingsScene;
|
||||
use crate::core::app::DEPTH_IMAGE_ID;
|
||||
use crate::core::app::context::WindowContext;
|
||||
use crate::core::app::user_event::UserEvent;
|
||||
use crate::core::render::primitives::AsRecordable;
|
||||
use crate::core::render::primitives::camera::Camera3D;
|
||||
use crate::core::render::primitives::transform::Transform;
|
||||
use crate::core::render::primitives::{AsDescriptorSet, AsRecordable};
|
||||
use crate::core::render::render_pass_manager::{RenderPassConfig, RenderPassManager};
|
||||
use crate::core::render::resources::meshes::{ObjMesh, SquareMesh};
|
||||
use crate::core::render::resources::texture::{
|
||||
Texture, TextureLoadInfo, TextureLoader, TextureSourceKind,
|
||||
};
|
||||
use crate::core::render::resources::texture::{TextureLoadInfo, TextureLoader, TextureSourceKind};
|
||||
use crate::core::scene::Scene;
|
||||
use crate::game::assets::pipelines::simple::{SimplePipeline, SimplePipelineRenderData};
|
||||
use crate::game::assets::pipelines::simple::SimplePipeline;
|
||||
use egui_winit_vulkano::egui;
|
||||
use glam::EulerRot;
|
||||
use glam::Quat;
|
||||
|
@ -21,7 +21,7 @@ use glam::Vec3;
|
|||
use vulkano::format::Format;
|
||||
use vulkano::image::sampler::{Filter, SamplerAddressMode, SamplerCreateInfo};
|
||||
use vulkano::{
|
||||
command_buffer::{AutoCommandBufferBuilder, CommandBufferUsage, PrimaryCommandBufferAbstract},
|
||||
command_buffer::{AutoCommandBufferBuilder, CommandBufferUsage},
|
||||
sync::GpuFuture,
|
||||
};
|
||||
use winit::window::CursorGrabMode;
|
||||
|
@ -250,7 +250,7 @@ impl Scene for MainScene {
|
|||
}
|
||||
|
||||
// Create camera uniform using the actual camera
|
||||
let camera_uniform = state.camera.create_buffer(&app_context.memory_allocator)?;
|
||||
let camera_uniform = Arc::new(state.camera.create_buffer(&app_context.memory_allocator)?);
|
||||
let square_transform_uniform =
|
||||
Transform::create_buffer(&app_context.memory_allocator, &state.square_instances)?;
|
||||
let obj_transform_uniform =
|
||||
|
@ -262,10 +262,14 @@ impl Scene for MainScene {
|
|||
state.simple_pipeline.pipeline(),
|
||||
&state.square,
|
||||
&square_transform_uniform,
|
||||
&SimplePipelineRenderData {
|
||||
mvp_uniform: &camera_uniform,
|
||||
texture: &state.texture_loader.get_texture("wooden-crate").unwrap(),
|
||||
},
|
||||
vec![
|
||||
camera_uniform.clone() as Arc<dyn AsDescriptorSet>,
|
||||
state
|
||||
.texture_loader
|
||||
.get_texture("wooden-crate")
|
||||
.unwrap()
|
||||
.clone(),
|
||||
],
|
||||
)?;
|
||||
SimplePipeline::record_draw_commands(
|
||||
&mut builder,
|
||||
|
@ -279,10 +283,14 @@ impl Scene for MainScene {
|
|||
state.simple_pipeline.pipeline(),
|
||||
&state.obj,
|
||||
&obj_transform_uniform,
|
||||
&SimplePipelineRenderData {
|
||||
mvp_uniform: &camera_uniform,
|
||||
texture: &state.texture_loader.get_texture("cube-diffuse").unwrap(),
|
||||
},
|
||||
vec![
|
||||
camera_uniform.clone() as Arc<dyn AsDescriptorSet>,
|
||||
state
|
||||
.texture_loader
|
||||
.get_texture("cube-diffuse")
|
||||
.unwrap()
|
||||
.clone(),
|
||||
],
|
||||
)?;
|
||||
SimplePipeline::record_draw_commands(&mut builder, &state.obj, &obj_transform_uniform)?;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue