@@ -115,16 +115,30 @@ impl framework::Example for Example {
115115 // Create the vertex and index buffers
116116 let vertex_size = mem:: size_of :: < Vertex > ( ) ;
117117 let ( vertex_data, index_data) = create_vertices ( ) ;
118+ let vertex_buffer_length = vertex_data. len ( ) * vertex_size;
119+ let index_buffer_length = index_data. len ( ) * mem:: size_of :: < u16 > ( ) ;
118120 let vertex_buf = device. create_buffer ( & wgpu:: BufferDescriptor {
119- size : ( vertex_data . len ( ) * vertex_size ) as u32 ,
120- usage : wgpu:: BufferUsageFlags :: VERTEX | wgpu:: BufferUsageFlags :: TRANSFER_DST ,
121+ size : vertex_buffer_length as u32 ,
122+ usage : wgpu:: BufferUsageFlags :: VERTEX | wgpu:: BufferUsageFlags :: TRANSFER_DST | wgpu :: BufferUsageFlags :: MAP_WRITE ,
121123 } ) ;
122- vertex_buf. set_sub_data ( 0 , framework:: cast_slice ( & vertex_data) ) ;
124+
125+ //vertex_buf.set_sub_data(0, framework::cast_slice(&vertex_data));
126+ vertex_buf. map_write_async ( 0 , vertex_buffer_length as u32 , |result : wgpu:: BufferMapAsyncResult < & mut [ u8 ] > | {
127+ if let wgpu:: BufferMapAsyncResult :: Success ( data) = result {
128+ unsafe { std:: ptr:: copy_nonoverlapping ( vertex_data. as_ptr ( ) as * const u8 , data. as_mut_ptr ( ) , vertex_buffer_length) } ;
129+ }
130+ } ) ;
131+
123132 let index_buf = device. create_buffer ( & wgpu:: BufferDescriptor {
124- size : ( index_data. len ( ) * 2 ) as u32 ,
125- usage : wgpu:: BufferUsageFlags :: INDEX | wgpu:: BufferUsageFlags :: TRANSFER_DST ,
133+ size : index_buffer_length as u32 ,
134+ usage : wgpu:: BufferUsageFlags :: INDEX | wgpu:: BufferUsageFlags :: TRANSFER_DST | wgpu:: BufferUsageFlags :: MAP_WRITE ,
135+ } ) ;
136+ // index_buf.set_sub_data(0, framework::cast_slice(&index_data));
137+ index_buf. map_write_async ( 0 , index_buffer_length as u32 , |result : wgpu:: BufferMapAsyncResult < & mut [ u8 ] > | {
138+ if let wgpu:: BufferMapAsyncResult :: Success ( data) = result {
139+ unsafe { std:: ptr:: copy_nonoverlapping ( index_data. as_ptr ( ) as * const u8 , data. as_mut_ptr ( ) , index_buffer_length) } ;
140+ }
126141 } ) ;
127- index_buf. set_sub_data ( 0 , framework:: cast_slice ( & index_data) ) ;
128142
129143 // Create pipeline layout
130144 let bind_group_layout = device. create_bind_group_layout ( & wgpu:: BindGroupLayoutDescriptor {
@@ -163,14 +177,19 @@ impl framework::Example for Example {
163177 array_size : 1 ,
164178 dimension : wgpu:: TextureDimension :: D2 ,
165179 format : wgpu:: TextureFormat :: R8g8b8a8Unorm ,
166- usage : wgpu:: TextureUsageFlags :: SAMPLED | wgpu:: TextureUsageFlags :: TRANSFER_DST
180+ usage : wgpu:: TextureUsageFlags :: SAMPLED | wgpu:: TextureUsageFlags :: TRANSFER_DST ,
167181 } ) ;
168182 let texture_view = texture. create_default_view ( ) ;
169183 let temp_buf = device. create_buffer ( & wgpu:: BufferDescriptor {
170184 size : texels. len ( ) as u32 ,
171- usage : wgpu:: BufferUsageFlags :: TRANSFER_SRC | wgpu:: BufferUsageFlags :: TRANSFER_DST
185+ usage : wgpu:: BufferUsageFlags :: TRANSFER_SRC | wgpu:: BufferUsageFlags :: TRANSFER_DST | wgpu:: BufferUsageFlags :: MAP_WRITE ,
186+ } ) ;
187+ // temp_buf.set_sub_data(0, &texels);
188+ temp_buf. map_write_async ( 0 , texels. len ( ) as u32 , |result : wgpu:: BufferMapAsyncResult < & mut [ u8 ] > | {
189+ if let wgpu:: BufferMapAsyncResult :: Success ( data) = result {
190+ unsafe { std:: ptr:: copy_nonoverlapping ( texels. as_ptr ( ) as * const u8 , data. as_mut_ptr ( ) , texels. len ( ) ) } ;
191+ }
172192 } ) ;
173- temp_buf. set_sub_data ( 0 , & texels) ;
174193 init_encoder. copy_buffer_to_texture (
175194 wgpu:: BufferCopyView {
176195 buffer : & temp_buf,
@@ -207,11 +226,16 @@ impl framework::Example for Example {
207226 } ) ;
208227 let uniform_buf = device. create_buffer ( & wgpu:: BufferDescriptor {
209228 size : 64 ,
210- usage : wgpu:: BufferUsageFlags :: UNIFORM | wgpu:: BufferUsageFlags :: TRANSFER_DST ,
229+ usage : wgpu:: BufferUsageFlags :: UNIFORM | wgpu:: BufferUsageFlags :: TRANSFER_DST | wgpu :: BufferUsageFlags :: MAP_WRITE ,
211230 } ) ;
212231 let mx_total = Self :: generate_matrix ( sc_desc. width as f32 / sc_desc. height as f32 ) ;
213232 let mx_ref: & [ f32 ; 16 ] = mx_total. as_ref ( ) ;
214- uniform_buf. set_sub_data ( 0 , framework:: cast_slice ( & mx_ref[ ..] ) ) ;
233+ // uniform_buf.set_sub_data(0, framework::cast_slice(&mx_ref[..]));
234+ uniform_buf. map_write_async ( 0 , 64 , |result : wgpu:: BufferMapAsyncResult < & mut [ u8 ] > | {
235+ if let wgpu:: BufferMapAsyncResult :: Success ( data) = result {
236+ unsafe { std:: ptr:: copy_nonoverlapping ( mx_ref. as_ptr ( ) as * const u8 , data. as_mut_ptr ( ) , 64 ) } ;
237+ }
238+ } ) ;
215239
216240 // Create bind group
217241 let bind_group = device. create_bind_group ( & wgpu:: BindGroupDescriptor {
@@ -310,7 +334,12 @@ impl framework::Example for Example {
310334 fn resize ( & mut self , sc_desc : & wgpu:: SwapChainDescriptor , _device : & mut wgpu:: Device ) {
311335 let mx_total = Self :: generate_matrix ( sc_desc. width as f32 / sc_desc. height as f32 ) ;
312336 let mx_ref: & [ f32 ; 16 ] = mx_total. as_ref ( ) ;
313- self . uniform_buf . set_sub_data ( 0 , framework:: cast_slice ( & mx_ref[ ..] ) ) ;
337+ // self.uniform_buf.set_sub_data(0, framework::cast_slice(&mx_ref[..]));
338+ self . uniform_buf . map_write_async ( 0 , 64 , |result : wgpu:: BufferMapAsyncResult < & mut [ u8 ] > | {
339+ if let wgpu:: BufferMapAsyncResult :: Success ( data) = result {
340+ unsafe { std:: ptr:: copy_nonoverlapping ( mx_ref. as_ptr ( ) as * const u8 , data. as_mut_ptr ( ) , 64 ) } ;
341+ }
342+ } ) ;
314343 }
315344
316345 fn render ( & mut self , frame : & wgpu:: SwapChainOutput , device : & mut wgpu:: Device ) {
0 commit comments