Split record_render_commands and bind_commands

This commit is contained in:
Florian RICHER 2025-06-08 16:42:22 +02:00
parent 078e9daba9
commit f91c0792b2
Signed by: florian.richer
GPG key ID: C73D37CBED7BFC77
6 changed files with 83 additions and 85 deletions

View file

@ -44,7 +44,7 @@ impl Square {
}
}
impl AsRenderableMesh<Vertex3D, u32> for Square {
impl AsRenderableMesh<Vertex3D, Subbuffer<[u32]>> for Square {
fn vertex_buffer(&self) -> &Subbuffer<[Vertex3D]> {
&self.vertex_buffer
}

View file

@ -28,20 +28,15 @@ use vulkano::{
use crate::core::render::{
primitives::{
AsBindableDescriptorSet, AsRecordable, AsRenderableMesh, mvp::Mvp, transform::TransformRaw,
vertex::Vertex3D,
AsBindableDescriptorSet, AsRecordable, AsRenderableMesh, AsRenderableMeshInstance,
mvp::Mvp, transform::TransformRaw, vertex::Vertex3D,
},
texture::Texture,
};
pub struct SimplePipelineRenderData<'a, T>
where
T: AsRenderableMesh<Vertex3D, u32>,
{
pub mesh: &'a T,
pub struct SimplePipelineRenderData<'a> {
pub mvp_uniform: &'a Subbuffer<[Mvp]>,
pub texture: &'a Texture,
pub instances: &'a Subbuffer<[TransformRaw]>,
}
pub struct SimplePipeline {
@ -130,14 +125,16 @@ impl SimplePipeline {
}
}
impl<'a, T: AsRenderableMesh<Vertex3D, u32>> AsRecordable<SimplePipelineRenderData<'a, T>>
impl<'a> AsRecordable<SimplePipelineRenderData<'a>, Vertex3D, Subbuffer<[u32]>, TransformRaw>
for SimplePipeline
{
fn record_render_commands(
fn record_bind_commands(
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
descriptor_set_allocator: &Arc<StandardDescriptorSetAllocator>,
pipeline: &Arc<GraphicsPipeline>,
data: &SimplePipelineRenderData<'a, T>,
mesh: &impl AsRenderableMesh<Vertex3D, Subbuffer<[u32]>>,
instances: &impl AsRenderableMeshInstance<TransformRaw>,
data: &SimplePipelineRenderData<'a>,
) -> Result<(), Box<dyn Error>> {
let layouts = pipeline.layout().set_layouts();
@ -158,32 +155,12 @@ impl<'a, T: AsRenderableMesh<Vertex3D, u32>> AsRecordable<SimplePipelineRenderDa
builder.bind_vertex_buffers(
0,
(data.mesh.vertex_buffer().clone(), data.instances.clone()),
(
mesh.vertex_buffer().clone(),
instances.instance_buffer().clone(),
),
)?;
match data.mesh.index_buffer() {
Some(index_buffer) => {
builder.bind_index_buffer(index_buffer.clone())?;
unsafe {
builder.draw_indexed(
data.mesh.index_count(),
data.instances.len() as u32,
data.mesh.first_index(),
data.mesh.vertex_offset(),
0,
)?;
}
}
None => unsafe {
builder.draw(
data.mesh.vertex_count(),
data.instances.len() as u32,
data.mesh.first_vertex(),
0,
)?;
},
}
Ok(())
}
}

View file

@ -206,17 +206,18 @@ impl Scene for MainScene {
let transform_uniform =
Transform::create_buffer(&app_context.memory_allocator, &state.instances)?;
SimplePipeline::record_render_commands(
SimplePipeline::record_bind_commands(
&mut builder,
&app_context.descriptor_set_allocator,
state.simple_pipeline.pipeline(),
&state.square,
&transform_uniform,
&SimplePipelineRenderData {
mesh: &state.square,
mvp_uniform: &camera_uniform,
texture: &state.texture,
instances: &transform_uniform,
},
)?;
SimplePipeline::record_draw_commands(&mut builder, &state.square, &transform_uniform)?;
RenderPassManager::end_rendering(&mut builder)?;