@@ -9,6 +9,8 @@ use hal::device::WaitFor;
9
9
use hal:: pool:: RawCommandPool ;
10
10
use hal:: queue:: RawCommandQueue ;
11
11
12
+ use smallvec:: SmallVec ;
13
+
12
14
use std:: ffi:: { CStr , CString } ;
13
15
#[ cfg( feature = "renderdoc" ) ]
14
16
use std:: os:: raw:: c_void;
@@ -357,7 +359,7 @@ pub extern "C" fn gfxGetPhysicalDeviceMemoryProperties(
357
359
}
358
360
#[ inline]
359
361
pub extern "C" fn gfxGetInstanceProcAddr (
360
- instance : VkInstance ,
362
+ _instance : VkInstance ,
361
363
pName : * const :: std:: os:: raw:: c_char ,
362
364
) -> PFN_vkVoidFunction {
363
365
let name = unsafe { CStr :: from_ptr ( pName) } ;
@@ -1105,9 +1107,7 @@ pub extern "C" fn gfxBindBufferMemory(
1105
1107
memory : VkDeviceMemory ,
1106
1108
memoryOffset : VkDeviceSize ,
1107
1109
) -> VkResult {
1108
- let temp = unsafe { mem:: zeroed ( ) } ;
1109
-
1110
- * buffer = match mem:: replace ( & mut * buffer, temp) {
1110
+ let new = match mem:: replace ( & mut * buffer, unsafe { mem:: zeroed ( ) } ) {
1111
1111
Buffer :: Buffer ( _) => panic ! ( "A non-sparse buffer can only be bound once!" ) ,
1112
1112
Buffer :: Unbound ( unbound) => {
1113
1113
Buffer :: Buffer (
@@ -1118,6 +1118,11 @@ pub extern "C" fn gfxBindBufferMemory(
1118
1118
}
1119
1119
} ;
1120
1120
1121
+ // We need to move the value out of the Handle here,
1122
+ // and then put something else back in.
1123
+ let temp = mem:: replace ( & mut * buffer, new) ;
1124
+ mem:: forget ( temp) ;
1125
+
1121
1126
VkResult :: VK_SUCCESS
1122
1127
}
1123
1128
#[ inline]
@@ -1127,9 +1132,7 @@ pub extern "C" fn gfxBindImageMemory(
1127
1132
memory : VkDeviceMemory ,
1128
1133
memoryOffset : VkDeviceSize ,
1129
1134
) -> VkResult {
1130
- let temp = unsafe { mem:: zeroed ( ) } ;
1131
-
1132
- * image = match mem:: replace ( & mut * image, temp) {
1135
+ let new = match mem:: replace ( & mut * image, unsafe { mem:: zeroed ( ) } ) {
1133
1136
Image :: Image { .. } => panic ! ( "An non-sparse image can only be bound once!" ) ,
1134
1137
Image :: Unbound { raw, mip_levels, array_layers } => {
1135
1138
Image :: Image {
@@ -1140,6 +1143,11 @@ pub extern "C" fn gfxBindImageMemory(
1140
1143
}
1141
1144
} ;
1142
1145
1146
+ // We need to move the value out of the Handle here,
1147
+ // and then put something else back in.
1148
+ let temp = mem:: replace ( & mut * image, new) ;
1149
+ mem:: forget ( temp) ;
1150
+
1143
1151
VkResult :: VK_SUCCESS
1144
1152
}
1145
1153
#[ inline]
@@ -1719,7 +1727,13 @@ pub extern "C" fn gfxCreateGraphicsPipelines(
1719
1727
} ;
1720
1728
1721
1729
let shaders = {
1722
- let mut set: pso:: GraphicsShaderSet < _ > = unsafe { mem:: zeroed ( ) } ;
1730
+ let mut set = pso:: GraphicsShaderSet {
1731
+ vertex : unsafe { mem:: zeroed ( ) } , // fake entry point
1732
+ hull : None ,
1733
+ domain : None ,
1734
+ geometry : None ,
1735
+ fragment : None ,
1736
+ } ;
1723
1737
1724
1738
let stages = unsafe {
1725
1739
slice:: from_raw_parts ( info. pStages , info. stageCount as _ )
@@ -1738,7 +1752,10 @@ pub extern "C" fn gfxCreateGraphicsPipelines(
1738
1752
} ;
1739
1753
1740
1754
match stage. stage {
1741
- VK_SHADER_STAGE_VERTEX_BIT => { set. vertex = entry_point; }
1755
+ VK_SHADER_STAGE_VERTEX_BIT => {
1756
+ let fake_vs_entry = mem:: replace ( & mut set. vertex , entry_point) ;
1757
+ mem:: forget ( fake_vs_entry) ;
1758
+ }
1742
1759
VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT => { set. hull = Some ( entry_point) ; }
1743
1760
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT => { set. domain = Some ( entry_point) ; }
1744
1761
VK_SHADER_STAGE_GEOMETRY_BIT => { set. geometry = Some ( entry_point) ; }
@@ -2431,10 +2448,9 @@ pub extern "C" fn gfxFreeDescriptorSets(
2431
2448
assert ! ( descriptorPool. sets. is_none( ) ) ;
2432
2449
2433
2450
descriptorPool. raw . free_sets (
2434
- & descriptor_sets
2451
+ descriptor_sets
2435
2452
. into_iter ( )
2436
2453
. filter_map ( |set| set. unbox ( ) )
2437
- . collect :: < Vec < _ > > ( )
2438
2454
) ;
2439
2455
2440
2456
VkResult :: VK_SUCCESS
@@ -2450,7 +2466,8 @@ pub extern "C" fn gfxUpdateDescriptorSets(
2450
2466
let write_infos = unsafe {
2451
2467
slice:: from_raw_parts ( pDescriptorWrites, descriptorWriteCount as _ )
2452
2468
} ;
2453
- let mut writes = Vec :: new ( ) ; //TODO: avoid allocation here and below
2469
+ //TODO: investigate the safety of passing one giant iterator here
2470
+ let mut writes = SmallVec :: < [ pso:: DescriptorSetWrite < _ , _ > ; 16 ] > :: with_capacity ( write_infos. len ( ) ) ;
2454
2471
2455
2472
for write in write_infos {
2456
2473
let image_info = unsafe {
@@ -2464,14 +2481,12 @@ pub extern "C" fn gfxUpdateDescriptorSets(
2464
2481
} ;
2465
2482
2466
2483
let ty = conv:: map_descriptor_type ( write. descriptorType ) ;
2467
- let descriptors = match ty {
2484
+ let descriptors: SmallVec < [ _ ; 4 ] > = match ty {
2468
2485
pso:: DescriptorType :: Sampler => {
2469
2486
image_info
2470
2487
. into_iter ( )
2471
- . map ( |image| pso:: Descriptor :: Sampler (
2472
- & * image. sampler ,
2473
- ) )
2474
- . collect :: < Vec < _ > > ( )
2488
+ . map ( |image| pso:: Descriptor :: Sampler ( & * image. sampler ) )
2489
+ . collect ( )
2475
2490
}
2476
2491
pso:: DescriptorType :: InputAttachment |
2477
2492
pso:: DescriptorType :: SampledImage |
@@ -2482,23 +2497,23 @@ pub extern "C" fn gfxUpdateDescriptorSets(
2482
2497
& * image. imageView ,
2483
2498
conv:: map_image_layout ( image. imageLayout ) ,
2484
2499
) )
2485
- . collect :: < Vec < _ > > ( )
2500
+ . collect ( )
2486
2501
}
2487
2502
pso:: DescriptorType :: UniformTexelBuffer => {
2488
2503
texel_buffer_views
2489
2504
. into_iter ( )
2490
2505
. map ( |view| pso:: Descriptor :: UniformTexelBuffer (
2491
2506
& * * view,
2492
2507
) )
2493
- . collect :: < Vec < _ > > ( )
2508
+ . collect ( )
2494
2509
}
2495
2510
pso:: DescriptorType :: StorageTexelBuffer => {
2496
2511
texel_buffer_views
2497
2512
. into_iter ( )
2498
2513
. map ( |view| pso:: Descriptor :: StorageTexelBuffer (
2499
2514
& * * view,
2500
2515
) )
2501
- . collect :: < Vec < _ > > ( )
2516
+ . collect ( )
2502
2517
}
2503
2518
pso:: DescriptorType :: UniformBuffer |
2504
2519
pso:: DescriptorType :: StorageBuffer |
@@ -2518,7 +2533,7 @@ pub extern "C" fn gfxUpdateDescriptorSets(
2518
2533
Some ( buffer. offset ) .. end,
2519
2534
)
2520
2535
} )
2521
- . collect :: < Vec < _ > > ( )
2536
+ . collect ( )
2522
2537
}
2523
2538
pso:: DescriptorType :: CombinedImageSampler => {
2524
2539
image_info
@@ -2528,7 +2543,7 @@ pub extern "C" fn gfxUpdateDescriptorSets(
2528
2543
conv:: map_image_layout ( image. imageLayout ) ,
2529
2544
& * image. sampler ,
2530
2545
) )
2531
- . collect :: < Vec < _ > > ( )
2546
+ . collect ( )
2532
2547
}
2533
2548
} ;
2534
2549
@@ -3096,15 +3111,13 @@ pub extern "C" fn gfxCmdBindVertexBuffers(
3096
3111
3097
3112
let views = buffers
3098
3113
. into_iter ( )
3099
- . zip ( offsets. into_iter ( ) )
3114
+ . zip ( offsets)
3100
3115
. map ( |( buffer, offset) | {
3101
3116
let buffer = buffer. expect ( "Non-sparse buffers need to be bound to device memory." ) ;
3117
+ ( buffer, * offset)
3118
+ } ) ;
3102
3119
3103
- ( buffer, * offset as _ )
3104
- } )
3105
- . collect ( ) ;
3106
-
3107
- commandBuffer. bind_vertex_buffers ( firstBinding, pso:: VertexBufferSet ( views) ) ;
3120
+ commandBuffer. bind_vertex_buffers ( firstBinding, views) ;
3108
3121
}
3109
3122
#[ inline]
3110
3123
pub extern "C" fn gfxCmdDraw (
0 commit comments