@@ -293,49 +293,42 @@ impl Vulkan {
293
293
frame : & Object ,
294
294
) -> Result < ( vk:: Image , vk:: DeviceMemory ) , Box < dyn Error > > {
295
295
// External memory info
296
- let frame_image_memory_info = vk:: ExternalMemoryImageCreateInfo {
297
- handle_types : vk:: ExternalMemoryHandleTypeFlags :: DMA_BUF_EXT ,
298
- ..Default :: default ( )
299
- } ;
296
+ let mut frame_image_memory_info = vk:: ExternalMemoryImageCreateInfo :: default ( )
297
+ . handle_types ( vk:: ExternalMemoryHandleTypeFlags :: DMA_BUF_EXT ) ;
300
298
301
299
// Image create info
302
- let frame_image_create_info = vk:: ImageCreateInfo {
303
- p_next : & frame_image_memory_info as * const _ as * const std :: ffi :: c_void ,
304
- image_type : vk:: ImageType :: TYPE_2D ,
305
- format : vk:: Format :: R8G8B8A8_UNORM ,
306
- extent : vk:: Extent3D {
300
+ let frame_image_create_info = vk:: ImageCreateInfo :: default ( )
301
+ . push_next ( & mut frame_image_memory_info )
302
+ . image_type ( vk:: ImageType :: TYPE_2D )
303
+ . format ( vk:: Format :: R8G8B8A8_UNORM )
304
+ . extent ( vk:: Extent3D {
307
305
width : frame. width ,
308
306
height : frame. height ,
309
307
depth : 1 ,
310
- } ,
311
- mip_levels : 1 ,
312
- array_layers : 1 ,
313
- tiling : vk:: ImageTiling :: OPTIMAL ,
314
- initial_layout : vk:: ImageLayout :: UNDEFINED ,
315
- samples : vk:: SampleCountFlags :: TYPE_1 ,
316
- usage : vk:: ImageUsageFlags :: TRANSFER_SRC ,
317
- sharing_mode : vk:: SharingMode :: EXCLUSIVE ,
318
- ..Default :: default ( )
319
- } ;
308
+ } )
309
+ . mip_levels ( 1 )
310
+ . array_layers ( 1 )
311
+ . tiling ( vk:: ImageTiling :: OPTIMAL )
312
+ . initial_layout ( vk:: ImageLayout :: UNDEFINED )
313
+ . samples ( vk:: SampleCountFlags :: TYPE_1 )
314
+ . usage ( vk:: ImageUsageFlags :: TRANSFER_SRC )
315
+ . sharing_mode ( vk:: SharingMode :: EXCLUSIVE ) ;
320
316
321
317
let frame_image = unsafe {
322
318
self . device
323
319
. create_image ( & frame_image_create_info, None )
324
- . map_err ( anyhow :: Error :: msg ) ?
320
+ . expect ( "Failed to create image" )
325
321
} ;
326
322
327
323
// Memory requirements info
328
- let frame_image_memory_req_info = vk:: ImageMemoryRequirementsInfo2 {
329
- image : frame_image,
330
- ..Default :: default ( )
331
- } ;
324
+ let frame_image_memory_req_info =
325
+ vk:: ImageMemoryRequirementsInfo2 :: default ( ) . image ( frame_image) ;
332
326
333
327
// Memory requirements
334
328
let mut frame_image_mem_dedicated_req = vk:: MemoryDedicatedRequirements :: default ( ) ;
335
- let mut frame_image_mem_req = vk:: MemoryRequirements2 {
336
- p_next : & mut frame_image_mem_dedicated_req as * mut _ as * mut std:: ffi:: c_void ,
337
- ..Default :: default ( )
338
- } ;
329
+
330
+ let mut frame_image_mem_req =
331
+ vk:: MemoryRequirements2 :: default ( ) . push_next ( & mut frame_image_mem_dedicated_req) ;
339
332
340
333
unsafe {
341
334
self . device . get_image_memory_requirements2 (
@@ -350,50 +343,45 @@ impl Vulkan {
350
343
. memory_type_bits
351
344
. trailing_zeros ( ) ;
352
345
353
- // Import memory info
354
- let frame_import_memory_info = vk :: ImportMemoryFdInfoKHR {
355
- handle_type : vk :: ExternalMemoryHandleTypeFlags :: DMA_BUF_EXT ,
356
- fd : frame . fds [ 0 ] ,
357
- .. Default :: default ( )
358
- } ;
346
+ // Import memory app_info
347
+ // Construct the memory alloctation info according to the requirements
348
+ // If the image needs dedicated memory, add MemoryDedicatedAllocateInfo to the info chain
349
+ let mut frame_import_memory_info = vk :: ImportMemoryFdInfoKHR :: default ( )
350
+ . handle_type ( vk :: ExternalMemoryHandleTypeFlags :: DMA_BUF_EXT )
351
+ . fd ( frame . fds [ 0 ] ) ;
359
352
360
- // Dedicated allocation info
361
- let frame_image_memory_dedicated_info = vk:: MemoryDedicatedAllocateInfo {
362
- image : frame_image,
363
- ..Default :: default ( )
364
- } ;
353
+ // dedicated allocation info
354
+ let mut frame_image_memory_dedicated_info =
355
+ vk:: MemoryDedicatedAllocateInfo :: default ( ) . image ( frame_image) ;
365
356
366
357
// Memory allocate info
367
- let mut frame_image_allocate_info = vk:: MemoryAllocateInfo {
368
- p_next : & frame_import_memory_info as * const _ as * const std:: ffi:: c_void ,
369
- allocation_size : frame_image_mem_req. memory_requirements . size ,
370
- memory_type_index,
371
- ..Default :: default ( )
372
- } ;
358
+ let mut frame_image_allocate_info = vk:: MemoryAllocateInfo :: default ( )
359
+ . push_next ( & mut frame_import_memory_info)
360
+ . allocation_size ( frame_image_mem_req. memory_requirements . size )
361
+ . memory_type_index ( memory_type_index) ;
373
362
374
363
if frame_image_mem_dedicated_req. prefers_dedicated_allocation == vk:: TRUE {
375
- frame_image_allocate_info. p_next =
376
- & frame_image_memory_dedicated_info as * const _ as * const std :: ffi :: c_void ;
364
+ frame_image_allocate_info =
365
+ frame_image_allocate_info . push_next ( & mut frame_image_memory_dedicated_info ) ;
377
366
}
378
367
379
368
// Allocate memory and bind it to the image
380
369
let frame_image_memory = unsafe {
381
370
self . device
382
371
. allocate_memory ( & frame_image_allocate_info, None )
383
- . map_err ( anyhow :: Error :: msg ) ?
372
+ . expect ( "Failed to allocate memory" )
384
373
} ;
385
374
386
375
unsafe {
387
376
self . device
388
377
. bind_image_memory ( frame_image, frame_image_memory, 0 )
389
- . map_err ( anyhow :: Error :: msg ) ?
378
+ . expect ( "Failed to bind image memory" ) ;
390
379
} ;
391
380
392
381
Ok ( ( frame_image, frame_image_memory) )
393
382
}
394
383
395
384
#[ allow( clippy:: too_many_arguments) ]
396
-
397
385
fn add_barrier (
398
386
& self ,
399
387
image : & vk:: Image ,
@@ -405,21 +393,19 @@ impl Vulkan {
405
393
dst_access_mask : vk:: AccessFlags ,
406
394
src_stage_mask : vk:: PipelineStageFlags ,
407
395
) {
408
- let image_barrier = vk:: ImageMemoryBarrier {
409
- old_layout,
410
- new_layout,
411
- image : * image,
412
- subresource_range : vk:: ImageSubresourceRange {
413
- aspect_mask : vk:: ImageAspectFlags :: COLOR ,
414
- base_mip_level,
415
- level_count : mip_levels,
416
- layer_count : 1 ,
417
- ..Default :: default ( )
418
- } ,
419
- src_access_mask,
420
- dst_access_mask,
421
- ..Default :: default ( )
422
- } ;
396
+ let image_barrier = vk:: ImageMemoryBarrier :: default ( )
397
+ . old_layout ( old_layout)
398
+ . new_layout ( new_layout)
399
+ . image ( * image)
400
+ . subresource_range (
401
+ vk:: ImageSubresourceRange :: default ( )
402
+ . aspect_mask ( vk:: ImageAspectFlags :: COLOR )
403
+ . base_mip_level ( base_mip_level)
404
+ . level_count ( mip_levels)
405
+ . layer_count ( 1 ) ,
406
+ )
407
+ . src_access_mask ( src_access_mask)
408
+ . dst_access_mask ( dst_access_mask) ;
423
409
424
410
unsafe {
425
411
self . device . cmd_pipeline_barrier (
0 commit comments