lambda/render/
command.rs

1//! Render command definitions for lambda runtimes.
2
3use std::ops::Range;
4
5use lambda_platform::gfx::viewport::ViewPort as PlatformViewPort;
6
7use super::{
8  PlatformRenderCommand,
9  RenderContext,
10};
11
12/// Commands that are used to render a frame within the RenderContext.
13#[derive(Debug, Clone)]
14pub enum RenderCommand {
15  /// sets the viewports for the render context.
16  SetViewports {
17    start_at: u32,
18    viewports: Vec<super::viewport::Viewport>,
19  },
20  /// sets the scissor rectangles for the render context.
21  SetScissors {
22    start_at: u32,
23    viewports: Vec<super::viewport::Viewport>,
24  },
25  /// Sets the pipeline to use for the render context.
26  SetPipeline { pipeline: super::ResourceId },
27  /// Begins the render pass.
28  BeginRenderPass {
29    render_pass: super::ResourceId,
30    viewport: super::viewport::Viewport,
31  },
32  /// Ends the render pass.
33  EndRenderPass,
34
35  /// Sets the push constants for the render pipeline.
36  PushConstants {
37    pipeline: super::ResourceId,
38    stage: super::pipeline::PipelineStage,
39    offset: u32,
40    bytes: Vec<u32>,
41  },
42  /// Binds a vertex buffer to the render pipeline.
43  BindVertexBuffer {
44    pipeline: super::ResourceId,
45    buffer: u32,
46  },
47  /// Draws a graphical primitive.
48  Draw { vertices: Range<u32> },
49}
50
51impl RenderCommand {
52  /// Converts the RenderCommand into a platform compatible render command.
53  pub(super) fn into_platform_command(
54    &self,
55    render_context: &mut RenderContext,
56  ) -> PlatformRenderCommand {
57    return match self {
58      RenderCommand::SetViewports {
59        start_at,
60        viewports,
61      } => PlatformRenderCommand::SetViewports {
62        start_at: *start_at,
63        viewports: viewports
64          .into_iter()
65          .map(|viewport| viewport.clone_gfx_viewport())
66          .collect::<Vec<PlatformViewPort>>(),
67      },
68      RenderCommand::SetScissors {
69        start_at,
70        viewports,
71      } => PlatformRenderCommand::SetScissors {
72        start_at: *start_at,
73        viewports: viewports
74          .into_iter()
75          .map(|viewport| viewport.clone_gfx_viewport())
76          .collect::<Vec<PlatformViewPort>>(),
77      },
78      RenderCommand::BeginRenderPass {
79        render_pass,
80        viewport,
81      } => {
82        let surface = render_context.internal_surface();
83        let frame_buffer = render_context.allocate_and_get_frame_buffer(
84          render_context
85            .get_render_pass(*render_pass)
86            .into_gfx_render_pass()
87            .as_ref(),
88        );
89
90        PlatformRenderCommand::BeginRenderPass {
91          render_pass: render_context
92            .get_render_pass(*render_pass)
93            .into_gfx_render_pass(),
94          surface: surface.clone(),
95          frame_buffer: frame_buffer.clone(),
96          viewport: viewport.clone_gfx_viewport(),
97        }
98      }
99      RenderCommand::EndRenderPass => PlatformRenderCommand::EndRenderPass,
100      RenderCommand::SetPipeline { pipeline } => {
101        PlatformRenderCommand::AttachGraphicsPipeline {
102          pipeline: render_context
103            .render_pipelines
104            .get(*pipeline)
105            .unwrap()
106            .into_platform_render_pipeline(),
107        }
108      }
109      RenderCommand::PushConstants {
110        pipeline,
111        stage,
112        offset,
113        bytes,
114      } => PlatformRenderCommand::PushConstants {
115        pipeline: render_context
116          .render_pipelines
117          .get(*pipeline)
118          .unwrap()
119          .into_platform_render_pipeline(),
120        stage: *stage,
121        offset: *offset,
122        bytes: bytes.clone(),
123      },
124      RenderCommand::BindVertexBuffer { pipeline, buffer } => {
125        PlatformRenderCommand::BindVertexBuffer {
126          buffer: render_context
127            .render_pipelines
128            .get(*pipeline)
129            .unwrap()
130            .buffers()
131            .get(*buffer as usize)
132            .unwrap()
133            .internal_buffer_rc(),
134        }
135      }
136      RenderCommand::Draw { vertices } => PlatformRenderCommand::Draw {
137        vertices: vertices.clone(),
138      },
139    };
140  }
141}