Skip to content

Commit ea79609

Browse files
committed
[remove] pipeline stages from being used when setting immediates as they're no longer required by wgpu.
1 parent 183a049 commit ea79609

File tree

11 files changed

+71
-117
lines changed

11 files changed

+71
-117
lines changed

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

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::wgpu::{
1515
vertex::ColorFormat,
1616
};
1717

18-
/// Shader stage flags for immediate data and visibility.
18+
/// Shader stage flags for visibility.
1919
#[derive(Clone, Copy, Debug)]
2020
///
2121
/// This wrapper avoids exposing `wgpu` directly to higher layers while still
@@ -51,10 +51,9 @@ impl std::ops::BitOrAssign for PipelineStage {
5151
}
5252
}
5353

54-
/// Immediate data declaration for a stage and byte range.
54+
/// Immediate data declaration for a byte range.
5555
#[derive(Clone, Debug)]
5656
pub struct ImmediateDataRange {
57-
pub stages: PipelineStage,
5857
pub range: Range<u32>,
5958
}
6059

@@ -336,7 +335,7 @@ impl<'a> PipelineLayoutBuilder<'a> {
336335
return self;
337336
}
338337

339-
/// Provide immediate data ranges for shader stages.
338+
/// Provide immediate data byte ranges.
340339
pub fn with_immediate_data_ranges(
341340
mut self,
342341
ranges: Vec<ImmediateDataRange>,
@@ -402,7 +401,6 @@ mod immediate_size_tests {
402401
use super::{
403402
validate_and_calculate_immediate_size,
404403
ImmediateDataRange,
405-
PipelineStage,
406404
};
407405

408406
#[test]
@@ -414,14 +412,8 @@ mod immediate_size_tests {
414412
#[test]
415413
fn immediate_size_overlapping_ranges_ok() {
416414
let ranges = vec![
417-
ImmediateDataRange {
418-
stages: PipelineStage::VERTEX,
419-
range: 0..64,
420-
},
421-
ImmediateDataRange {
422-
stages: PipelineStage::FRAGMENT,
423-
range: 0..32,
424-
},
415+
ImmediateDataRange { range: 0..64 },
416+
ImmediateDataRange { range: 0..32 },
425417
];
426418
let size = validate_and_calculate_immediate_size(&ranges).unwrap();
427419
assert_eq!(size, 64);
@@ -430,14 +422,8 @@ mod immediate_size_tests {
430422
#[test]
431423
fn immediate_size_contiguous_ranges_ok() {
432424
let ranges = vec![
433-
ImmediateDataRange {
434-
stages: PipelineStage::VERTEX,
435-
range: 0..16,
436-
},
437-
ImmediateDataRange {
438-
stages: PipelineStage::FRAGMENT,
439-
range: 16..32,
440-
},
425+
ImmediateDataRange { range: 0..16 },
426+
ImmediateDataRange { range: 16..32 },
441427
];
442428
let size = validate_and_calculate_immediate_size(&ranges).unwrap();
443429
assert_eq!(size, 32);
@@ -446,25 +432,16 @@ mod immediate_size_tests {
446432
#[test]
447433
fn immediate_size_gap_is_error() {
448434
let ranges = vec![
449-
ImmediateDataRange {
450-
stages: PipelineStage::VERTEX,
451-
range: 0..16,
452-
},
453-
ImmediateDataRange {
454-
stages: PipelineStage::FRAGMENT,
455-
range: 32..48,
456-
},
435+
ImmediateDataRange { range: 0..16 },
436+
ImmediateDataRange { range: 32..48 },
457437
];
458438
let err = validate_and_calculate_immediate_size(&ranges).unwrap_err();
459439
assert!(err.contains("gap"));
460440
}
461441

462442
#[test]
463443
fn immediate_size_non_zero_start_is_error() {
464-
let ranges = vec![ImmediateDataRange {
465-
stages: PipelineStage::VERTEX,
466-
range: 16..32,
467-
}];
444+
let ranges = vec![ImmediateDataRange { range: 16..32 }];
468445
let err = validate_and_calculate_immediate_size(&ranges).unwrap_err();
469446
assert!(err.contains("gap"));
470447
}

crates/lambda-rs/examples/immediates.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ use lambda::{
1616
Mesh,
1717
MeshBuilder,
1818
},
19-
pipeline::{
20-
PipelineStage,
21-
RenderPipelineBuilder,
22-
},
19+
pipeline::RenderPipelineBuilder,
2320
render_pass::RenderPassBuilder,
2421
scene_math::{
2522
compute_model_view_projection_matrix_about_pivot,
@@ -192,7 +189,7 @@ impl Component<ComponentResult, String> for ImmediatesExample {
192189

193190
let pipeline = RenderPipelineBuilder::new()
194191
.with_culling(lambda::render::pipeline::CullingMode::None)
195-
.with_immediate_data(PipelineStage::VERTEX, immediate_data_size)
192+
.with_immediate_data(immediate_data_size)
196193
.with_buffer(
197194
BufferBuilder::build_from_mesh(&mesh, render_context.gpu())
198195
.expect("Failed to create buffer"),
@@ -305,7 +302,6 @@ impl Component<ComponentResult, String> for ImmediatesExample {
305302
},
306303
RenderCommand::Immediates {
307304
pipeline: render_pipeline.clone(),
308-
stage: PipelineStage::VERTEX,
309305
offset: 0,
310306
bytes: Vec::from(immediate_data_to_bytes(&ImmediateData {
311307
data: [0.0, 0.0, 0.0, 0.0],

crates/lambda-rs/examples/reflective_room.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ use lambda::{
3131
pipeline::{
3232
CompareFunction,
3333
CullingMode,
34-
PipelineStage,
3534
RenderPipelineBuilder,
3635
StencilFaceState,
3736
StencilOperation,
@@ -408,7 +407,6 @@ impl Component<ComponentResult, String> for ReflectiveRoomExample {
408407
});
409408
cmds.push(RenderCommand::Immediates {
410409
pipeline: pipe_floor_mask,
411-
stage: PipelineStage::VERTEX,
412410
offset: 0,
413411
bytes: Vec::from(immediate_data_to_words(&ImmediateData {
414412
mvp: mvp_floor.transpose(),
@@ -442,7 +440,6 @@ impl Component<ComponentResult, String> for ReflectiveRoomExample {
442440
});
443441
cmds.push(RenderCommand::Immediates {
444442
pipeline: pipe_reflected,
445-
stage: PipelineStage::VERTEX,
446443
offset: 0,
447444
bytes: Vec::from(immediate_data_to_words(&ImmediateData {
448445
mvp: mvp_reflect.transpose(),
@@ -469,7 +466,6 @@ impl Component<ComponentResult, String> for ReflectiveRoomExample {
469466
});
470467
cmds.push(RenderCommand::Immediates {
471468
pipeline: pipe_floor_visual,
472-
stage: PipelineStage::VERTEX,
473469
offset: 0,
474470
bytes: Vec::from(immediate_data_to_words(&ImmediateData {
475471
mvp: mvp_floor.transpose(),
@@ -493,7 +489,6 @@ impl Component<ComponentResult, String> for ReflectiveRoomExample {
493489
});
494490
cmds.push(RenderCommand::Immediates {
495491
pipeline: pipe_normal,
496-
stage: PipelineStage::VERTEX,
497492
offset: 0,
498493
bytes: Vec::from(immediate_data_to_words(&ImmediateData {
499494
mvp: mvp.transpose(),
@@ -625,7 +620,7 @@ impl ReflectiveRoomExample {
625620
.with_depth_format(DepthFormat::Depth24PlusStencil8)
626621
.with_depth_write(false)
627622
.with_depth_compare(CompareFunction::Always)
628-
.with_immediate_data(PipelineStage::VERTEX, immediate_data_size)
623+
.with_immediate_data(immediate_data_size)
629624
.with_buffer(
630625
BufferBuilder::new()
631626
.with_length(
@@ -677,7 +672,7 @@ impl ReflectiveRoomExample {
677672
// Mirrored transform reverses winding; cull front to keep visible faces.
678673
.with_culling(CullingMode::Front)
679674
.with_depth_format(DepthFormat::Depth24PlusStencil8)
680-
.with_immediate_data(PipelineStage::VERTEX, immediate_data_size)
675+
.with_immediate_data(immediate_data_size)
681676
.with_buffer(
682677
BufferBuilder::new()
683678
.with_length(
@@ -730,7 +725,7 @@ impl ReflectiveRoomExample {
730725
let mut floor_builder = RenderPipelineBuilder::new()
731726
.with_label("floor-visual")
732727
.with_culling(CullingMode::Back)
733-
.with_immediate_data(PipelineStage::VERTEX, immediate_data_size)
728+
.with_immediate_data(immediate_data_size)
734729
.with_buffer(
735730
BufferBuilder::new()
736731
.with_length(
@@ -768,7 +763,7 @@ impl ReflectiveRoomExample {
768763
let mut normal_builder = RenderPipelineBuilder::new()
769764
.with_label("cube-normal")
770765
.with_culling(CullingMode::Back)
771-
.with_immediate_data(PipelineStage::VERTEX, immediate_data_size)
766+
.with_immediate_data(immediate_data_size)
772767
.with_buffer(
773768
BufferBuilder::new()
774769
.with_length(

crates/lambda-rs/examples/textured_cube.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ use lambda::{
2020
Mesh,
2121
MeshBuilder,
2222
},
23-
pipeline::{
24-
PipelineStage,
25-
RenderPipelineBuilder,
26-
},
23+
pipeline::RenderPipelineBuilder,
2724
render_pass::RenderPassBuilder,
2825
scene_math::{
2926
compute_perspective_projection,
@@ -334,7 +331,7 @@ impl Component<ComponentResult, String> for TexturedCubeExample {
334331
let pipeline = RenderPipelineBuilder::new()
335332
.with_culling(lambda::render::pipeline::CullingMode::Back)
336333
.with_depth()
337-
.with_immediate_data(PipelineStage::VERTEX, immediate_data_size)
334+
.with_immediate_data(immediate_data_size)
338335
.with_buffer(
339336
BufferBuilder::build_from_mesh(&mesh, render_context.gpu())
340337
.expect("Failed to create vertex buffer"),
@@ -462,7 +459,6 @@ impl Component<ComponentResult, String> for TexturedCubeExample {
462459
},
463460
RenderCommand::Immediates {
464461
pipeline,
465-
stage: PipelineStage::VERTEX,
466462
offset: 0,
467463
bytes: Vec::from(immediate_data_to_bytes(&ImmediateData {
468464
mvp: mvp.transpose(),

crates/lambda-rs/examples/triangles.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use lambda::{
1111
command::RenderCommand,
1212
pipeline::{
1313
self,
14-
PipelineStage,
1514
},
1615
render_pass,
1716
shader::{
@@ -55,7 +54,7 @@ impl Component<ComponentResult, String> for TrianglesComponent {
5554
let immediate_data_size = std::mem::size_of::<ImmediateData>() as u32;
5655
let pipeline = pipeline::RenderPipelineBuilder::new()
5756
.with_culling(pipeline::CullingMode::None)
58-
.with_immediate_data(PipelineStage::VERTEX, immediate_data_size)
57+
.with_immediate_data(immediate_data_size)
5958
.build(
6059
render_context.gpu(),
6160
render_context.surface_format(),
@@ -146,7 +145,6 @@ impl Component<ComponentResult, String> for TrianglesComponent {
146145
for triangle in triangle_data {
147146
commands.push(RenderCommand::Immediates {
148147
pipeline: render_pipeline.clone(),
149-
stage: PipelineStage::VERTEX,
150148
offset: 0,
151149
bytes: Vec::from(immediate_data_to_bytes(triangle)),
152150
});

crates/lambda-rs/src/render/command.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
88
use std::ops::Range;
99

10-
use super::{
11-
pipeline::PipelineStage,
12-
viewport::Viewport,
13-
};
10+
use super::viewport::Viewport;
1411

1512
/// Engine-level index format for indexed drawing.
1613
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
@@ -88,7 +85,6 @@ pub enum RenderCommand {
8885
/// immediate data blocks remains `layout(push_constant)`.
8986
Immediates {
9087
pipeline: super::ResourceId,
91-
stage: PipelineStage,
9288
offset: u32,
9389
bytes: Vec<u32>,
9490
},

crates/lambda-rs/src/render/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,6 @@ impl RenderContext {
909909
}
910910
RenderCommand::Immediates {
911911
pipeline,
912-
stage: _,
913912
offset,
914913
bytes,
915914
} => {

crates/lambda-rs/src/render/pipeline.rs

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,16 @@
1616
//! Example
1717
//! ```rust,ignore
1818
//! // Single vertex buffer with position/color; one immediate data range for the vertex stage
19-
//! use lambda::render::pipeline::{RenderPipelineBuilder, PipelineStage, CullingMode};
19+
//! use lambda::render::pipeline::{RenderPipelineBuilder, CullingMode};
2020
//! let pipeline = RenderPipelineBuilder::new()
2121
//! .with_buffer(vertex_buffer, attributes)
22-
//! .with_immediate_data(PipelineStage::VERTEX, 64)
22+
//! .with_immediate_data(64)
2323
//! .with_layouts(&[&globals_bgl])
2424
//! .with_culling(CullingMode::Back)
2525
//! .build(&mut render_context, &render_pass, &vs, Some(&fs));
2626
//! ```
2727
28-
use std::{
29-
ops::Range,
30-
rc::Rc,
31-
};
28+
use std::rc::Rc;
3229

3330
use lambda_platform::wgpu::pipeline as platform_pipeline;
3431
use logging;
@@ -116,12 +113,12 @@ impl RenderPipeline {
116113
}
117114
}
118115

119-
/// Public alias for platform shader stage flags used by immediate data.
116+
/// Public alias for platform shader stage flags.
117+
///
118+
/// Stage flags remain useful for APIs such as bind group visibility, even
119+
/// though wgpu v28 immediates no longer use stage-scoped updates.
120120
pub use platform_pipeline::PipelineStage;
121121

122-
/// Convenience alias for uploading immediate data: stage and byte range.
123-
pub type ImmediateDataUpload = (PipelineStage, Range<u32>);
124-
125122
struct BufferBinding {
126123
buffer: Rc<Buffer>,
127124
layout: VertexBufferLayout,
@@ -260,7 +257,7 @@ pub struct StencilState {
260257
/// - If a fragment shader is omitted, no color target is attached and the
261258
/// pipeline can still be used for vertex‑only workloads.
262259
pub struct RenderPipelineBuilder {
263-
immediate_data: Vec<ImmediateDataUpload>,
260+
immediate_data: Vec<std::ops::Range<u32>>,
264261
bindings: Vec<BufferBinding>,
265262
culling: CullingMode,
266263
bind_group_layouts: Vec<bind::BindGroupLayout>,
@@ -346,13 +343,14 @@ impl RenderPipelineBuilder {
346343
);
347344
}
348345

349-
/// Declare an immediate data range for a shader stage in bytes.
350-
pub fn with_immediate_data(
351-
mut self,
352-
stage: PipelineStage,
353-
bytes: u32,
354-
) -> Self {
355-
self.immediate_data.push((stage, 0..bytes));
346+
/// Declare an immediate data byte range size.
347+
///
348+
/// wgpu v28 uses a single immediate data region sized by the pipeline
349+
/// layout. This method records a range starting at 0 whose end defines the
350+
/// required allocation size. Multiple calls are allowed; the final
351+
/// allocation is derived from the union of ranges.
352+
pub fn with_immediate_data(mut self, bytes: u32) -> Self {
353+
self.immediate_data.push(0..bytes);
356354
return self;
357355
}
358356

@@ -469,8 +467,7 @@ impl RenderPipelineBuilder {
469467
self
470468
.immediate_data
471469
.iter()
472-
.map(|(stage, range)| platform_pipeline::ImmediateDataRange {
473-
stages: *stage,
470+
.map(|range| platform_pipeline::ImmediateDataRange {
474471
range: range.clone(),
475472
})
476473
.collect();

0 commit comments

Comments
 (0)