@@ -115,16 +115,30 @@ impl framework::Example for Example {
115
115
// Create the vertex and index buffers
116
116
let vertex_size = mem:: size_of :: < Vertex > ( ) ;
117
117
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 > ( ) ;
118
120
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 ,
121
123
} ) ;
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
+
123
132
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
+ }
126
141
} ) ;
127
- index_buf. set_sub_data ( 0 , framework:: cast_slice ( & index_data) ) ;
128
142
129
143
// Create pipeline layout
130
144
let bind_group_layout = device. create_bind_group_layout ( & wgpu:: BindGroupLayoutDescriptor {
@@ -163,14 +177,19 @@ impl framework::Example for Example {
163
177
array_size : 1 ,
164
178
dimension : wgpu:: TextureDimension :: D2 ,
165
179
format : wgpu:: TextureFormat :: R8g8b8a8Unorm ,
166
- usage : wgpu:: TextureUsageFlags :: SAMPLED | wgpu:: TextureUsageFlags :: TRANSFER_DST
180
+ usage : wgpu:: TextureUsageFlags :: SAMPLED | wgpu:: TextureUsageFlags :: TRANSFER_DST ,
167
181
} ) ;
168
182
let texture_view = texture. create_default_view ( ) ;
169
183
let temp_buf = device. create_buffer ( & wgpu:: BufferDescriptor {
170
184
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
+ }
172
192
} ) ;
173
- temp_buf. set_sub_data ( 0 , & texels) ;
174
193
init_encoder. copy_buffer_to_texture (
175
194
wgpu:: BufferCopyView {
176
195
buffer : & temp_buf,
@@ -207,11 +226,16 @@ impl framework::Example for Example {
207
226
} ) ;
208
227
let uniform_buf = device. create_buffer ( & wgpu:: BufferDescriptor {
209
228
size : 64 ,
210
- usage : wgpu:: BufferUsageFlags :: UNIFORM | wgpu:: BufferUsageFlags :: TRANSFER_DST ,
229
+ usage : wgpu:: BufferUsageFlags :: UNIFORM | wgpu:: BufferUsageFlags :: TRANSFER_DST | wgpu :: BufferUsageFlags :: MAP_WRITE ,
211
230
} ) ;
212
231
let mx_total = Self :: generate_matrix ( sc_desc. width as f32 / sc_desc. height as f32 ) ;
213
232
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
+ } ) ;
215
239
216
240
// Create bind group
217
241
let bind_group = device. create_bind_group ( & wgpu:: BindGroupDescriptor {
@@ -310,7 +334,12 @@ impl framework::Example for Example {
310
334
fn resize ( & mut self , sc_desc : & wgpu:: SwapChainDescriptor , _device : & mut wgpu:: Device ) {
311
335
let mx_total = Self :: generate_matrix ( sc_desc. width as f32 / sc_desc. height as f32 ) ;
312
336
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
+ } ) ;
314
343
}
315
344
316
345
fn render ( & mut self , frame : & wgpu:: SwapChainOutput , device : & mut wgpu:: Device ) {
0 commit comments