Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions wgpu-core/src/command/ray_tracing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ pub(crate) fn build_acceleration_structures(
custom_data: instance.custom_data,
mask: instance.mask,
blas_address: blas.handle,
pipeline_intersection_data_offset: 0,
},
));

Expand Down
9 changes: 9 additions & 0 deletions wgpu-hal/src/dx12/adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1016,6 +1016,11 @@ impl super::Adapter {
max_binding_array_acceleration_structure_elements_per_shader_stage:
max_acceleration_structures_per_shader_stage,
max_multiview_view_count,

// not yet implemented
max_intersection_group_count: 0,
max_ray_dispatch_count: 0,
max_ray_recursion_depth: 0,
}),
alignments: crate::Alignments {
buffer_copy_offset: wgt::BufferSize::new(
Expand All @@ -1035,6 +1040,10 @@ impl super::Adapter {
.unwrap(),
ray_tracing_scratch_buffer_alignment:
Direct3D12::D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT,
// Not yet implemented
ray_tracing_pipeline_group_data_size: 0,
ray_tracing_pipeline_group_data_alignment: 0,
ray_tracing_pipeline_data_offset_alignment: 0,
},
downlevel,
cooperative_matrix_properties: Vec::new(),
Expand Down
25 changes: 25 additions & 0 deletions wgpu-hal/src/dx12/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1857,4 +1857,29 @@ impl crate::CommandEncoder for super::CommandEncoder {
_dependencies: &[&super::AccelerationStructure],
) {
}

unsafe fn begin_ray_tracing_pass(&mut self, _desc: &crate::RayTracingPassDescriptor) {
unreachable!("Ray tracing pipelines not supported")
}

unsafe fn end_ray_tracing_pass(&mut self) {
unreachable!("Ray tracing pipelines not supported")
}

unsafe fn set_ray_tracing_pipeline(
&mut self,
_pipeline: &<Self::A as crate::Api>::RayTracingPipeline,
) {
unreachable!("Ray tracing pipelines not supported")
}

unsafe fn trace_rays(
&mut self,
_count: [u32; 3],
_ray_generation_group_data: crate::PipelineGroupData<super::Buffer>,
_miss_group_data: crate::PipelineGroupData<super::Buffer>,
_intersection_group_data: crate::PipelineGroupData<super::Buffer>,
) {
unreachable!("Ray tracing pipelines not supported")
}
}
25 changes: 24 additions & 1 deletion wgpu-hal/src/dx12/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2208,6 +2208,29 @@ impl crate::Device for super::Device {
self.counters.compute_pipelines.sub(1);
}

unsafe fn create_ray_tracing_pipeline(
&self,
_desc: &crate::RayTracingPipelineDescriptor<
super::PipelineLayout,
super::ShaderModule,
super::PipelineCache,
>,
) -> Result<<Self::A as crate::Api>::RayTracingPipeline, crate::PipelineError> {
unreachable!("ray tracing pipelines not yet implemented")
}

unsafe fn destroy_ray_tracing_pipeline(&self, _pipeline: super::RayTracingPipeline) {
unreachable!("ray tracing pipelines not yet implemented")
}

unsafe fn get_raytracing_pipeline_group_data(
&self,
_pipeline: &super::RayTracingPipeline,
_groups: core::ops::Range<u32>,
) -> Result<Vec<u8>, crate::DeviceError> {
unimplemented!("ray tracing pipelines not yet implemented")
}

unsafe fn create_pipeline_cache(
&self,
_desc: &crate::PipelineCacheDescriptor<'_>,
Expand Down Expand Up @@ -2591,7 +2614,7 @@ impl crate::Device for super::Device {
let temp = Direct3D12::D3D12_RAYTRACING_INSTANCE_DESC {
Transform: instance.transform,
_bitfield1: (instance.custom_data & MAX_U24) | (u32::from(instance.mask) << 24),
_bitfield2: 0,
_bitfield2: (instance.pipeline_intersection_data_offset & MAX_U24),
AccelerationStructure: instance.blas_address,
};

Expand Down
7 changes: 7 additions & 0 deletions wgpu-hal/src/dx12/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,7 @@ impl crate::Api for Api {
type ShaderModule = ShaderModule;
type RenderPipeline = RenderPipeline;
type ComputePipeline = ComputePipeline;
type RayTracingPipeline = RayTracingPipeline;
type PipelineCache = PipelineCache;

type AccelerationStructure = AccelerationStructure;
Expand All @@ -499,6 +500,7 @@ crate::impl_dyn_resource!(
PipelineLayout,
QuerySet,
Queue,
RayTracingPipeline,
RenderPipeline,
Sampler,
ShaderModule,
Expand Down Expand Up @@ -1293,6 +1295,11 @@ impl crate::DynComputePipeline for ComputePipeline {}
unsafe impl Send for ComputePipeline {}
unsafe impl Sync for ComputePipeline {}

#[derive(Debug)]
pub struct RayTracingPipeline {}

impl crate::DynRayTracingPipeline for RayTracingPipeline {}

#[derive(Debug)]
pub struct PipelineCache;

Expand Down
58 changes: 56 additions & 2 deletions wgpu-hal/src/dynamic/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ use core::ops::Range;
use crate::{
AccelerationStructureBarrier, Api, Attachment, BufferBarrier, BufferBinding, BufferCopy,
BufferTextureCopy, BuildAccelerationStructureDescriptor, ColorAttachment, CommandEncoder,
ComputePassDescriptor, DepthStencilAttachment, DeviceError, Label, MemoryRange,
PassTimestampWrites, Rect, RenderPassDescriptor, TextureBarrier, TextureCopy,
ComputePassDescriptor, DepthStencilAttachment, DeviceError, DynRayTracingPipeline, Label,
MemoryRange, PassTimestampWrites, RayTracingPassDescriptor, Rect, RenderPassDescriptor,
TextureBarrier, TextureCopy,
};

use super::{
Expand Down Expand Up @@ -190,6 +191,19 @@ pub trait DynCommandEncoder: DynResource + core::fmt::Debug {
offset: wgt::BufferAddress,
);

unsafe fn begin_ray_tracing_pass(&mut self, desc: &RayTracingPassDescriptor);
unsafe fn end_ray_tracing_pass(&mut self);

unsafe fn trace_rays(
&mut self,
count: [u32; 3],
ray_generation_group_data: crate::PipelineGroupData<dyn DynBuffer>,
miss_group_data: crate::PipelineGroupData<dyn DynBuffer>,
intersection_group_data: crate::PipelineGroupData<dyn DynBuffer>,
);

unsafe fn set_ray_tracing_pipeline(&mut self, pipeline: &dyn DynRayTracingPipeline);

unsafe fn build_acceleration_structures<'a>(
&mut self,
descriptors: &'a [BuildAccelerationStructureDescriptor<
Expand Down Expand Up @@ -646,6 +660,46 @@ impl<C: CommandEncoder + DynResource> DynCommandEncoder for C {
unsafe { self.set_vertex_buffer(index, binding) };
}

unsafe fn begin_ray_tracing_pass(&mut self, desc: &RayTracingPassDescriptor) {
let desc = RayTracingPassDescriptor { label: desc.label };
unsafe { C::begin_ray_tracing_pass(self, &desc) };
}

unsafe fn end_ray_tracing_pass(&mut self) {
unsafe { C::end_ray_tracing_pass(self) };
}

unsafe fn set_ray_tracing_pipeline(&mut self, pipeline: &dyn DynRayTracingPipeline) {
let pipeline = pipeline.expect_downcast_ref();
unsafe { C::set_ray_tracing_pipeline(self, pipeline) };
}

unsafe fn trace_rays<'a>(
&mut self,
count: [u32; 3],
ray_generation_group_data: crate::PipelineGroupData<'a, dyn DynBuffer>,
miss_group_data: crate::PipelineGroupData<'a, dyn DynBuffer>,
intersection_group_data: crate::PipelineGroupData<'a, dyn DynBuffer>,
) {
let downcast_group_data =
|data: crate::PipelineGroupData<'a, dyn DynBuffer>| crate::PipelineGroupData {
buffer: data.buffer.expect_downcast_ref(),
offset: data.offset,
stride: data.stride,
count: data.count,
};

unsafe {
C::trace_rays(
self,
count,
downcast_group_data(ray_generation_group_data),
downcast_group_data(miss_group_data),
downcast_group_data(intersection_group_data),
);
}
}

unsafe fn build_acceleration_structures<'a>(
&mut self,
descriptors: &'a [BuildAccelerationStructureDescriptor<
Expand Down
74 changes: 69 additions & 5 deletions wgpu-hal/src/dynamic/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ use crate::{
BindGroupLayoutDescriptor, BufferDescriptor, BufferMapping, CommandEncoderDescriptor,
ComputePipelineDescriptor, Device, DeviceError, FenceValue,
GetAccelerationStructureBuildSizesDescriptor, Label, MemoryRange, PipelineCacheDescriptor,
PipelineCacheError, PipelineError, PipelineLayoutDescriptor, RenderPipelineDescriptor,
SamplerDescriptor, ShaderError, ShaderInput, ShaderModuleDescriptor, TextureDescriptor,
TextureViewDescriptor, TlasInstance,
PipelineCacheError, PipelineError, PipelineLayoutDescriptor, RayObjectIntersectionState,
RayTracingPipelineDescriptor, RenderPipelineDescriptor, SamplerDescriptor, ShaderError,
ShaderInput, ShaderModuleDescriptor, TextureDescriptor, TextureViewDescriptor, TlasInstance,
};

use super::{
DynAccelerationStructure, DynBindGroup, DynBindGroupLayout, DynBuffer, DynCommandEncoder,
DynComputePipeline, DynFence, DynPipelineCache, DynPipelineLayout, DynQuerySet, DynQueue,
DynRenderPipeline, DynResource, DynResourceExt as _, DynSampler, DynShaderModule, DynTexture,
DynTextureView,
DynRayTracingPipeline, DynRenderPipeline, DynResource, DynResourceExt as _, DynSampler,
DynShaderModule, DynTexture, DynTextureView,
};

pub trait DynDevice: DynResource {
Expand Down Expand Up @@ -112,6 +112,21 @@ pub trait DynDevice: DynResource {
) -> Result<Box<dyn DynComputePipeline>, PipelineError>;
unsafe fn destroy_compute_pipeline(&self, pipeline: Box<dyn DynComputePipeline>);

unsafe fn create_ray_tracing_pipeline(
&self,
desc: &RayTracingPipelineDescriptor<
dyn DynPipelineLayout,
dyn DynShaderModule,
dyn DynPipelineCache,
>,
) -> Result<Box<dyn DynRayTracingPipeline>, PipelineError>;
unsafe fn destroy_ray_tracing_pipeline(&self, pipeline: Box<dyn DynRayTracingPipeline>);
unsafe fn get_raytracing_pipeline_group_data(
&self,
pipeline: &dyn DynRayTracingPipeline,
groups: core::ops::Range<u32>,
) -> Result<Vec<u8>, DeviceError>;

unsafe fn create_pipeline_cache(
&self,
desc: &PipelineCacheDescriptor<'_>,
Expand Down Expand Up @@ -442,6 +457,55 @@ impl<D: Device + DynResource> DynDevice for D {
unsafe { D::destroy_compute_pipeline(self, pipeline.unbox()) };
}

unsafe fn create_ray_tracing_pipeline(
&self,
desc: &RayTracingPipelineDescriptor<
dyn DynPipelineLayout,
dyn DynShaderModule,
dyn DynPipelineCache,
>,
) -> Result<Box<dyn DynRayTracingPipeline>, PipelineError> {
let ray_intersection: Vec<_> = desc
.intersection
.iter()
.map(|stage| RayObjectIntersectionState {
closest_hit: stage.closest_hit.clone().expect_downcast(),
any_hit: stage
.any_hit
.as_ref()
.map(|stage| stage.clone().expect_downcast()),
})
.collect();

let desc = RayTracingPipelineDescriptor {
label: desc.label,
layout: desc.layout.expect_downcast_ref(),
ray_generation: desc.ray_generation.clone().expect_downcast(),
miss: desc.miss.clone().expect_downcast(),
intersection: &ray_intersection,
max_recursion_depth: desc.max_recursion_depth,
cache: desc.cache.as_ref().map(|c| c.expect_downcast_ref()),
};

unsafe { D::create_ray_tracing_pipeline(self, &desc) }
.map(|b| -> Box<dyn DynRayTracingPipeline> { Box::new(b) })
}

unsafe fn destroy_ray_tracing_pipeline(&self, pipeline: Box<dyn DynRayTracingPipeline>) {
unsafe {
D::destroy_ray_tracing_pipeline(self, pipeline.unbox());
};
}
unsafe fn get_raytracing_pipeline_group_data(
&self,
pipeline: &dyn DynRayTracingPipeline,
groups: core::ops::Range<u32>,
) -> Result<Vec<u8>, DeviceError> {
unsafe {
D::get_raytracing_pipeline_group_data(self, pipeline.expect_downcast_ref(), groups)
}
}

unsafe fn create_pipeline_cache(
&self,
desc: &PipelineCacheDescriptor<'_>,
Expand Down
1 change: 1 addition & 0 deletions wgpu-hal/src/dynamic/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ pub trait DynPipelineCache: DynResource + fmt::Debug {}
pub trait DynPipelineLayout: DynResource + fmt::Debug {}
pub trait DynQuerySet: DynResource + fmt::Debug {}
pub trait DynRenderPipeline: DynResource + fmt::Debug {}
pub trait DynRayTracingPipeline: DynResource + fmt::Debug {}
pub trait DynSampler: DynResource + fmt::Debug {}
pub trait DynShaderModule: DynResource + fmt::Debug {}
pub trait DynSurfaceTexture:
Expand Down
7 changes: 7 additions & 0 deletions wgpu-hal/src/gles/adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,10 @@ impl super::Adapter {
max_acceleration_structures_per_shader_stage: 0,

max_multiview_view_count: 0,

max_intersection_group_count: 0,
max_ray_dispatch_count: 0,
max_ray_recursion_depth: 0,
});

let mut workarounds = super::Workarounds::empty();
Expand Down Expand Up @@ -920,6 +924,9 @@ impl super::Adapter {
uniform_bounds_check_alignment: wgt::BufferSize::new(1).unwrap(),
raw_tlas_instance_size: 0,
ray_tracing_scratch_buffer_alignment: 0,
ray_tracing_pipeline_group_data_size: 0,
ray_tracing_pipeline_group_data_alignment: 0,
ray_tracing_pipeline_data_offset_alignment: 0,
},
cooperative_matrix_properties: Vec::new(),
},
Expand Down
25 changes: 25 additions & 0 deletions wgpu-hal/src/gles/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1317,4 +1317,29 @@ impl crate::CommandEncoder for super::CommandEncoder {
) {
unimplemented!()
}

unsafe fn begin_ray_tracing_pass(&mut self, _desc: &crate::RayTracingPassDescriptor) {
unimplemented!()
}

unsafe fn end_ray_tracing_pass(&mut self) {
unimplemented!()
}

unsafe fn set_ray_tracing_pipeline(
&mut self,
_pipeline: &<Self::A as crate::Api>::RayTracingPipeline,
) {
unimplemented!()
}

unsafe fn trace_rays(
&mut self,
_count: [u32; 3],
_ray_generation_group_data: crate::PipelineGroupData<super::Buffer>,
_miss_group_data: crate::PipelineGroupData<super::Buffer>,
_intersection_group_data: crate::PipelineGroupData<super::Buffer>,
) {
unimplemented!()
}
}
23 changes: 23 additions & 0 deletions wgpu-hal/src/gles/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1553,6 +1553,29 @@ impl crate::Device for super::Device {
self.counters.compute_pipelines.sub(1);
}

unsafe fn create_ray_tracing_pipeline(
&self,
_desc: &crate::RayTracingPipelineDescriptor<
super::PipelineLayout,
super::ShaderModule,
super::PipelineCache,
>,
) -> Result<super::RayTracingPipeline, crate::PipelineError> {
unimplemented!("Ray tracing is unsupported on GL")
}

unsafe fn destroy_ray_tracing_pipeline(&self, _pipeline: super::RayTracingPipeline) {
unimplemented!("Ray tracing is unsupported on GL")
}

unsafe fn get_raytracing_pipeline_group_data(
&self,
_pipeline: &super::RayTracingPipeline,
_groups: core::ops::Range<u32>,
) -> Result<Vec<u8>, crate::DeviceError> {
unimplemented!("Ray tracing is unsupported on GL")
}

unsafe fn create_pipeline_cache(
&self,
_: &crate::PipelineCacheDescriptor<'_>,
Expand Down
Loading