@@ -81,12 +81,7 @@ impl Global {
81
81
82
82
let device = & cmd_buf. device ;
83
83
84
- if !device
85
- . features
86
- . contains ( Features :: EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE )
87
- {
88
- return Err ( BuildAccelerationStructureError :: MissingFeature ) ;
89
- }
84
+ device. require_features ( Features :: EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE ) ?;
90
85
91
86
let build_command_index = NonZeroU64 :: new (
92
87
device
@@ -199,18 +194,13 @@ impl Global {
199
194
let mut tlas_buf_storage = Vec :: new ( ) ;
200
195
201
196
for entry in tlas_iter {
202
- let instance_buffer = match hub. buffers . get ( entry. instance_buffer_id ) . get ( ) {
203
- Ok ( buffer) => buffer,
204
- Err ( _) => {
205
- return Err ( BuildAccelerationStructureError :: InvalidBufferId ) ;
206
- }
207
- } ;
197
+ let instance_buffer = hub. buffers . get ( entry. instance_buffer_id ) . get ( ) ?;
208
198
let data = cmd_buf_data. trackers . buffers . set_single (
209
199
& instance_buffer,
210
200
BufferUses :: BOTTOM_LEVEL_ACCELERATION_STRUCTURE_INPUT ,
211
201
) ;
212
202
tlas_buf_storage. push ( TlasBufferStore {
213
- buffer : instance_buffer. clone ( ) ,
203
+ buffer : instance_buffer,
214
204
transition : data,
215
205
entry : entry. clone ( ) ,
216
206
} ) ;
@@ -221,14 +211,9 @@ impl Global {
221
211
let instance_buffer = {
222
212
let ( instance_buffer, instance_pending) =
223
213
( & mut tlas_buf. buffer , & mut tlas_buf. transition ) ;
224
- let instance_raw = instance_buffer. raw . get ( & snatch_guard) . ok_or (
225
- BuildAccelerationStructureError :: InvalidBuffer ( instance_buffer. error_ident ( ) ) ,
226
- ) ?;
227
- if !instance_buffer. usage . contains ( BufferUsages :: TLAS_INPUT ) {
228
- return Err ( BuildAccelerationStructureError :: MissingTlasInputUsageFlag (
229
- instance_buffer. error_ident ( ) ,
230
- ) ) ;
231
- }
214
+ let instance_raw = instance_buffer. try_raw ( & snatch_guard) ?;
215
+ instance_buffer. check_usage ( BufferUsages :: TLAS_INPUT ) ?;
216
+
232
217
if let Some ( barrier) = instance_pending
233
218
. take ( )
234
219
. map ( |pending| pending. into_hal ( instance_buffer, & snatch_guard) )
@@ -238,11 +223,7 @@ impl Global {
238
223
instance_raw
239
224
} ;
240
225
241
- let tlas = hub
242
- . tlas_s
243
- . get ( entry. tlas_id )
244
- . get ( )
245
- . map_err ( |_| BuildAccelerationStructureError :: InvalidTlasId ) ?;
226
+ let tlas = hub. tlas_s . get ( entry. tlas_id ) . get ( ) ?;
246
227
cmd_buf_data. trackers . tlas_s . set_single ( tlas. clone ( ) ) ;
247
228
if let Some ( queue) = device. get_queue ( ) {
248
229
queue. pending_writes . lock ( ) . insert_tlas ( & tlas) ;
@@ -266,7 +247,7 @@ impl Global {
266
247
tlas,
267
248
entries : hal:: AccelerationStructureEntries :: Instances (
268
249
hal:: AccelerationStructureInstances {
269
- buffer : Some ( instance_buffer. as_ref ( ) ) ,
250
+ buffer : Some ( instance_buffer) ,
270
251
offset : 0 ,
271
252
count : entry. instance_count ,
272
253
} ,
@@ -311,9 +292,7 @@ impl Global {
311
292
mode : hal:: AccelerationStructureBuildMode :: Build ,
312
293
flags : tlas. flags ,
313
294
source_acceleration_structure : None ,
314
- destination_acceleration_structure : tlas. raw ( & snatch_guard) . ok_or (
315
- BuildAccelerationStructureError :: InvalidTlas ( tlas. error_ident ( ) ) ,
316
- ) ?,
295
+ destination_acceleration_structure : tlas. try_raw ( & snatch_guard) ?,
317
296
scratch_buffer : scratch_buffer. raw ( ) ,
318
297
scratch_buffer_offset : * scratch_buffer_offset,
319
298
} )
@@ -381,12 +360,7 @@ impl Global {
381
360
382
361
let device = & cmd_buf. device ;
383
362
384
- if !device
385
- . features
386
- . contains ( Features :: EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE )
387
- {
388
- return Err ( BuildAccelerationStructureError :: MissingFeature ) ;
389
- }
363
+ device. require_features ( Features :: EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE ) ?;
390
364
391
365
let build_command_index = NonZeroU64 :: new (
392
366
device
@@ -521,17 +495,14 @@ impl Global {
521
495
let mut tlas_lock_store = Vec :: < ( Option < TlasPackage > , Arc < Tlas > ) > :: new ( ) ;
522
496
523
497
for package in tlas_iter {
524
- let tlas = hub
525
- . tlas_s
526
- . get ( package. tlas_id )
527
- . get ( )
528
- . map_err ( |_| BuildAccelerationStructureError :: InvalidTlasId ) ?;
498
+ let tlas = hub. tlas_s . get ( package. tlas_id ) . get ( ) ?;
529
499
if let Some ( queue) = device. get_queue ( ) {
530
500
queue. pending_writes . lock ( ) . insert_tlas ( & tlas) ;
531
501
}
502
+
532
503
cmd_buf_data. trackers . tlas_s . set_single ( tlas. clone ( ) ) ;
533
504
534
- tlas_lock_store. push ( ( Some ( package) , tlas. clone ( ) ) )
505
+ tlas_lock_store. push ( ( Some ( package) , tlas) )
535
506
}
536
507
537
508
let mut scratch_buffer_tlas_size = 0 ;
@@ -558,12 +529,7 @@ impl Global {
558
529
tlas. error_ident ( ) ,
559
530
) ) ;
560
531
}
561
- let blas = hub
562
- . blas_s
563
- . get ( instance. blas_id )
564
- . get ( )
565
- . map_err ( |_| BuildAccelerationStructureError :: InvalidBlasIdForInstance ) ?
566
- . clone ( ) ;
532
+ let blas = hub. blas_s . get ( instance. blas_id ) . get ( ) ?;
567
533
568
534
cmd_buf_data. trackers . blas_s . set_single ( blas. clone ( ) ) ;
569
535
@@ -581,7 +547,7 @@ impl Global {
581
547
dependencies. push ( blas. clone ( ) ) ;
582
548
583
549
cmd_buf_data. blas_actions . push ( BlasAction {
584
- blas : blas . clone ( ) ,
550
+ blas,
585
551
kind : crate :: ray_tracing:: BlasActionKind :: Use ,
586
552
} ) ;
587
553
}
@@ -659,13 +625,7 @@ impl Global {
659
625
mode : hal:: AccelerationStructureBuildMode :: Build ,
660
626
flags : tlas. flags ,
661
627
source_acceleration_structure : None ,
662
- destination_acceleration_structure : tlas
663
- . raw
664
- . get ( & snatch_guard)
665
- . ok_or ( BuildAccelerationStructureError :: InvalidTlas (
666
- tlas. error_ident ( ) ,
667
- ) ) ?
668
- . as_ref ( ) ,
628
+ destination_acceleration_structure : tlas. try_raw ( & snatch_guard) ?,
669
629
scratch_buffer : scratch_buffer. raw ( ) ,
670
630
scratch_buffer_offset : * scratch_buffer_offset,
671
631
} )
@@ -857,9 +817,7 @@ impl CommandBufferMutable {
857
817
action. tlas . error_ident ( ) ,
858
818
) ) ;
859
819
}
860
- if blas. raw . get ( snatch_guard) . is_none ( ) {
861
- return Err ( ValidateTlasActionsError :: InvalidBlas ( blas. error_ident ( ) ) ) ;
862
- }
820
+ blas. try_raw ( snatch_guard) ?;
863
821
}
864
822
}
865
823
}
@@ -879,11 +837,7 @@ fn iter_blas<'a>(
879
837
) -> Result < ( ) , BuildAccelerationStructureError > {
880
838
let mut temp_buffer = Vec :: new ( ) ;
881
839
for entry in blas_iter {
882
- let blas = hub
883
- . blas_s
884
- . get ( entry. blas_id )
885
- . get ( )
886
- . map_err ( |_| BuildAccelerationStructureError :: InvalidBlasId ) ?;
840
+ let blas = hub. blas_s . get ( entry. blas_id ) . get ( ) ?;
887
841
cmd_buf_data. trackers . blas_s . set_single ( blas. clone ( ) ) ;
888
842
if let Some ( queue) = device. get_queue ( ) {
889
843
queue. pending_writes . lock ( ) . insert_blas ( & blas) ;
@@ -966,19 +920,13 @@ fn iter_blas<'a>(
966
920
blas. error_ident ( ) ,
967
921
) ) ;
968
922
}
969
- let vertex_buffer = match hub. buffers . get ( mesh. vertex_buffer ) . get ( ) {
970
- Ok ( buffer) => buffer,
971
- Err ( _) => return Err ( BuildAccelerationStructureError :: InvalidBufferId ) ,
972
- } ;
923
+ let vertex_buffer = hub. buffers . get ( mesh. vertex_buffer ) . get ( ) ?;
973
924
let vertex_pending = cmd_buf_data. trackers . buffers . set_single (
974
925
& vertex_buffer,
975
926
BufferUses :: BOTTOM_LEVEL_ACCELERATION_STRUCTURE_INPUT ,
976
927
) ;
977
928
let index_data = if let Some ( index_id) = mesh. index_buffer {
978
- let index_buffer = match hub. buffers . get ( index_id) . get ( ) {
979
- Ok ( buffer) => buffer,
980
- Err ( _) => return Err ( BuildAccelerationStructureError :: InvalidBufferId ) ,
981
- } ;
929
+ let index_buffer = hub. buffers . get ( index_id) . get ( ) ?;
982
930
if mesh. index_buffer_offset . is_none ( )
983
931
|| mesh. size . index_count . is_none ( )
984
932
|| mesh. size . index_count . is_none ( )
@@ -991,15 +939,12 @@ fn iter_blas<'a>(
991
939
& index_buffer,
992
940
BufferUses :: BOTTOM_LEVEL_ACCELERATION_STRUCTURE_INPUT ,
993
941
) ;
994
- Some ( ( index_buffer. clone ( ) , data) )
942
+ Some ( ( index_buffer, data) )
995
943
} else {
996
944
None
997
945
} ;
998
946
let transform_data = if let Some ( transform_id) = mesh. transform_buffer {
999
- let transform_buffer = match hub. buffers . get ( transform_id) . get ( ) {
1000
- Ok ( buffer) => buffer,
1001
- Err ( _) => return Err ( BuildAccelerationStructureError :: InvalidBufferId ) ,
1002
- } ;
947
+ let transform_buffer = hub. buffers . get ( transform_id) . get ( ) ?;
1003
948
if mesh. transform_buffer_offset . is_none ( ) {
1004
949
return Err ( BuildAccelerationStructureError :: MissingAssociatedData (
1005
950
transform_buffer. error_ident ( ) ,
@@ -1014,7 +959,7 @@ fn iter_blas<'a>(
1014
959
None
1015
960
} ;
1016
961
temp_buffer. push ( TriangleBufferStore {
1017
- vertex_buffer : vertex_buffer . clone ( ) ,
962
+ vertex_buffer,
1018
963
vertex_transition : vertex_pending,
1019
964
index_buffer_transition : index_data,
1020
965
transform_buffer_transition : transform_data,
@@ -1024,7 +969,7 @@ fn iter_blas<'a>(
1024
969
}
1025
970
1026
971
if let Some ( last) = temp_buffer. last_mut ( ) {
1027
- last. ending_blas = Some ( blas. clone ( ) ) ;
972
+ last. ending_blas = Some ( blas) ;
1028
973
buf_storage. append ( & mut temp_buffer) ;
1029
974
}
1030
975
}
@@ -1050,14 +995,9 @@ fn iter_buffers<'a, 'b>(
1050
995
let mesh = & buf. geometry ;
1051
996
let vertex_buffer = {
1052
997
let vertex_buffer = buf. vertex_buffer . as_ref ( ) ;
1053
- let vertex_raw = vertex_buffer. raw . get ( snatch_guard) . ok_or (
1054
- BuildAccelerationStructureError :: InvalidBuffer ( vertex_buffer. error_ident ( ) ) ,
1055
- ) ?;
1056
- if !vertex_buffer. usage . contains ( BufferUsages :: BLAS_INPUT ) {
1057
- return Err ( BuildAccelerationStructureError :: MissingBlasInputUsageFlag (
1058
- vertex_buffer. error_ident ( ) ,
1059
- ) ) ;
1060
- }
998
+ let vertex_raw = vertex_buffer. try_raw ( snatch_guard) ?;
999
+ vertex_buffer. check_usage ( BufferUsages :: BLAS_INPUT ) ?;
1000
+
1061
1001
if let Some ( barrier) = buf
1062
1002
. vertex_transition
1063
1003
. take ( )
@@ -1077,10 +1017,7 @@ fn iter_buffers<'a, 'b>(
1077
1017
let vertex_buffer_offset = mesh. first_vertex as u64 * mesh. vertex_stride ;
1078
1018
cmd_buf_data. buffer_memory_init_actions . extend (
1079
1019
vertex_buffer. initialization_status . read ( ) . create_action (
1080
- & hub. buffers
1081
- . get ( mesh. vertex_buffer )
1082
- . get ( )
1083
- . map_err ( |_| BuildAccelerationStructureError :: InvalidBufferId ) ?,
1020
+ & hub. buffers . get ( mesh. vertex_buffer ) . get ( ) ?,
1084
1021
vertex_buffer_offset
1085
1022
..( vertex_buffer_offset
1086
1023
+ mesh. size . vertex_count as u64 * mesh. vertex_stride ) ,
@@ -1092,14 +1029,9 @@ fn iter_buffers<'a, 'b>(
1092
1029
let index_buffer = if let Some ( ( ref mut index_buffer, ref mut index_pending) ) =
1093
1030
buf. index_buffer_transition
1094
1031
{
1095
- let index_raw = index_buffer. raw . get ( snatch_guard) . ok_or (
1096
- BuildAccelerationStructureError :: InvalidBuffer ( index_buffer. error_ident ( ) ) ,
1097
- ) ?;
1098
- if !index_buffer. usage . contains ( BufferUsages :: BLAS_INPUT ) {
1099
- return Err ( BuildAccelerationStructureError :: MissingBlasInputUsageFlag (
1100
- index_buffer. error_ident ( ) ,
1101
- ) ) ;
1102
- }
1032
+ let index_raw = index_buffer. try_raw ( snatch_guard) ?;
1033
+ index_buffer. check_usage ( BufferUsages :: BLAS_INPUT ) ?;
1034
+
1103
1035
if let Some ( barrier) = index_pending
1104
1036
. take ( )
1105
1037
. map ( |pending| pending. into_hal ( index_buffer, snatch_guard) )
@@ -1155,14 +1087,9 @@ fn iter_buffers<'a, 'b>(
1155
1087
transform_buffer. error_ident ( ) ,
1156
1088
) ) ;
1157
1089
}
1158
- let transform_raw = transform_buffer. raw . get ( snatch_guard) . ok_or (
1159
- BuildAccelerationStructureError :: InvalidBuffer ( transform_buffer. error_ident ( ) ) ,
1160
- ) ?;
1161
- if !transform_buffer. usage . contains ( BufferUsages :: BLAS_INPUT ) {
1162
- return Err ( BuildAccelerationStructureError :: MissingBlasInputUsageFlag (
1163
- transform_buffer. error_ident ( ) ,
1164
- ) ) ;
1165
- }
1090
+ let transform_raw = transform_buffer. try_raw ( snatch_guard) ?;
1091
+ transform_buffer. check_usage ( BufferUsages :: BLAS_INPUT ) ?;
1092
+
1166
1093
if let Some ( barrier) = transform_pending
1167
1094
. take ( )
1168
1095
. map ( |pending| pending. into_hal ( transform_buffer, snatch_guard) )
@@ -1199,7 +1126,7 @@ fn iter_buffers<'a, 'b>(
1199
1126
} ;
1200
1127
1201
1128
let triangles = hal:: AccelerationStructureTriangles {
1202
- vertex_buffer : Some ( vertex_buffer. as_ref ( ) ) ,
1129
+ vertex_buffer : Some ( vertex_buffer) ,
1203
1130
vertex_format : mesh. size . vertex_format ,
1204
1131
first_vertex : mesh. first_vertex ,
1205
1132
vertex_count : mesh. size . vertex_count ,
@@ -1208,13 +1135,13 @@ fn iter_buffers<'a, 'b>(
1208
1135
dyn hal:: DynBuffer ,
1209
1136
> {
1210
1137
format : mesh. size . index_format . unwrap ( ) ,
1211
- buffer : Some ( index_buffer. as_ref ( ) ) ,
1138
+ buffer : Some ( index_buffer) ,
1212
1139
offset : mesh. index_buffer_offset . unwrap ( ) as u32 ,
1213
1140
count : mesh. size . index_count . unwrap ( ) ,
1214
1141
} ) ,
1215
1142
transform : transform_buffer. map ( |transform_buffer| {
1216
1143
hal:: AccelerationStructureTriangleTransform {
1217
- buffer : transform_buffer. as_ref ( ) ,
1144
+ buffer : transform_buffer,
1218
1145
offset : mesh. transform_buffer_offset . unwrap ( ) as u32 ,
1219
1146
}
1220
1147
} ) ,
@@ -1264,13 +1191,7 @@ fn map_blas<'a>(
1264
1191
mode : hal:: AccelerationStructureBuildMode :: Build ,
1265
1192
flags : blas. flags ,
1266
1193
source_acceleration_structure : None ,
1267
- destination_acceleration_structure : blas
1268
- . raw
1269
- . get ( snatch_guard)
1270
- . ok_or ( BuildAccelerationStructureError :: InvalidBlas (
1271
- blas. error_ident ( ) ,
1272
- ) ) ?
1273
- . as_ref ( ) ,
1194
+ destination_acceleration_structure : blas. try_raw ( snatch_guard) ?,
1274
1195
scratch_buffer,
1275
1196
scratch_buffer_offset : * scratch_buffer_offset,
1276
1197
} )
0 commit comments