1- use super :: CreateIndirectValidationPipelineError ;
1+ use super :: {
2+ utils:: { BufferBarrierScratch , BufferBarriers , UniqueIndexExt as _, UniqueIndexScratch } ,
3+ CreateIndirectValidationPipelineError ,
4+ } ;
25use crate :: {
36 device:: { queue:: TempResource , Device , DeviceError } ,
47 lock:: { rank, Mutex } ,
@@ -256,47 +259,37 @@ impl Draw {
256259 batch. metadata_buffer_offset = metadata_buffer_offset;
257260 }
258261
259- let mut buffer_barriers = Vec :: new ( ) ;
260- let mut buffer_index_set = bit_set:: BitSet :: new ( ) ;
261-
262- for index in batches
263- . values ( )
264- . map ( |batch| batch. staging_buffer_index )
265- . filter ( |index| buffer_index_set. insert ( * index) )
266- {
267- let staging_buffer = & staging_buffers[ index] ;
268-
269- buffer_barriers. push ( hal:: BufferBarrier {
270- buffer : staging_buffer. raw ( ) ,
271- usage : hal:: StateTransition {
272- from : wgt:: BufferUses :: MAP_WRITE ,
273- to : wgt:: BufferUses :: COPY_SRC ,
274- } ,
275- } ) ;
276- }
277- buffer_index_set. clear ( ) ;
278-
279- for index in batches
280- . values ( )
281- . map ( |batch| batch. metadata_resource_index )
282- . filter ( |index| buffer_index_set. insert ( * index) )
283- {
284- let metadata_buffer = resources. get_metadata_buffer ( index) ;
285-
286- buffer_barriers. push ( hal:: BufferBarrier {
287- buffer : metadata_buffer,
288- usage : hal:: StateTransition {
289- from : wgt:: BufferUses :: STORAGE_READ_ONLY ,
290- to : wgt:: BufferUses :: COPY_DST ,
291- } ,
292- } ) ;
293- }
294- buffer_index_set. clear ( ) ;
295-
296- unsafe {
297- encoder. transition_buffers ( & buffer_barriers) ;
298- }
299- buffer_barriers. clear ( ) ;
262+ let buffer_barrier_scratch = & mut BufferBarrierScratch :: new ( ) ;
263+ let unique_index_scratch = & mut UniqueIndexScratch :: new ( ) ;
264+
265+ BufferBarriers :: new ( buffer_barrier_scratch)
266+ . extend (
267+ batches
268+ . values ( )
269+ . map ( |batch| batch. staging_buffer_index )
270+ . unique ( unique_index_scratch)
271+ . map ( |index| hal:: BufferBarrier {
272+ buffer : staging_buffers[ index] . raw ( ) ,
273+ usage : hal:: StateTransition {
274+ from : wgt:: BufferUses :: MAP_WRITE ,
275+ to : wgt:: BufferUses :: COPY_SRC ,
276+ } ,
277+ } ) ,
278+ )
279+ . extend (
280+ batches
281+ . values ( )
282+ . map ( |batch| batch. metadata_resource_index )
283+ . unique ( unique_index_scratch)
284+ . map ( |index| hal:: BufferBarrier {
285+ buffer : resources. get_metadata_buffer ( index) ,
286+ usage : hal:: StateTransition {
287+ from : wgt:: BufferUses :: STORAGE_READ_ONLY ,
288+ to : wgt:: BufferUses :: COPY_DST ,
289+ } ,
290+ } ) ,
291+ )
292+ . encode ( encoder) ;
300293
301294 for batch in batches. values ( ) {
302295 let data = batch. metadata ( ) ;
@@ -319,44 +312,38 @@ impl Draw {
319312 }
320313 }
321314
322- for index in batches
323- . values ( )
324- . map ( |batch| batch. metadata_resource_index )
325- . filter ( |index| buffer_index_set. insert ( * index) )
326- {
327- let metadata_buffer = resources. get_metadata_buffer ( index) ;
328-
329- buffer_barriers. push ( hal:: BufferBarrier {
330- buffer : metadata_buffer,
331- usage : hal:: StateTransition {
332- from : wgt:: BufferUses :: COPY_DST ,
333- to : wgt:: BufferUses :: STORAGE_READ_ONLY ,
334- } ,
335- } ) ;
336- }
337- buffer_index_set. clear ( ) ;
338-
339- for index in batches
340- . values ( )
341- . map ( |batch| batch. dst_resource_index )
342- . filter ( |index| buffer_index_set. insert ( * index) )
343- {
344- let dst_buffer = resources. get_dst_buffer ( index) ;
345-
346- buffer_barriers. push ( hal:: BufferBarrier {
347- buffer : dst_buffer,
348- usage : hal:: StateTransition {
349- from : wgt:: BufferUses :: INDIRECT ,
350- to : wgt:: BufferUses :: STORAGE_READ_WRITE ,
351- } ,
352- } ) ;
315+ for staging_buffer in staging_buffers {
316+ temp_resources. push ( TempResource :: StagingBuffer ( staging_buffer) ) ;
353317 }
354- buffer_index_set. clear ( ) ;
355318
356- unsafe {
357- encoder. transition_buffers ( & buffer_barriers) ;
358- }
359- buffer_barriers. clear ( ) ;
319+ BufferBarriers :: new ( buffer_barrier_scratch)
320+ . extend (
321+ batches
322+ . values ( )
323+ . map ( |batch| batch. metadata_resource_index )
324+ . unique ( unique_index_scratch)
325+ . map ( |index| hal:: BufferBarrier {
326+ buffer : resources. get_metadata_buffer ( index) ,
327+ usage : hal:: StateTransition {
328+ from : wgt:: BufferUses :: COPY_DST ,
329+ to : wgt:: BufferUses :: STORAGE_READ_ONLY ,
330+ } ,
331+ } ) ,
332+ )
333+ . extend (
334+ batches
335+ . values ( )
336+ . map ( |batch| batch. dst_resource_index )
337+ . unique ( unique_index_scratch)
338+ . map ( |index| hal:: BufferBarrier {
339+ buffer : resources. get_dst_buffer ( index) ,
340+ usage : hal:: StateTransition {
341+ from : wgt:: BufferUses :: INDIRECT ,
342+ to : wgt:: BufferUses :: STORAGE_READ_WRITE ,
343+ } ,
344+ } ) ,
345+ )
346+ . encode ( encoder) ;
360347
361348 let desc = hal:: ComputePassDescriptor {
362349 label : None ,
@@ -420,31 +407,21 @@ impl Draw {
420407 encoder. end_compute_pass ( ) ;
421408 }
422409
423- for index in batches
424- . values ( )
425- . map ( |batch| batch. dst_resource_index )
426- . filter ( |index| buffer_index_set. insert ( * index) )
427- {
428- let dst_buffer = resources. get_dst_buffer ( index) ;
429-
430- buffer_barriers. push ( hal:: BufferBarrier {
431- buffer : dst_buffer,
432- usage : hal:: StateTransition {
433- from : wgt:: BufferUses :: STORAGE_READ_WRITE ,
434- to : wgt:: BufferUses :: INDIRECT ,
435- } ,
436- } ) ;
437- }
438- buffer_index_set. clear ( ) ;
439-
440- unsafe {
441- encoder. transition_buffers ( & buffer_barriers) ;
442- }
443- buffer_barriers. clear ( ) ;
444-
445- for staging_buffer in staging_buffers {
446- temp_resources. push ( TempResource :: StagingBuffer ( staging_buffer) ) ;
447- }
410+ BufferBarriers :: new ( buffer_barrier_scratch)
411+ . extend (
412+ batches
413+ . values ( )
414+ . map ( |batch| batch. dst_resource_index )
415+ . unique ( unique_index_scratch)
416+ . map ( |index| hal:: BufferBarrier {
417+ buffer : resources. get_dst_buffer ( index) ,
418+ usage : hal:: StateTransition {
419+ from : wgt:: BufferUses :: STORAGE_READ_WRITE ,
420+ to : wgt:: BufferUses :: INDIRECT ,
421+ } ,
422+ } ) ,
423+ )
424+ . encode ( encoder) ;
448425
449426 Ok ( ( ) )
450427 }
0 commit comments