@@ -5,15 +5,15 @@ use core::ops::Range;
5
5
use crate :: command:: Command as TraceCommand ;
6
6
use crate :: {
7
7
api_log,
8
- command:: { CommandBufferMutable , CommandEncoder , EncoderStateError } ,
8
+ command:: { encoder :: EncodingState , ArcCommand , EncoderStateError } ,
9
9
device:: { DeviceError , MissingFeatures } ,
10
10
get_lowest_common_denom,
11
11
global:: Global ,
12
12
hal_label,
13
13
id:: { BufferId , CommandEncoderId , TextureId } ,
14
14
init_tracker:: { MemoryInitKind , TextureInitRange } ,
15
15
resource:: {
16
- DestroyedResourceError , InvalidResourceError , Labeled , MissingBufferUsageError ,
16
+ Buffer , DestroyedResourceError , InvalidResourceError , Labeled , MissingBufferUsageError ,
17
17
ParentDevice , RawResourceAccess , ResourceErrorIdent , Texture , TextureClearMode ,
18
18
} ,
19
19
snatch:: SnatchGuard ,
@@ -118,8 +118,18 @@ impl Global {
118
118
119
119
let cmd_enc = hub. command_encoders . get ( command_encoder_id) ;
120
120
let mut cmd_buf_data = cmd_enc. data . lock ( ) ;
121
- cmd_buf_data. record_with ( |cmd_buf_data| -> Result < ( ) , ClearError > {
122
- clear_buffer ( cmd_buf_data, hub, & cmd_enc, dst, offset, size)
121
+
122
+ #[ cfg( feature = "trace" ) ]
123
+ if let Some ( ref mut list) = cmd_buf_data. trace ( ) {
124
+ list. push ( TraceCommand :: ClearBuffer { dst, offset, size } ) ;
125
+ }
126
+
127
+ cmd_buf_data. push_with ( || -> Result < _ , ClearError > {
128
+ Ok ( ArcCommand :: ClearBuffer {
129
+ dst : self . resolve_buffer_id ( dst) ?,
130
+ offset,
131
+ size,
132
+ } )
123
133
} )
124
134
}
125
135
@@ -136,38 +146,38 @@ impl Global {
136
146
137
147
let cmd_enc = hub. command_encoders . get ( command_encoder_id) ;
138
148
let mut cmd_buf_data = cmd_enc. data . lock ( ) ;
139
- cmd_buf_data. record_with ( |cmd_buf_data| -> Result < ( ) , ClearError > {
140
- clear_texture_cmd ( cmd_buf_data, hub, & cmd_enc, dst, subresource_range)
149
+
150
+ #[ cfg( feature = "trace" ) ]
151
+ if let Some ( ref mut list) = cmd_buf_data. trace ( ) {
152
+ list. push ( TraceCommand :: ClearTexture {
153
+ dst,
154
+ subresource_range : * subresource_range,
155
+ } ) ;
156
+ }
157
+
158
+ cmd_buf_data. push_with ( || -> Result < _ , ClearError > {
159
+ Ok ( ArcCommand :: ClearTexture {
160
+ dst : self . resolve_texture_id ( dst) ?,
161
+ subresource_range : * subresource_range,
162
+ } )
141
163
} )
142
164
}
143
165
}
144
166
145
167
pub ( super ) fn clear_buffer (
146
- cmd_buf_data : & mut CommandBufferMutable ,
147
- hub : & crate :: hub:: Hub ,
148
- cmd_enc : & Arc < CommandEncoder > ,
149
- dst : BufferId ,
168
+ state : & mut EncodingState ,
169
+ dst_buffer : Arc < Buffer > ,
150
170
offset : BufferAddress ,
151
171
size : Option < BufferAddress > ,
152
172
) -> Result < ( ) , ClearError > {
153
- #[ cfg( feature = "trace" ) ]
154
- if let Some ( ref mut list) = cmd_buf_data. trace_commands {
155
- list. push ( TraceCommand :: ClearBuffer { dst, offset, size } ) ;
156
- }
157
-
158
- cmd_enc. device . check_is_valid ( ) ?;
159
-
160
- let dst_buffer = hub. buffers . get ( dst) . get ( ) ?;
173
+ dst_buffer. same_device ( state. device ) ?;
161
174
162
- dst_buffer. same_device_as ( cmd_enc. as_ref ( ) ) ?;
163
-
164
- let dst_pending = cmd_buf_data
165
- . trackers
175
+ let dst_pending = state
176
+ . tracker
166
177
. buffers
167
178
. set_single ( & dst_buffer, wgt:: BufferUses :: COPY_DST ) ;
168
179
169
- let snatch_guard = dst_buffer. device . snatchable_lock . read ( ) ;
170
- let dst_raw = dst_buffer. try_raw ( & snatch_guard) ?;
180
+ let dst_raw = dst_buffer. try_raw ( state. snatch_guard ) ?;
171
181
dst_buffer. check_usage ( BufferUsages :: COPY_DST ) ?;
172
182
173
183
// Check if offset & size are valid.
@@ -200,20 +210,19 @@ pub(super) fn clear_buffer(
200
210
}
201
211
202
212
// Mark dest as initialized.
203
- cmd_buf_data. buffer_memory_init_actions . extend (
204
- dst_buffer. initialization_status . read ( ) . create_action (
213
+ state
214
+ . buffer_memory_init_actions
215
+ . extend ( dst_buffer. initialization_status . read ( ) . create_action (
205
216
& dst_buffer,
206
217
offset..end_offset,
207
218
MemoryInitKind :: ImplicitlyInitialized ,
208
- ) ,
209
- ) ;
219
+ ) ) ;
210
220
211
221
// actual hal barrier & operation
212
- let dst_barrier = dst_pending. map ( |pending| pending. into_hal ( & dst_buffer, & snatch_guard) ) ;
213
- let cmd_buf_raw = cmd_buf_data. encoder . open ( ) ?;
222
+ let dst_barrier = dst_pending. map ( |pending| pending. into_hal ( & dst_buffer, state. snatch_guard ) ) ;
214
223
unsafe {
215
- cmd_buf_raw . transition_buffers ( dst_barrier. as_slice ( ) ) ;
216
- cmd_buf_raw . clear_buffer ( dst_raw, offset..end_offset) ;
224
+ state . raw_encoder . transition_buffers ( dst_barrier. as_slice ( ) ) ;
225
+ state . raw_encoder . clear_buffer ( dst_raw, offset..end_offset) ;
217
226
}
218
227
219
228
Ok ( ( ) )
@@ -227,30 +236,15 @@ pub(super) fn clear_buffer(
227
236
/// this function, is a lower-level function that encodes a texture clear
228
237
/// operation without validating it.
229
238
pub ( super ) fn clear_texture_cmd (
230
- cmd_buf_data : & mut CommandBufferMutable ,
231
- hub : & crate :: hub:: Hub ,
232
- cmd_enc : & Arc < CommandEncoder > ,
233
- dst : TextureId ,
239
+ state : & mut EncodingState ,
240
+ dst_texture : Arc < Texture > ,
234
241
subresource_range : & ImageSubresourceRange ,
235
242
) -> Result < ( ) , ClearError > {
236
- #[ cfg( feature = "trace" ) ]
237
- if let Some ( ref mut list) = cmd_buf_data. trace_commands {
238
- list. push ( TraceCommand :: ClearTexture {
239
- dst,
240
- subresource_range : * subresource_range,
241
- } ) ;
242
- }
243
-
244
- cmd_enc. device . check_is_valid ( ) ?;
245
-
246
- cmd_enc
243
+ dst_texture. same_device ( state. device ) ?;
244
+ state
247
245
. device
248
246
. require_features ( wgt:: Features :: CLEAR_TEXTURE ) ?;
249
247
250
- let dst_texture = hub. textures . get ( dst) . get ( ) ?;
251
-
252
- dst_texture. same_device_as ( cmd_enc. as_ref ( ) ) ?;
253
-
254
248
// Check if subresource aspects are valid.
255
249
let clear_aspects = hal:: FormatAspects :: new ( dst_texture. desc . format , subresource_range. aspect ) ;
256
250
if clear_aspects. is_empty ( ) {
@@ -283,23 +277,18 @@ pub(super) fn clear_texture_cmd(
283
277
} ) ;
284
278
}
285
279
286
- let device = & cmd_enc. device ;
287
- device. check_is_valid ( ) ?;
288
- let ( encoder, tracker) = cmd_buf_data. open_encoder_and_tracker ( ) ?;
289
-
290
- let snatch_guard = device. snatchable_lock . read ( ) ;
291
280
clear_texture (
292
281
& dst_texture,
293
282
TextureInitRange {
294
283
mip_range : subresource_mip_range,
295
284
layer_range : subresource_layer_range,
296
285
} ,
297
- encoder ,
298
- & mut tracker. textures ,
299
- & device. alignments ,
300
- device. zero_buffer . as_ref ( ) ,
301
- & snatch_guard,
302
- device. instance_flags ,
286
+ state . raw_encoder ,
287
+ & mut state . tracker . textures ,
288
+ & state . device . alignments ,
289
+ state . device . zero_buffer . as_ref ( ) ,
290
+ state . snatch_guard ,
291
+ state . device . instance_flags ,
303
292
) ?;
304
293
305
294
Ok ( ( ) )
0 commit comments