@@ -14,14 +14,15 @@ use crate::device::{
1414 all_buffer_stages, all_image_stages,
1515} ;
1616use crate :: hub:: { HUB , Storage } ;
17+ use crate :: resource:: TexturePlacement ;
1718use crate :: swap_chain:: { SwapChainLink , SwapImageEpoch } ;
18- use crate :: track:: TrackerSet ;
19+ use crate :: track:: { DummyUsage , Stitch , TrackerSet } ;
1920use crate :: conv;
2021use crate :: {
2122 BufferHandle , TextureHandle ,
22- BufferId , CommandBufferId , CommandEncoderId , DeviceId ,
23- TextureId , TextureViewId ,
24- BufferUsageFlags , TextureUsageFlags , Color ,
23+ CommandBufferId , CommandEncoderId , DeviceId ,
24+ TextureViewId ,
25+ TextureUsageFlags , Color ,
2526 LifeGuard , Stored ,
2627 CommandBufferHandle ,
2728} ;
@@ -34,7 +35,6 @@ use hal::{Device as _Device};
3435use log:: trace;
3536
3637use std:: collections:: hash_map:: Entry ;
37- use std:: ops:: Range ;
3838use std:: { iter, slice} ;
3939use std:: thread:: ThreadId ;
4040
@@ -90,39 +90,43 @@ pub struct CommandBuffer<B: hal::Backend> {
9090}
9191
9292impl CommandBufferHandle {
93- pub ( crate ) fn insert_barriers < I , J > (
93+ pub ( crate ) fn insert_barriers (
9494 raw : & mut <Backend as hal:: Backend >:: CommandBuffer ,
95- buffer_iter : I ,
96- texture_iter : J ,
95+ base : & mut TrackerSet ,
96+ head : & TrackerSet ,
97+ stitch : Stitch ,
9798 buffer_guard : & Storage < BufferHandle > ,
9899 texture_guard : & Storage < TextureHandle > ,
99- ) where
100- I : Iterator < Item = ( BufferId , Range < BufferUsageFlags > ) > ,
101- J : Iterator < Item = ( TextureId , Range < TextureUsageFlags > ) > ,
102- {
103-
104- let buffer_barriers = buffer_iter. map ( |( id, transit) | {
105- let b = buffer_guard. get ( id) ;
106- trace ! ( "transit {:?} {:?}" , id, transit) ;
107- hal:: memory:: Barrier :: Buffer {
108- states : conv:: map_buffer_state ( transit. start ) .. conv:: map_buffer_state ( transit. end ) ,
109- target : & b. raw ,
110- range : None .. None ,
111- families : None ,
112- }
113- } ) ;
114- let texture_barriers = texture_iter. map ( |( id, transit) | {
115- let t = texture_guard. get ( id) ;
116- trace ! ( "transit {:?} {:?}" , id, transit) ;
117- let aspects = t. full_range . aspects ;
118- hal:: memory:: Barrier :: Image {
119- states : conv:: map_texture_state ( transit. start , aspects)
120- ..conv:: map_texture_state ( transit. end , aspects) ,
121- target : & t. raw ,
122- range : t. full_range . clone ( ) , //TODO?
123- families : None ,
124- }
125- } ) ;
100+ ) {
101+ let buffer_barriers = base. buffers
102+ . consume_by_replace ( & head. buffers , stitch)
103+ . map ( |( id, transit) | {
104+ let b = & buffer_guard[ id] ;
105+ trace ! ( "transit buffer {:?} {:?}" , id, transit) ;
106+ hal:: memory:: Barrier :: Buffer {
107+ states : conv:: map_buffer_state ( transit. start ) .. conv:: map_buffer_state ( transit. end ) ,
108+ target : & b. raw ,
109+ range : None .. None ,
110+ families : None ,
111+ }
112+ } ) ;
113+ let texture_barriers = base. textures
114+ . consume_by_replace ( & head. textures , stitch)
115+ . map ( |( id, transit) | {
116+ let t = & texture_guard[ id] ;
117+ trace ! ( "transit texture {:?} {:?}" , id, transit) ;
118+ let aspects = t. full_range . aspects ;
119+ hal:: memory:: Barrier :: Image {
120+ states : conv:: map_texture_state ( transit. start , aspects)
121+ ..conv:: map_texture_state ( transit. end , aspects) ,
122+ target : & t. raw ,
123+ range : t. full_range . clone ( ) , //TODO?
124+ families : None ,
125+ }
126+ } ) ;
127+ base. views
128+ . consume_by_extend ( & head. views )
129+ . unwrap ( ) ;
126130
127131 let stages = all_buffer_stages ( ) | all_image_stages ( ) ;
128132 unsafe {
@@ -148,7 +152,7 @@ pub extern "C" fn wgpu_command_encoder_finish(
148152) -> CommandBufferId {
149153 HUB . command_buffers
150154 . write ( )
151- . get_mut ( command_encoder_id)
155+ [ command_encoder_id]
152156 . is_recording = false ; //TODO: check for the old value
153157 command_encoder_id
154158}
@@ -158,9 +162,9 @@ pub fn command_encoder_begin_render_pass(
158162 desc : RenderPassDescriptor ,
159163) -> RenderPass < Backend > {
160164 let mut cmb_guard = HUB . command_buffers . write ( ) ;
161- let cmb = cmb_guard. get_mut ( command_encoder_id) ;
165+ let cmb = & mut cmb_guard[ command_encoder_id] ;
162166 let device_guard = HUB . devices . read ( ) ;
163- let device = device_guard. get ( cmb. device_id . value ) ;
167+ let device = & device_guard[ cmb. device_id . value ] ;
164168 let view_guard = HUB . texture_views . read ( ) ;
165169
166170 let mut current_comb = device. com_allocator . extend ( cmb) ;
@@ -187,13 +191,13 @@ pub fn command_encoder_begin_render_pass(
187191 let swap_chain_links = & mut cmb. swap_chain_links ;
188192
189193 let depth_stencil_key = depth_stencil_attachment. map ( |at| {
190- let view = view_guard. get ( at. attachment ) ;
194+ let view = & view_guard[ at. attachment ] ;
191195 if let Some ( ex) = extent {
192196 assert_eq ! ( ex, view. extent) ;
193197 } else {
194198 extent = Some ( view. extent ) ;
195199 }
196- trackers. views . query ( at. attachment , & view. life_guard . ref_count ) ;
200+ trackers. views . query ( at. attachment , & view. life_guard . ref_count , DummyUsage ) ;
197201 let query = trackers. textures . query (
198202 view. texture_id . value ,
199203 & view. texture_id . ref_count ,
@@ -213,20 +217,20 @@ pub fn command_encoder_begin_render_pass(
213217 } ) ;
214218
215219 let color_keys = color_attachments. iter ( ) . map ( |at| {
216- let view = view_guard. get ( at. attachment ) ;
220+ let view = & view_guard[ at. attachment ] ;
217221
218222 if view. is_owned_by_swap_chain {
219223 let link = match HUB . textures
220224 . read ( )
221- . get ( view. texture_id . value )
222- . swap_chain_link
225+ [ view. texture_id . value ] . placement
223226 {
224- Some ( ref link) => SwapChainLink {
227+ TexturePlacement :: SwapChain ( ref link) => SwapChainLink {
225228 swap_chain_id : link. swap_chain_id . clone ( ) ,
226229 epoch : * link. epoch . lock ( ) ,
227230 image_index : link. image_index ,
228231 } ,
229- None => unreachable ! ( )
232+ TexturePlacement :: Memory ( _) |
233+ TexturePlacement :: Void => unreachable ! ( )
230234 } ;
231235 swap_chain_links. push ( link) ;
232236 }
@@ -236,7 +240,7 @@ pub fn command_encoder_begin_render_pass(
236240 } else {
237241 extent = Some ( view. extent ) ;
238242 }
239- trackers. views . query ( at. attachment , & view. life_guard . ref_count ) ;
243+ trackers. views . query ( at. attachment , & view. life_guard . ref_count , DummyUsage ) ;
240244 let query = trackers. textures . query (
241245 view. texture_id . value ,
242246 & view. texture_id . ref_count ,
@@ -308,7 +312,7 @@ pub fn command_encoder_begin_render_pass(
308312 . key ( )
309313 . attachments
310314 . iter ( )
311- . map ( |& id| & view_guard. get ( id ) . raw ) ;
315+ . map ( |& id| & view_guard[ id ] . raw ) ;
312316
313317 unsafe {
314318 device
@@ -381,7 +385,7 @@ pub fn command_encoder_begin_compute_pass(
381385 command_encoder_id : CommandEncoderId ,
382386) -> ComputePass < Backend > {
383387 let mut cmb_guard = HUB . command_buffers . write ( ) ;
384- let cmb = cmb_guard. get_mut ( command_encoder_id) ;
388+ let cmb = & mut cmb_guard[ command_encoder_id] ;
385389
386390 let raw = cmb. raw . pop ( ) . unwrap ( ) ;
387391 let stored = Stored {
0 commit comments