Skip to content

Commit e82d7e4

Browse files
committed
[fix] 3D demo to load the color to the correct location.
1 parent 2a8f379 commit e82d7e4

7 files changed

Lines changed: 100 additions & 26 deletions

File tree

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ impl PrimitiveAssemblerBuilder {
4747

4848
match (buffers, attributes) {
4949
(Some(buffers), Some(attributes)) => {
50+
println!(
51+
"[DEBUG] Building primitive assembler with buffers and attributes"
52+
);
5053
self.buffer_descriptions = buffers
5154
.iter()
5255
.map(|buffer| VertexBufferDesc {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ impl BufferBuilder {
109109

110110
// TODO(vmarcella): Add the ability for the user to specify the memory
111111
// properties (I.E. SparseFlags::SPARSE_MEMORY).
112+
println!("[DEBUG] Creating buffer of length: {}", self.buffer_length);
112113
let buffer_result = unsafe {
113114
logical_device.create_buffer(
114115
self.buffer_length as u64,
@@ -127,6 +128,7 @@ impl BufferBuilder {
127128
unsafe { logical_device.get_buffer_requirements(&buffer) };
128129
let memory_types = physical_device.memory_properties().memory_types;
129130

131+
println!("[DEBUG] Buffer requirements: {:?}", requirements);
130132
// Find a memory type that supports the requirements of the buffer.
131133
let memory_type = memory_types
132134
.iter()
@@ -138,6 +140,7 @@ impl BufferBuilder {
138140
.map(|(id, _)| MemoryTypeId(id))
139141
.unwrap();
140142

143+
println!("Allocating memory for buffer.");
141144
// Allocates the memory on the GPU for the buffer.
142145
let buffer_memory_allocation =
143146
unsafe { logical_device.allocate_memory(memory_type, requirements.size) };

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

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

3838
use super::{
39-
assembler::VertexAttribute,
39+
assembler::{
40+
PrimitiveAssemblerBuilder,
41+
VertexAttribute,
42+
},
4043
buffer::Buffer,
4144
gpu::Gpu,
4245
shader::ShaderModule,
@@ -110,9 +113,8 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
110113
let push_constants = self.push_constants.into_iter();
111114

112115
let pipeline_layout = unsafe {
113-
use internal::Device;
114-
115-
super::internal::logical_device_for(gpu)
116+
gpu
117+
.internal_logical_device()
116118
.create_pipeline_layout(vec![].into_iter(), push_constants)
117119
.expect(
118120
"The GPU does not have enough memory to allocate a pipeline layout",
@@ -121,15 +123,15 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
121123

122124
// TODO(vmarcella): The primitive assembler should be configurable through
123125
// the RenderPipelineBuilder so that buffers & attributes can be bound.
124-
let mut builder = super::assembler::PrimitiveAssemblerBuilder::new();
126+
let mut builder = PrimitiveAssemblerBuilder::new();
125127
let primitive_assembler =
126128
builder.build(vertex_shader, Some(buffers), Some(attributes));
127129

128130
let fragment_entry = match fragment_shader {
129131
Some(shader) => Some(internal::EntryPoint::<RenderBackend> {
130132
entry: shader.entry(),
131133
module: super::internal::module_for(shader),
132-
specialization: gfx_hal::pso::Specialization::default(),
134+
specialization: shader.specializations().clone(),
133135
}),
134136
None => None,
135137
};
@@ -157,10 +159,14 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
157159
});
158160

159161
let pipeline = unsafe {
160-
gpu
162+
let pipeline_build_result = gpu
161163
.internal_logical_device()
162-
.create_graphics_pipeline(&pipeline_desc, None)
163-
.expect("Failed to create graphics pipeline")
164+
.create_graphics_pipeline(&pipeline_desc, None);
165+
166+
match pipeline_build_result {
167+
Ok(pipeline) => pipeline,
168+
Err(e) => panic!("Failed to create graphics pipeline: {:?}", e),
169+
}
164170
};
165171

166172
return RenderPipeline {
@@ -182,7 +188,12 @@ pub struct RenderPipeline<RenderBackend: internal::Backend> {
182188
impl<RenderBackend: internal::Backend> RenderPipeline<RenderBackend> {
183189
/// Destroys the pipeline layout and graphical pipeline
184190
pub fn destroy(self, gpu: &super::gpu::Gpu<RenderBackend>) {
191+
println!("Destroying render pipeline");
185192
unsafe {
193+
for buffer in self.buffers {
194+
buffer.destroy(gpu);
195+
}
196+
186197
gpu
187198
.internal_logical_device()
188199
.destroy_pipeline_layout(self.pipeline_layout);

lambda/examples/push_constants.rs

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use lambda::{
22
core::{
33
component::Component,
4+
events::WindowEvent,
45
render::{
56
buffer::BufferBuilder,
67
command::RenderCommand,
@@ -47,7 +48,7 @@ use lambda_platform::{
4748
const VERTEX_SHADER_SOURCE: &str = r#"
4849
#version 450
4950
50-
layout (location = 0) in vec2 vertex_position;
51+
layout (location = 0) in vec3 vertex_position;
5152
layout (location = 1) in vec3 vertex_normal;
5253
layout (location = 2) in vec3 vertex_color;
5354
@@ -59,7 +60,7 @@ layout ( push_constant ) uniform PushConstant {
5960
} push_constants;
6061
6162
void main() {
62-
gl_Position = push_constants.render_matrix * vec4(vertex_position, 0.0, 1.0);
63+
gl_Position = push_constants.render_matrix * vec4(vertex_position, 1.0);
6364
frag_color = vertex_color;
6465
}
6566
@@ -103,9 +104,13 @@ pub fn push_constants_to_bytes(push_constants: &PushConstant) -> &[u32] {
103104
pub struct PushConstantsExample {
104105
frame_number: u64,
105106
shader: Shader,
107+
fs: Shader,
106108
mesh: Option<Mesh>,
107109
render_pipeline: Option<ResourceId>,
108110
render_pass: Option<ResourceId>,
111+
last_frame: std::time::Duration,
112+
width: u32,
113+
height: u32,
109114
}
110115

111116
impl Component for PushConstantsExample {
@@ -119,17 +124,17 @@ impl Component for PushConstantsExample {
119124
// Create triangle mesh.
120125
let vertices = [
121126
VertexBuilder::new()
122-
.with_position([0.0, 0.5, 0.0])
127+
.with_position([1.0, 1.0, 0.0])
123128
.with_normal([0.0, 0.0, 0.0])
124129
.with_color([1.0, 0.0, 0.0])
125130
.build(),
126131
VertexBuilder::new()
127-
.with_position([-0.5, -0.5, 0.0])
132+
.with_position([-1.0, 1.0, 0.0])
128133
.with_normal([0.0, 0.0, 0.0])
129134
.with_color([0.0, 1.0, 0.0])
130135
.build(),
131136
VertexBuilder::new()
132-
.with_position([0.5, -0.5, 0.0])
137+
.with_position([0.0, -1.0, 0.0])
133138
.with_normal([0.0, 0.0, 0.0])
134139
.with_color([0.0, 0.0, 1.0])
135140
.build(),
@@ -151,24 +156,26 @@ impl Component for PushConstantsExample {
151156
},
152157
},
153158
VertexAttribute {
154-
location: 1,
159+
location: 2,
155160
offset: 0,
156161
element: VertexElement {
157162
format: ColorFormat::Rgb32Sfloat,
158-
offset: 12,
163+
offset: 24,
159164
},
160165
},
161166
])
162167
.build();
163168

169+
println!("mesh: {:?}", mesh);
170+
164171
let pipeline = RenderPipelineBuilder::new()
165172
.with_push_constant(PipelineStage::VERTEX, push_constant_size)
166173
.with_buffer(
167174
BufferBuilder::build_from_mesh(&mesh, render_context)
168175
.expect("Failed to create buffer"),
169176
mesh.attributes().to_vec(),
170177
)
171-
.build(render_context, &render_pass, &self.shader, None);
178+
.build(render_context, &render_pass, &self.shader, Some(&self.fs));
172179

173180
self.render_pass = Some(render_context.attach_render_pass(render_pass));
174181
self.render_pipeline = Some(render_context.attach_pipeline(pipeline));
@@ -183,11 +190,26 @@ impl Component for PushConstantsExample {
183190
}
184191

185192
fn on_event(&mut self, event: lambda::core::events::Events) {
186-
println!("Event: {:?}", event);
193+
match event {
194+
lambda::core::events::Events::Window { event, issued_at } => {
195+
match event {
196+
WindowEvent::Resize { width, height } => {
197+
self.width = width;
198+
self.height = height;
199+
println!("Window resized to {}x{}", width, height);
200+
}
201+
_ => {}
202+
}
203+
}
204+
_ => {}
205+
}
187206
}
188207

189208
/// Update the frame number every frame.
190-
fn on_update(&mut self, last_frame: &std::time::Duration) {}
209+
fn on_update(&mut self, last_frame: &std::time::Duration) {
210+
self.last_frame = *last_frame;
211+
self.frame_number += 1;
212+
}
191213

192214
fn on_render(
193215
&mut self,
@@ -198,22 +220,26 @@ impl Component for PushConstantsExample {
198220
let view: [[f32; 4]; 4] = matrix::translation_matrix(camera);
199221

200222
// Create a projection matrix.
201-
let mut projection: [[f32; 4]; 4] =
202-
matrix::perspective_matrix(0.25, 1700.0 / 900.0, 0.1, 200.0);
203-
projection.as_mut()[1].as_mut()[1] *= -1.0;
223+
let mut projection: [[f32; 4]; 4] = matrix::perspective_matrix(
224+
0.25,
225+
(self.width / self.height) as f32,
226+
0.1,
227+
200.0,
228+
);
204229

205230
// Rotate model.
206231
let model: [[f32; 4]; 4] = matrix::rotate_matrix(
207-
matrix::filled_matrix(4, 4, 1.0),
232+
matrix::identity_matrix(4, 4),
208233
[0.0, 1.0, 0.0],
209-
0.4 * self.frame_number as f32,
234+
0.001 * self.frame_number as f32,
210235
);
211236

212237
// Create render matrix.
213238
let mesh_matrix = projection.multiply(&view).multiply(&model);
214239

215240
// Create viewport.
216-
let viewport = viewport::ViewportBuilder::new().build(800, 600);
241+
let viewport =
242+
viewport::ViewportBuilder::new().build(self.width, self.height);
217243

218244
let render_pipeline = self
219245
.render_pipeline
@@ -271,15 +297,27 @@ impl Default for PushConstantsExample {
271297
name: "push_constants".to_string(),
272298
};
273299

300+
let triangle_fragment_shader = VirtualShader::Source {
301+
source: FRAGMENT_SHADER_SOURCE.to_string(),
302+
kind: ShaderKind::Fragment,
303+
entry_point: "main".to_string(),
304+
name: "push_constants".to_string(),
305+
};
306+
274307
let mut builder = ShaderBuilder::new();
275308
let shader = builder.build(triangle_in_3d);
309+
let fs = builder.build(triangle_fragment_shader);
276310

277311
return Self {
278312
frame_number: 0,
279313
shader,
314+
fs,
315+
last_frame: std::time::Duration::from_secs(0),
280316
mesh: None,
281317
render_pipeline: None,
282318
render_pass: None,
319+
width: 800,
320+
height: 600,
283321
};
284322
}
285323
}
@@ -291,6 +329,9 @@ fn main() {
291329
.with_dimensions(800, 600)
292330
.with_name("3D Push Constants Example");
293331
})
332+
.with_renderer_configured_as(|renderer_builder| {
333+
return renderer_builder.with_render_timeout(1_000_000_000);
334+
})
294335
.with_component(move |runtime, triangles: PushConstantsExample| {
295336
return (runtime, triangles);
296337
})

lambda/src/core/render/buffer.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub use lambda_platform::gfx::buffer::{
1818

1919
use super::{
2020
mesh::Mesh,
21+
vertex::Vertex,
2122
RenderContext,
2223
};
2324

@@ -77,7 +78,7 @@ impl BufferBuilder {
7778
let mut buffer_builder = Self::new();
7879
let internal_buffer = buffer_builder
7980
.buffer_builder
80-
.with_length(mesh.vertices().len())
81+
.with_length(mesh.vertices().len() * std::mem::size_of::<Vertex>())
8182
.with_usage(Usage::VERTEX)
8283
.with_properties(Properties::CPU_VISIBLE)
8384
.build(

lambda/src/core/render/pipeline.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,21 @@ impl RenderPipelineBuilder {
108108
vertex_shader: &Shader,
109109
fragment_shader: Option<&Shader>,
110110
) -> RenderPipeline {
111+
println!("[DEBUG] Building render pipeline...");
112+
113+
print!("[DEBUG] Building vertex shader... ");
111114
let vertex_shader_module = ShaderModuleBuilder::new().build(
112115
render_context.internal_mutable_gpu(),
113116
&vertex_shader.as_binary(),
114117
ShaderModuleType::Vertex,
115118
);
116119

120+
println!(
121+
" Done. (Vertex shader: {} bytes)",
122+
vertex_shader.as_binary().len()
123+
);
124+
125+
print!("[DEBUG] Building fragment shader... ");
117126
let fragment_shader_module = match fragment_shader {
118127
Some(shader) => Some(ShaderModuleBuilder::new().build(
119128
render_context.internal_mutable_gpu(),
@@ -123,6 +132,11 @@ impl RenderPipelineBuilder {
123132
None => None,
124133
};
125134

135+
println!(
136+
" Done. (Fragment shader: {} bytes)",
137+
fragment_shader.map(|s| s.as_binary().len()).unwrap_or(0)
138+
);
139+
126140
let builder = lambda_platform::gfx::pipeline::RenderPipelineBuilder::new();
127141

128142
let buffers = self.buffers;

lambda/src/runtimes/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ impl Runtime for GenericRuntime {
312312

313313
match mapped_event {
314314
Some(event) => {
315+
println!("Sending event: {:?} to all components", event);
315316
for component in &mut component_stack {
316317
component.on_event(event.clone());
317318
}

0 commit comments

Comments
 (0)