1use std::ops::Range;
4
5use lambda_platform::gfx::viewport::ViewPort as PlatformViewPort;
6
7use super::{
8 PlatformRenderCommand,
9 RenderContext,
10};
11
12#[derive(Debug, Clone)]
14pub enum RenderCommand {
15 SetViewports {
17 start_at: u32,
18 viewports: Vec<super::viewport::Viewport>,
19 },
20 SetScissors {
22 start_at: u32,
23 viewports: Vec<super::viewport::Viewport>,
24 },
25 SetPipeline { pipeline: super::ResourceId },
27 BeginRenderPass {
29 render_pass: super::ResourceId,
30 viewport: super::viewport::Viewport,
31 },
32 EndRenderPass,
34
35 PushConstants {
37 pipeline: super::ResourceId,
38 stage: super::pipeline::PipelineStage,
39 offset: u32,
40 bytes: Vec<u32>,
41 },
42 BindVertexBuffer {
44 pipeline: super::ResourceId,
45 buffer: u32,
46 },
47 Draw { vertices: Range<u32> },
49}
50
51impl RenderCommand {
52 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}