Skip to content

Commit e50cecf

Browse files
committed
Implements Device::tlas_instance_to_bytes().
1 parent 45dbf28 commit e50cecf

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

wgpu-hal/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ metal = [
7575
"naga/msl-out",
7676
"dep:arrayvec",
7777
"dep:block",
78+
"dep:bytemuck",
7879
"dep:core-graphics-types",
7980
"dep:hashbrown",
8081
"dep:libc",

wgpu-hal/src/metal/device.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use alloc::{borrow::ToOwned as _, sync::Arc, vec::Vec};
22
use core::{ptr::NonNull, sync::atomic};
33
use std::{thread, time};
44

5+
use bytemuck::TransparentWrapper;
56
use parking_lot::Mutex;
67

78
use super::{conv, PassthroughShader};
@@ -1629,8 +1630,40 @@ impl crate::Device for super::Device {
16291630
// self.counters.acceleration_structures.sub(1);
16301631
}
16311632

1632-
fn tlas_instance_to_bytes(&self, _instance: TlasInstance) -> Vec<u8> {
1633-
unimplemented!()
1633+
fn tlas_instance_to_bytes(&self, instance: TlasInstance) -> Vec<u8> {
1634+
let temp = metal::MTLIndirectAccelerationStructureInstanceDescriptor {
1635+
transformation_matrix: [
1636+
[
1637+
instance.transform[0],
1638+
instance.transform[4],
1639+
instance.transform[8],
1640+
],
1641+
[
1642+
instance.transform[1],
1643+
instance.transform[5],
1644+
instance.transform[9],
1645+
],
1646+
[
1647+
instance.transform[2],
1648+
instance.transform[6],
1649+
instance.transform[10],
1650+
],
1651+
[
1652+
instance.transform[3],
1653+
instance.transform[7],
1654+
instance.transform[11],
1655+
],
1656+
],
1657+
options: metal::MTLAccelerationStructureInstanceOptions::None,
1658+
mask: instance.mask as u32,
1659+
intersection_function_table_offset: 0,
1660+
acceleration_structure_id: instance.blas_address,
1661+
user_id: instance.custom_data,
1662+
};
1663+
1664+
wgt::bytemuck_wrapper!(unsafe struct Desc(metal::MTLIndirectAccelerationStructureInstanceDescriptor));
1665+
1666+
bytemuck::bytes_of(&Desc::wrap(temp)).to_vec()
16341667
}
16351668

16361669
fn get_internal_counters(&self) -> wgt::HalCounters {

0 commit comments

Comments
 (0)