Skip to content

Commit d1ef60b

Browse files
committed
[update] how the render pipelines & primitive assembler process buffers.
1 parent 41871eb commit d1ef60b

8 files changed

Lines changed: 91 additions & 37 deletions

File tree

crates/lambda-platform/src/gfx/assembler.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use super::{
1313
};
1414

1515
/// Attributes for a vertex.
16+
#[derive(Debug, Clone)]
1617
pub struct VertexAttribute {
1718
pub location: u32,
1819
pub offset: u32,
@@ -39,8 +40,8 @@ impl PrimitiveAssemblerBuilder {
3940
pub fn build<'shader, RenderBackend: gfx_hal::Backend>(
4041
&'shader mut self,
4142
vertex_shader: &'shader super::shader::ShaderModule<RenderBackend>,
42-
buffers: Option<&Vec<Buffer<RenderBackend>>>,
43-
attributes: Option<&Vec<VertexAttribute>>,
43+
buffers: Option<&Vec<&Buffer<RenderBackend>>>,
44+
attributes: Option<&[VertexAttribute]>,
4445
) -> PrimitiveAssembler<'shader, RenderBackend> {
4546
let binding = self.buffer_descriptions.len() as u32;
4647

crates/lambda-platform/src/gfx/gpu.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ impl<RenderBackend: gfx_hal::Backend> Gpu<RenderBackend> {
182182

183183
return Ok(());
184184
}
185+
186+
pub(super) fn logical_device(&self) -> &RenderBackend::Device {
187+
return &self.gpu.device;
188+
}
185189
}
186190

187191
#[cfg(test)]

crates/lambda-platform/src/gfx/pipeline.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ use std::ops::Range;
3636
use gfx_hal::device::Device;
3737

3838
use super::{
39+
assembler::VertexAttribute,
3940
buffer::Buffer,
4041
gpu::Gpu,
4142
shader::ShaderModule,
@@ -45,6 +46,8 @@ use super::{
4546
pub struct RenderPipelineBuilder<RenderBackend: internal::Backend> {
4647
pipeline_layout: Option<RenderBackend::PipelineLayout>,
4748
push_constants: Vec<PushConstantUpload>,
49+
buffers: Vec<Buffer<RenderBackend>>,
50+
attributes: Vec<VertexAttribute>,
4851
}
4952

5053
pub type PipelineStage = gfx_hal::pso::ShaderStageFlags;
@@ -56,19 +59,27 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
5659
return Self {
5760
pipeline_layout: None,
5861
push_constants: Vec::new(),
62+
buffers: Vec::new(),
63+
attributes: Vec::new(),
5964
};
6065
}
6166

62-
pub fn with_buffer(&mut self, buffer: &Buffer<RenderBackend>) -> &mut Self {
63-
todo!()
67+
pub fn with_buffer(
68+
&mut self,
69+
buffer: Buffer<RenderBackend>,
70+
attributes: Vec<VertexAttribute>,
71+
) -> &mut Self {
72+
self.buffers.push(buffer);
73+
self.attributes.extend(attributes);
74+
return self;
6475
}
6576

6677
/// Adds a push constant to the render pipeline at the set PipelineStage(s)
6778
pub fn with_push_constant(
68-
mut self,
79+
&mut self,
6980
stage: PipelineStage,
7081
bytes: u32,
71-
) -> Self {
82+
) -> &mut Self {
7283
self.push_constants.push((stage, 0..bytes));
7384
return self;
7485
}
@@ -91,6 +102,8 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
91102
render_pass: &super::render_pass::RenderPass<RenderBackend>,
92103
vertex_shader: &ShaderModule<RenderBackend>,
93104
fragment_shader: Option<&ShaderModule<RenderBackend>>,
105+
buffers: &Vec<&Buffer<RenderBackend>>,
106+
attributes: &[VertexAttribute],
94107
) -> RenderPipeline<RenderBackend> {
95108
// TODO(vmarcella): The pipeline layout should be configurable through the
96109
// RenderPipelineBuilder.
@@ -109,7 +122,8 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
109122
// TODO(vmarcella): The primitive assembler should be configurable through
110123
// the RenderPipelineBuilder so that buffers & attributes can be bound.
111124
let mut builder = super::assembler::PrimitiveAssemblerBuilder::new();
112-
let primitive_assembler = builder.build(vertex_shader, None, None);
125+
let primitive_assembler =
126+
builder.build(vertex_shader, Some(buffers), Some(attributes));
113127

114128
let fragment_entry = match fragment_shader {
115129
Some(shader) => Some(internal::EntryPoint::<RenderBackend> {
@@ -143,14 +157,16 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
143157
});
144158

145159
let pipeline = unsafe {
146-
super::internal::logical_device_for(gpu)
160+
gpu
161+
.logical_device()
147162
.create_graphics_pipeline(&pipeline_desc, None)
148163
.expect("Failed to create graphics pipeline")
149164
};
150165

151166
return RenderPipeline {
152167
pipeline_layout,
153168
pipeline,
169+
buffers: self.buffers,
154170
};
155171
}
156172
}
@@ -160,16 +176,19 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
160176
pub struct RenderPipeline<RenderBackend: internal::Backend> {
161177
pipeline_layout: RenderBackend::PipelineLayout,
162178
pipeline: RenderBackend::GraphicsPipeline,
179+
buffers: Vec<Buffer<RenderBackend>>,
163180
}
164181

165182
impl<RenderBackend: internal::Backend> RenderPipeline<RenderBackend> {
166183
/// Destroys the pipeline layout and graphical pipeline
167184
pub fn destroy(self, gpu: &super::gpu::Gpu<RenderBackend>) {
168185
unsafe {
169-
super::gpu::internal::logical_device_for(gpu)
186+
gpu
187+
.logical_device()
170188
.destroy_pipeline_layout(self.pipeline_layout);
171189

172-
super::gpu::internal::logical_device_for(gpu)
190+
gpu
191+
.logical_device()
173192
.destroy_graphics_pipeline(self.pipeline);
174193
}
175194
}

crates/lambda-platform/src/gfx/surface.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ impl SurfaceBuilder {
3939
let gfx_hal_surface = super::internal::create_surface(instance, window);
4040
let name = match self.name {
4141
Some(name) => name,
42-
None => "LambdaSurface".to_string(),
42+
None => "RenderSurface".to_string(),
4343
};
4444

4545
return Surface {

lambda/src/core/render/buffer.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ pub struct Buffer {
2525
buffer_type: BufferType,
2626
}
2727

28+
impl Buffer {
29+
/// Retrieve a reference to the internal buffer.
30+
pub(super) fn internal_buffer(
31+
&self,
32+
) -> &internal::Buffer<super::internal::RenderBackend> {
33+
return &self.buffer;
34+
}
35+
}
36+
2837
/// A buffer is a block of memory that can be used to store data that can be
2938
/// accessed by the GPU. The buffer is created with a length, usage, and
3039
/// properties that determine how the buffer can be used.

lambda/src/core/render/mesh.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ pub struct Mesh {
1818
buffer: Buffer,
1919
}
2020

21+
impl Mesh {
22+
pub(super) fn buffer(&self) -> &Buffer {
23+
return &self.buffer;
24+
}
25+
}
26+
2127
// ------------------------------ MeshBuilder ---------------------------------
2228

2329
/// Construction for a mesh.

lambda/src/core/render/pipeline.rs

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
use std::rc::Rc;
22

3-
use lambda_platform::gfx::shader::{
4-
ShaderModuleBuilder,
5-
ShaderModuleType,
3+
use lambda_platform::gfx::{
4+
assembler::VertexAttribute,
5+
buffer::Buffer as InternalBuffer,
6+
shader::{
7+
ShaderModuleBuilder,
8+
ShaderModuleType,
9+
},
610
};
711

812
use super::{
@@ -12,7 +16,6 @@ use super::{
1216
mut_gpu_from_context,
1317
RenderBackend,
1418
},
15-
render_pass::internal::platform_render_pass_from_render_pass,
1619
shader::Shader,
1720
RenderContext,
1821
};
@@ -47,19 +50,26 @@ use lambda_platform::gfx::pipeline::PushConstantUpload;
4750
pub struct RenderPipelineBuilder {
4851
push_constants: Vec<PushConstantUpload>,
4952
buffers: Vec<Buffer>,
53+
attributes: Vec<VertexAttribute>,
5054
}
5155

5256
impl RenderPipelineBuilder {
5357
pub fn new() -> Self {
5458
return Self {
5559
push_constants: Vec::new(),
5660
buffers: Vec::new(),
61+
attributes: Vec::new(),
5762
};
5863
}
5964

6065
/// Adds a buffer to the render pipeline.
61-
pub fn with_buffer(&mut self, buffer: Buffer) -> &mut Self {
66+
pub fn with_buffer(
67+
&mut self,
68+
buffer: Buffer,
69+
attributes: Vec<VertexAttribute>,
70+
) -> &mut Self {
6271
self.buffers.push(buffer);
72+
self.attributes.extend(attributes);
6373
return self;
6474
}
6575

@@ -95,15 +105,24 @@ impl RenderPipelineBuilder {
95105
None => None,
96106
};
97107

98-
let render_pipeline =
99-
lambda_platform::gfx::pipeline::RenderPipelineBuilder::new()
100-
.with_push_constants(self.push_constants.clone())
101-
.build(
102-
gpu_from_context(render_context),
103-
&platform_render_pass_from_render_pass(render_pass),
104-
&vertex_shader_module,
105-
fragment_shader_module.as_ref(),
106-
);
108+
let builder = lambda_platform::gfx::pipeline::RenderPipelineBuilder::new();
109+
110+
let internal_buffers = self
111+
.buffers
112+
.iter()
113+
.map(|b| b.internal_buffer())
114+
.collect::<Vec<&InternalBuffer<RenderBackend>>>();
115+
116+
let render_pipeline = builder
117+
.with_push_constants(self.push_constants.clone())
118+
.build(
119+
gpu_from_context(render_context),
120+
render_pass.internal_render_pass(),
121+
&vertex_shader_module,
122+
fragment_shader_module.as_ref(),
123+
&internal_buffers,
124+
self.attributes.as_slice(),
125+
);
107126

108127
// Clean up shader modules.
109128
vertex_shader_module.destroy(mut_gpu_from_context(render_context));

lambda/src/core/render/render_pass.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,15 @@ impl RenderPass {
2020
.destroy(gpu_from_context(render_context));
2121
}
2222

23+
/// Retrieve a reference to the lower level render pass.
24+
pub(super) fn internal_render_pass(
25+
&self,
26+
) -> &Rc<render_pass::RenderPass<super::internal::RenderBackend>> {
27+
return &self.render_pass;
28+
}
29+
2330
/// Converts
24-
pub fn into_gfx_render_pass(
31+
pub(super) fn into_gfx_render_pass(
2532
&self,
2633
) -> Rc<render_pass::RenderPass<super::internal::RenderBackend>> {
2734
return self.render_pass.clone();
@@ -45,14 +52,3 @@ impl RenderPassBuilder {
4552
};
4653
}
4754
}
48-
49-
pub(crate) mod internal {
50-
use crate::core::render::internal::RenderBackend;
51-
52-
/// Converts a render pass into a platform render pass.
53-
pub fn platform_render_pass_from_render_pass(
54-
render_pass: &super::RenderPass,
55-
) -> &lambda_platform::gfx::render_pass::RenderPass<RenderBackend> {
56-
return &render_pass.render_pass;
57-
}
58-
}

0 commit comments

Comments
 (0)