diff --git a/wgpu-core/src/device/ray_tracing.rs b/wgpu-core/src/device/ray_tracing.rs index 8372eba51b..02286dc01d 100644 --- a/wgpu-core/src/device/ray_tracing.rs +++ b/wgpu-core/src/device/ray_tracing.rs @@ -57,6 +57,19 @@ impl Device { self.features.allowed_vertex_formats_for_blas(), )); } + + let mut transform = None; + + if blas_desc + .flags + .contains(wgt::AccelerationStructureFlags::USE_TRANSFORM) + { + transform = Some(wgpu_hal::AccelerationStructureTriangleTransform { + buffer: self.zero_buffer.as_ref(), + offset: 0, + }) + } + entries.push(hal::AccelerationStructureTriangles:: { vertex_buffer: None, vertex_format: desc.vertex_format, @@ -64,7 +77,7 @@ impl Device { vertex_count: desc.vertex_count, vertex_stride: 0, indices, - transform: None, + transform, flags: desc.flags, }); } diff --git a/wgpu-core/src/device/resource.rs b/wgpu-core/src/device/resource.rs index 09747137ac..8e3843509b 100644 --- a/wgpu-core/src/device/resource.rs +++ b/wgpu-core/src/device/resource.rs @@ -208,7 +208,9 @@ impl Device { raw_device.create_buffer(&hal::BufferDescriptor { label: hal_label(Some("(wgpu internal) zero init buffer"), instance_flags), size: ZERO_BUFFER_SIZE, - usage: wgt::BufferUses::COPY_SRC | wgt::BufferUses::COPY_DST, + usage: wgt::BufferUses::COPY_SRC + | wgt::BufferUses::COPY_DST + | wgt::BufferUses::TOP_LEVEL_ACCELERATION_STRUCTURE_INPUT, memory_flags: hal::MemoryFlags::empty(), }) } diff --git a/wgpu-hal/src/dx12/device.rs b/wgpu-hal/src/dx12/device.rs index 26312f52de..066c948719 100644 --- a/wgpu-hal/src/dx12/device.rs +++ b/wgpu-hal/src/dx12/device.rs @@ -2151,7 +2151,15 @@ impl crate::Device for super::Device { .flags .contains(wgt::AccelerationStructureFlags::USE_TRANSFORM) { - 1 + unsafe { + triangle + .transform + .as_ref() + .unwrap() + .buffer + .resource + .GetGPUVirtualAddress() + } } else { 0 }, diff --git a/wgpu-hal/src/vulkan/device.rs b/wgpu-hal/src/vulkan/device.rs index fd1c6b03c1..596055a7b7 100644 --- a/wgpu-hal/src/vulkan/device.rs +++ b/wgpu-hal/src/vulkan/device.rs @@ -2379,7 +2379,20 @@ impl crate::Device for super::Device { .flags .contains(wgt::AccelerationStructureFlags::USE_TRANSFORM) { - 1 + unsafe { + ray_tracing_functions + .buffer_device_address + .get_buffer_device_address( + &vk::BufferDeviceAddressInfo::default().buffer( + triangles + .transform + .as_ref() + .unwrap() + .buffer + .raw, + ), + ) + } } else { 0 },