1use std::ops::Range;
2
3use wgt::{BufferAddress, DynamicOffset, IndexFormat};
4
5use crate::{BindGroup, Buffer, BufferSlice, RenderBundleEncoder, RenderPass, RenderPipeline};
6
7pub trait RenderEncoder<'a> {
9 fn set_bind_group(
14 &mut self,
15 index: u32,
16 bind_group: Option<&'a BindGroup>,
17 offsets: &[DynamicOffset],
18 );
19
20 fn set_pipeline(&mut self, pipeline: &'a RenderPipeline);
24
25 fn set_index_buffer(&mut self, buffer_slice: BufferSlice<'a>, index_format: IndexFormat);
30
31 fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>);
42
43 fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>);
47
48 fn draw_indexed(&mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32>);
53
54 fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: BufferAddress);
60
61 fn draw_indexed_indirect(
69 &mut self,
70 indirect_buffer: &'a Buffer,
71 indirect_offset: BufferAddress,
72 );
73
74 fn set_push_constants(&mut self, stages: wgt::ShaderStages, offset: u32, data: &[u8]);
105}
106
107impl<'a> RenderEncoder<'a> for RenderPass<'a> {
108 #[inline(always)]
109 fn set_bind_group(
110 &mut self,
111 index: u32,
112 bind_group: Option<&'a BindGroup>,
113 offsets: &[DynamicOffset],
114 ) {
115 Self::set_bind_group(self, index, bind_group, offsets);
116 }
117
118 #[inline(always)]
119 fn set_pipeline(&mut self, pipeline: &'a RenderPipeline) {
120 Self::set_pipeline(self, pipeline);
121 }
122
123 #[inline(always)]
124 fn set_index_buffer(&mut self, buffer_slice: BufferSlice<'a>, index_format: IndexFormat) {
125 Self::set_index_buffer(self, buffer_slice, index_format);
126 }
127
128 #[inline(always)]
129 fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>) {
130 Self::set_vertex_buffer(self, slot, buffer_slice);
131 }
132
133 #[inline(always)]
134 fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>) {
135 Self::draw(self, vertices, instances);
136 }
137
138 #[inline(always)]
139 fn draw_indexed(&mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32>) {
140 Self::draw_indexed(self, indices, base_vertex, instances);
141 }
142
143 #[inline(always)]
144 fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: BufferAddress) {
145 Self::draw_indirect(self, indirect_buffer, indirect_offset);
146 }
147
148 #[inline(always)]
149 fn draw_indexed_indirect(
150 &mut self,
151 indirect_buffer: &'a Buffer,
152 indirect_offset: BufferAddress,
153 ) {
154 Self::draw_indexed_indirect(self, indirect_buffer, indirect_offset);
155 }
156
157 #[inline(always)]
158 fn set_push_constants(&mut self, stages: wgt::ShaderStages, offset: u32, data: &[u8]) {
159 Self::set_push_constants(self, stages, offset, data);
160 }
161}
162
163impl<'a> RenderEncoder<'a> for RenderBundleEncoder<'a> {
164 #[inline(always)]
165 fn set_bind_group(
166 &mut self,
167 index: u32,
168 bind_group: Option<&'a BindGroup>,
169 offsets: &[DynamicOffset],
170 ) {
171 Self::set_bind_group(self, index, bind_group, offsets);
172 }
173
174 #[inline(always)]
175 fn set_pipeline(&mut self, pipeline: &'a RenderPipeline) {
176 Self::set_pipeline(self, pipeline);
177 }
178
179 #[inline(always)]
180 fn set_index_buffer(&mut self, buffer_slice: BufferSlice<'a>, index_format: IndexFormat) {
181 Self::set_index_buffer(self, buffer_slice, index_format);
182 }
183
184 #[inline(always)]
185 fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>) {
186 Self::set_vertex_buffer(self, slot, buffer_slice);
187 }
188
189 #[inline(always)]
190 fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>) {
191 Self::draw(self, vertices, instances);
192 }
193
194 #[inline(always)]
195 fn draw_indexed(&mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32>) {
196 Self::draw_indexed(self, indices, base_vertex, instances);
197 }
198
199 #[inline(always)]
200 fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: BufferAddress) {
201 Self::draw_indirect(self, indirect_buffer, indirect_offset);
202 }
203
204 #[inline(always)]
205 fn draw_indexed_indirect(
206 &mut self,
207 indirect_buffer: &'a Buffer,
208 indirect_offset: BufferAddress,
209 ) {
210 Self::draw_indexed_indirect(self, indirect_buffer, indirect_offset);
211 }
212
213 #[inline(always)]
214 fn set_push_constants(&mut self, stages: wgt::ShaderStages, offset: u32, data: &[u8]) {
215 Self::set_push_constants(self, stages, offset, data);
216 }
217}