@@ -3434,11 +3434,11 @@ impl super::Device for Device {
3434
3434
}
3435
3435
}
3436
3436
3437
- fn create_raytracing_tlas (
3437
+ fn create_raytracing_tlas_with_heap (
3438
3438
& mut self ,
3439
- info : & RaytracingTLASInfo < Self >
3439
+ info : & RaytracingTLASInfo < Self > ,
3440
+ heap : & mut Heap
3440
3441
) -> result:: Result < RaytracingTLAS , super :: Error > {
3441
-
3442
3442
// pack 24: 8 bits
3443
3443
let pack_24_8 = |a, b| {
3444
3444
( a & 0x00ffffff ) | ( ( b & 0x000000ff ) << 24 )
@@ -3458,15 +3458,17 @@ impl super::Device for Device {
3458
3458
3459
3459
// create upload buffer for instance descs
3460
3460
let stride = std:: mem:: size_of :: < D3D12_RAYTRACING_INSTANCE_DESC > ( ) ;
3461
- let instance_buffer = self . create_buffer ( & BufferInfo {
3461
+ let instance_buffer = self . create_buffer_with_heap ( & BufferInfo {
3462
3462
usage : super :: BufferUsage :: UPLOAD ,
3463
3463
cpu_access : super :: CpuAccessFlags :: NONE ,
3464
3464
format : super :: Format :: Unknown ,
3465
3465
stride : std:: mem:: size_of :: < D3D12_RAYTRACING_INSTANCE_DESC > ( ) ,
3466
3466
num_elements : num_instances,
3467
3467
initial_state : super :: ResourceState :: GenericRead
3468
- } , Some ( instance_descs. as_slice ( ) ) )
3469
- . expect ( format ! ( "hotline_rs::gfx::d3d12: failed to create a scratch buffer for raytracing blas of size {}" , stride * num_instances) . as_str ( ) ) ;
3468
+ } ,
3469
+ Some ( instance_descs. as_slice ( ) ) ,
3470
+ heap
3471
+ ) . expect ( format ! ( "hotline_rs::gfx::d3d12: failed to create a scratch buffer for raytracing blas of size {}" , stride * num_instances) . as_str ( ) ) ;
3470
3472
3471
3473
// create acceleration structure inputs
3472
3474
let inputs = D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS {
@@ -3489,25 +3491,31 @@ impl super::Device for Device {
3489
3491
} ;
3490
3492
3491
3493
// UAV scratch buffer
3492
- let scratch_buffer = self . create_buffer :: < u8 > ( & BufferInfo {
3494
+ let scratch_buffer = self . create_buffer_with_heap :: < u8 > ( & BufferInfo {
3493
3495
usage : super :: BufferUsage :: UNORDERED_ACCESS | super :: BufferUsage :: BUFFER_ONLY ,
3494
3496
cpu_access : super :: CpuAccessFlags :: NONE ,
3495
3497
format : super :: Format :: Unknown ,
3496
3498
stride : prebuild_info. ScratchDataSizeInBytes as usize ,
3497
3499
num_elements : 1 ,
3498
3500
initial_state : super :: ResourceState :: UnorderedAccess
3499
- } , None )
3501
+ } ,
3502
+ None ,
3503
+ heap
3504
+ )
3500
3505
. expect ( format ! ( "hotline_rs::gfx::d3d12: failed to create a scratch buffer for raytracing tlas of size {}" , prebuild_info. ScratchDataSizeInBytes ) . as_str ( ) ) ;
3501
3506
3502
3507
// UAV buffer the tlas
3503
- let tlas_buffer = self . create_buffer :: < u8 > ( & BufferInfo {
3508
+ let tlas_buffer = self . create_buffer_with_heap :: < u8 > ( & BufferInfo {
3504
3509
usage : super :: BufferUsage :: UNORDERED_ACCESS | super :: BufferUsage :: ACCELERATION_STRUCTURE ,
3505
3510
cpu_access : super :: CpuAccessFlags :: NONE ,
3506
3511
format : super :: Format :: Unknown ,
3507
3512
stride : prebuild_info. ResultDataMaxSizeInBytes as usize ,
3508
3513
num_elements : 1 ,
3509
3514
initial_state : super :: ResourceState :: AccelerationStructure
3510
- } , None ) . expect ( format ! ( "hotline_rs::gfx::d3d12: failed to create a tlas of size {}" , prebuild_info. ScratchDataSizeInBytes ) . as_str ( ) ) ;
3515
+ } ,
3516
+ None ,
3517
+ heap
3518
+ ) . expect ( format ! ( "hotline_rs::gfx::d3d12: failed to create a tlas of size {}" , prebuild_info. ScratchDataSizeInBytes ) . as_str ( ) ) ;
3511
3519
3512
3520
// create tlas desc
3513
3521
let tlas_desc = D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC {
@@ -3535,6 +3543,16 @@ impl super::Device for Device {
3535
3543
} )
3536
3544
}
3537
3545
3546
+ fn create_raytracing_tlas (
3547
+ & mut self ,
3548
+ info : & RaytracingTLASInfo < Self >
3549
+ ) -> result:: Result < RaytracingTLAS , super :: Error > {
3550
+ let mut heap = std:: mem:: take ( & mut self . shader_heap ) . unwrap ( ) ;
3551
+ let result = self . create_raytracing_tlas_with_heap ( info, & mut heap) ;
3552
+ self . shader_heap = Some ( heap) ;
3553
+ result
3554
+ }
3555
+
3538
3556
fn create_indirect_render_command < T : Sized > (
3539
3557
& mut self ,
3540
3558
arguments : Vec < super :: IndirectArgument > ,
0 commit comments