Split record_render_commands and bind_commands
This commit is contained in:
parent
078e9daba9
commit
f91c0792b2
6 changed files with 83 additions and 85 deletions
|
@ -1,26 +1,61 @@
|
||||||
use std::{error::Error, sync::Arc};
|
use std::{error::Error, sync::Arc};
|
||||||
|
|
||||||
use vulkano::{
|
use vulkano::{
|
||||||
buffer::Subbuffer,
|
buffer::{IndexBuffer, Subbuffer},
|
||||||
command_buffer::{
|
command_buffer::{AutoCommandBufferBuilder, PrimaryAutoCommandBuffer},
|
||||||
AutoCommandBufferBuilder, PrimaryAutoCommandBuffer, RenderPassBeginInfo, SubpassBeginInfo,
|
|
||||||
SubpassEndInfo,
|
|
||||||
},
|
|
||||||
descriptor_set::allocator::StandardDescriptorSetAllocator,
|
descriptor_set::allocator::StandardDescriptorSetAllocator,
|
||||||
pipeline::GraphicsPipeline,
|
pipeline::GraphicsPipeline,
|
||||||
render_pass::{Framebuffer, RenderPass},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pub trait AsRecordable<T> {
|
pub trait AsRecordable<T, V, MI, I>
|
||||||
fn record_render_commands(
|
where
|
||||||
|
MI: Into<IndexBuffer> + Clone,
|
||||||
|
{
|
||||||
|
fn record_bind_commands(
|
||||||
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
||||||
descriptor_set_allocator: &Arc<StandardDescriptorSetAllocator>,
|
descriptor_set_allocator: &Arc<StandardDescriptorSetAllocator>,
|
||||||
pipeline: &Arc<GraphicsPipeline>,
|
pipeline: &Arc<GraphicsPipeline>,
|
||||||
data: &T,
|
mesh: &impl AsRenderableMesh<V, MI>,
|
||||||
|
instances: &impl AsRenderableMeshInstance<I>,
|
||||||
|
extra_data: &T,
|
||||||
) -> Result<(), Box<dyn Error>>;
|
) -> Result<(), Box<dyn Error>>;
|
||||||
|
|
||||||
|
fn record_draw_commands(
|
||||||
|
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
||||||
|
mesh: &impl AsRenderableMesh<V, MI>,
|
||||||
|
instances: &impl AsRenderableMeshInstance<I>,
|
||||||
|
) -> Result<(), Box<dyn Error>> {
|
||||||
|
match mesh.index_buffer() {
|
||||||
|
Some(index_buffer) => {
|
||||||
|
builder.bind_index_buffer(index_buffer.clone())?;
|
||||||
|
unsafe {
|
||||||
|
builder.draw_indexed(
|
||||||
|
mesh.index_count(),
|
||||||
|
instances.instance_count(),
|
||||||
|
mesh.first_index(),
|
||||||
|
mesh.vertex_offset(),
|
||||||
|
instances.first_instance(),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => unsafe {
|
||||||
|
builder.draw(
|
||||||
|
mesh.vertex_count(),
|
||||||
|
instances.instance_count(),
|
||||||
|
mesh.first_vertex(),
|
||||||
|
instances.first_instance(),
|
||||||
|
)?;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait AsRenderableMesh<V, I> {
|
pub trait AsRenderableMesh<V, I>
|
||||||
|
where
|
||||||
|
I: Into<IndexBuffer> + Clone,
|
||||||
|
{
|
||||||
fn vertex_buffer(&self) -> &Subbuffer<[V]>;
|
fn vertex_buffer(&self) -> &Subbuffer<[V]>;
|
||||||
|
|
||||||
fn vertex_count(&self) -> u32;
|
fn vertex_count(&self) -> u32;
|
||||||
|
@ -33,7 +68,7 @@ pub trait AsRenderableMesh<V, I> {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
||||||
fn index_buffer(&self) -> Option<&Subbuffer<[I]>> {
|
fn index_buffer(&self) -> Option<&I> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,41 +79,14 @@ pub trait AsRenderableMesh<V, I> {
|
||||||
fn first_index(&self) -> u32 {
|
fn first_index(&self) -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn index_offset(&self) -> i32 {
|
pub trait AsRenderableMeshInstance<T> {
|
||||||
|
fn instance_buffer(&self) -> &Subbuffer<[T]>;
|
||||||
|
|
||||||
|
fn instance_count(&self) -> u32;
|
||||||
|
|
||||||
|
fn first_instance(&self) -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait AsRenderPassRecordable<T> {
|
|
||||||
fn begin_render_pass(
|
|
||||||
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
|
||||||
_render_pass: &Arc<RenderPass>,
|
|
||||||
framebuffer: &Arc<Framebuffer>,
|
|
||||||
clear_values: Vec<Option<vulkano::format::ClearValue>>,
|
|
||||||
) -> Result<(), Box<dyn Error>> {
|
|
||||||
builder.begin_render_pass(
|
|
||||||
RenderPassBeginInfo {
|
|
||||||
clear_values,
|
|
||||||
..RenderPassBeginInfo::framebuffer(framebuffer.clone())
|
|
||||||
},
|
|
||||||
SubpassBeginInfo {
|
|
||||||
contents: vulkano::command_buffer::SubpassContents::Inline,
|
|
||||||
..Default::default()
|
|
||||||
},
|
|
||||||
)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end_render_pass(
|
|
||||||
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
|
||||||
) -> Result<(), Box<dyn Error>> {
|
|
||||||
builder.end_render_pass(SubpassEndInfo::default())?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn record_render_pass_commands(
|
|
||||||
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
|
||||||
data: &T,
|
|
||||||
) -> Result<(), Box<dyn Error>>;
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ pub mod vertex;
|
||||||
|
|
||||||
pub mod resource;
|
pub mod resource;
|
||||||
pub use buffer::{AsBindableBuffer, AsIndexBuffer, AsUniformBuffer, AsVertexBuffer};
|
pub use buffer::{AsBindableBuffer, AsIndexBuffer, AsUniformBuffer, AsVertexBuffer};
|
||||||
pub use command::{AsRecordable, AsRenderableMesh};
|
pub use command::{AsRecordable, AsRenderableMesh, AsRenderableMeshInstance};
|
||||||
|
|
||||||
pub trait AsBindableDescriptorSet<T> {
|
pub trait AsBindableDescriptorSet<T> {
|
||||||
fn as_descriptor_set_layout_bindings() -> BTreeMap<u32, DescriptorSetLayoutBinding>;
|
fn as_descriptor_set_layout_bindings() -> BTreeMap<u32, DescriptorSetLayoutBinding>;
|
||||||
|
|
|
@ -10,6 +10,8 @@ use vulkano::{
|
||||||
|
|
||||||
use crate::core::render::primitives::{AsBindableBuffer, AsVertexBuffer};
|
use crate::core::render::primitives::{AsBindableBuffer, AsVertexBuffer};
|
||||||
|
|
||||||
|
use super::command::AsRenderableMeshInstance;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Transform {
|
pub struct Transform {
|
||||||
pub position: Vec3,
|
pub position: Vec3,
|
||||||
|
@ -161,3 +163,13 @@ impl AsBindableBuffer<TransformRaw> for TransformRaw {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AsVertexBuffer<TransformRaw> for TransformRaw {}
|
impl AsVertexBuffer<TransformRaw> for TransformRaw {}
|
||||||
|
|
||||||
|
impl AsRenderableMeshInstance<TransformRaw> for Subbuffer<[TransformRaw]> {
|
||||||
|
fn instance_buffer(&self) -> &Subbuffer<[TransformRaw]> {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn instance_count(&self) -> u32 {
|
||||||
|
self.len() as u32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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]> {
|
fn vertex_buffer(&self) -> &Subbuffer<[Vertex3D]> {
|
||||||
&self.vertex_buffer
|
&self.vertex_buffer
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,20 +28,15 @@ use vulkano::{
|
||||||
|
|
||||||
use crate::core::render::{
|
use crate::core::render::{
|
||||||
primitives::{
|
primitives::{
|
||||||
AsBindableDescriptorSet, AsRecordable, AsRenderableMesh, mvp::Mvp, transform::TransformRaw,
|
AsBindableDescriptorSet, AsRecordable, AsRenderableMesh, AsRenderableMeshInstance,
|
||||||
vertex::Vertex3D,
|
mvp::Mvp, transform::TransformRaw, vertex::Vertex3D,
|
||||||
},
|
},
|
||||||
texture::Texture,
|
texture::Texture,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct SimplePipelineRenderData<'a, T>
|
pub struct SimplePipelineRenderData<'a> {
|
||||||
where
|
|
||||||
T: AsRenderableMesh<Vertex3D, u32>,
|
|
||||||
{
|
|
||||||
pub mesh: &'a T,
|
|
||||||
pub mvp_uniform: &'a Subbuffer<[Mvp]>,
|
pub mvp_uniform: &'a Subbuffer<[Mvp]>,
|
||||||
pub texture: &'a Texture,
|
pub texture: &'a Texture,
|
||||||
pub instances: &'a Subbuffer<[TransformRaw]>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct SimplePipeline {
|
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
|
for SimplePipeline
|
||||||
{
|
{
|
||||||
fn record_render_commands(
|
fn record_bind_commands(
|
||||||
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
builder: &mut AutoCommandBufferBuilder<PrimaryAutoCommandBuffer>,
|
||||||
descriptor_set_allocator: &Arc<StandardDescriptorSetAllocator>,
|
descriptor_set_allocator: &Arc<StandardDescriptorSetAllocator>,
|
||||||
pipeline: &Arc<GraphicsPipeline>,
|
pipeline: &Arc<GraphicsPipeline>,
|
||||||
data: &SimplePipelineRenderData<'a, T>,
|
mesh: &impl AsRenderableMesh<Vertex3D, Subbuffer<[u32]>>,
|
||||||
|
instances: &impl AsRenderableMeshInstance<TransformRaw>,
|
||||||
|
data: &SimplePipelineRenderData<'a>,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
let layouts = pipeline.layout().set_layouts();
|
let layouts = pipeline.layout().set_layouts();
|
||||||
|
|
||||||
|
@ -158,32 +155,12 @@ impl<'a, T: AsRenderableMesh<Vertex3D, u32>> AsRecordable<SimplePipelineRenderDa
|
||||||
|
|
||||||
builder.bind_vertex_buffers(
|
builder.bind_vertex_buffers(
|
||||||
0,
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,17 +206,18 @@ impl Scene for MainScene {
|
||||||
let transform_uniform =
|
let transform_uniform =
|
||||||
Transform::create_buffer(&app_context.memory_allocator, &state.instances)?;
|
Transform::create_buffer(&app_context.memory_allocator, &state.instances)?;
|
||||||
|
|
||||||
SimplePipeline::record_render_commands(
|
SimplePipeline::record_bind_commands(
|
||||||
&mut builder,
|
&mut builder,
|
||||||
&app_context.descriptor_set_allocator,
|
&app_context.descriptor_set_allocator,
|
||||||
state.simple_pipeline.pipeline(),
|
state.simple_pipeline.pipeline(),
|
||||||
|
&state.square,
|
||||||
|
&transform_uniform,
|
||||||
&SimplePipelineRenderData {
|
&SimplePipelineRenderData {
|
||||||
mesh: &state.square,
|
|
||||||
mvp_uniform: &camera_uniform,
|
mvp_uniform: &camera_uniform,
|
||||||
texture: &state.texture,
|
texture: &state.texture,
|
||||||
instances: &transform_uniform,
|
|
||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
|
SimplePipeline::record_draw_commands(&mut builder, &state.square, &transform_uniform)?;
|
||||||
|
|
||||||
RenderPassManager::end_rendering(&mut builder)?;
|
RenderPassManager::end_rendering(&mut builder)?;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue