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(&mut self, index: u32, bind_group: &'a BindGroup, offsets: &[DynamicOffset]);
14
15 fn set_pipeline(&mut self, pipeline: &'a RenderPipeline);
19
20 fn set_index_buffer(&mut self, buffer_slice: BufferSlice<'a>, index_format: IndexFormat);
25
26 fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>);
37
38 fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>);
42
43 fn draw_indexed(&mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32>);
48
49 fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: BufferAddress);
55
56 fn draw_indexed_indirect(
64 &mut self,
65 indirect_buffer: &'a Buffer,
66 indirect_offset: BufferAddress,
67 );
68
69 fn set_push_constants(&mut self, stages: wgt::ShaderStages, offset: u32, data: &[u8]);
100}
101
102impl<'a> RenderEncoder<'a> for RenderPass<'a> {
103 #[inline(always)]
104 fn set_bind_group(&mut self, index: u32, bind_group: &'a BindGroup, offsets: &[DynamicOffset]) {
105 Self::set_bind_group(self, index, bind_group, offsets);
106 }
107
108 #[inline(always)]
109 fn set_pipeline(&mut self, pipeline: &'a RenderPipeline) {
110 Self::set_pipeline(self, pipeline);
111 }
112
113 #[inline(always)]
114 fn set_index_buffer(&mut self, buffer_slice: BufferSlice<'a>, index_format: IndexFormat) {
115 Self::set_index_buffer(self, buffer_slice, index_format);
116 }
117
118 #[inline(always)]
119 fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>) {
120 Self::set_vertex_buffer(self, slot, buffer_slice);
121 }
122
123 #[inline(always)]
124 fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>) {
125 Self::draw(self, vertices, instances);
126 }
127
128 #[inline(always)]
129 fn draw_indexed(&mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32>) {
130 Self::draw_indexed(self, indices, base_vertex, instances);
131 }
132
133 #[inline(always)]
134 fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: BufferAddress) {
135 Self::draw_indirect(self, indirect_buffer, indirect_offset);
136 }
137
138 #[inline(always)]
139 fn draw_indexed_indirect(
140 &mut self,
141 indirect_buffer: &'a Buffer,
142 indirect_offset: BufferAddress,
143 ) {
144 Self::draw_indexed_indirect(self, indirect_buffer, indirect_offset);
145 }
146
147 #[inline(always)]
148 fn set_push_constants(&mut self, stages: wgt::ShaderStages, offset: u32, data: &[u8]) {
149 Self::set_push_constants(self, stages, offset, data);
150 }
151}
152
153impl<'a> RenderEncoder<'a> for RenderBundleEncoder<'a> {
154 #[inline(always)]
155 fn set_bind_group(&mut self, index: u32, bind_group: &'a BindGroup, offsets: &[DynamicOffset]) {
156 Self::set_bind_group(self, index, bind_group, offsets);
157 }
158
159 #[inline(always)]
160 fn set_pipeline(&mut self, pipeline: &'a RenderPipeline) {
161 Self::set_pipeline(self, pipeline);
162 }
163
164 #[inline(always)]
165 fn set_index_buffer(&mut self, buffer_slice: BufferSlice<'a>, index_format: IndexFormat) {
166 Self::set_index_buffer(self, buffer_slice, index_format);
167 }
168
169 #[inline(always)]
170 fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>) {
171 Self::set_vertex_buffer(self, slot, buffer_slice);
172 }
173
174 #[inline(always)]
175 fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>) {
176 Self::draw(self, vertices, instances);
177 }
178
179 #[inline(always)]
180 fn draw_indexed(&mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32>) {
181 Self::draw_indexed(self, indices, base_vertex, instances);
182 }
183
184 #[inline(always)]
185 fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: BufferAddress) {
186 Self::draw_indirect(self, indirect_buffer, indirect_offset);
187 }
188
189 #[inline(always)]
190 fn draw_indexed_indirect(
191 &mut self,
192 indirect_buffer: &'a Buffer,
193 indirect_offset: BufferAddress,
194 ) {
195 Self::draw_indexed_indirect(self, indirect_buffer, indirect_offset);
196 }
197
198 #[inline(always)]
199 fn set_push_constants(&mut self, stages: wgt::ShaderStages, offset: u32, data: &[u8]) {
200 Self::set_push_constants(self, stages, offset, data);
201 }
202}