[Ray-tracing] Change index offset to first index (#6873)

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
This commit is contained in:
Vecvec 2025-01-14 21:56:24 +00:00 committed by GitHub
parent bd3e7b676e
commit 0b2c9e4f4b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 48 additions and 51 deletions

View File

@ -194,6 +194,7 @@ By @wumpf in [#6849](https://github.com/gfx-rs/wgpu/pull/6849).
- Add actual sample type to `CreateBindGroupError::InvalidTextureSampleType` error message. By @ErichDonGubler in [#6530](https://github.com/gfx-rs/wgpu/pull/6530).
- Improve binding error to give a clearer message when there is a mismatch between resource binding as it is in the shader and as it is in the binding layout. By @eliemichel in [#6553](https://github.com/gfx-rs/wgpu/pull/6553).
- `Surface::configure` and `Surface::get_current_texture` are no longer fatal. By @alokedesai in [#6253](https://github.com/gfx-rs/wgpu/pull/6253)
- Rename `BlasTriangleGeometry::index_buffer_offset` to `BlasTriangleGeometry::first_index`. By @Vecvec in [#6873](https://github.com/gfx-rs/wgpu/pull/6873/files)
##### D3D12

View File

@ -378,7 +378,7 @@ impl crate::framework::Example for Example {
first_vertex: 0,
vertex_stride: mem::size_of::<Vertex>() as u64,
index_buffer: Some(&index_buf),
index_buffer_offset: Some(0),
first_index: Some(0),
transform_buffer: None,
transform_buffer_offset: None,
},

View File

@ -248,7 +248,7 @@ impl crate::framework::Example for Example {
first_vertex: 0,
vertex_stride: mem::size_of::<Vertex>() as u64,
index_buffer: Some(&index_buf),
index_buffer_offset: Some(0),
first_index: Some(0),
transform_buffer: None,
transform_buffer_offset: None,
},

View File

@ -264,7 +264,7 @@ fn upload_scene_components(
first_vertex: vertex_range.start as u32,
vertex_stride: mem::size_of::<Vertex>() as u64,
index_buffer: Some(&indices),
index_buffer_offset: Some(scene.geometries[i].0.start as u64 * 4),
first_index: Some(scene.geometries[i].0.start as u32),
transform_buffer: None,
transform_buffer_offset: None,
})

View File

@ -258,7 +258,7 @@ impl crate::framework::Example for Example {
first_vertex: 0,
vertex_stride: mem::size_of::<Vertex>() as u64,
index_buffer: Some(&index_buf),
index_buffer_offset: Some(0),
first_index: Some(0),
transform_buffer: None,
transform_buffer_offset: None,
},

View File

@ -216,9 +216,9 @@ impl crate::framework::Example for Example {
vertex_buffer: &vertex_buffer,
first_vertex: 0,
vertex_stride: mem::size_of::<[f32; 3]>() as wgpu::BufferAddress,
// in this case since one triangle gets no compression from an index buffer `index_buffer` and `index_buffer_offset` could be `None`.
// in this case since one triangle gets no compression from an index buffer `index_buffer` and `first_index` could be `None`.
index_buffer: Some(&index_buffer),
index_buffer_offset: Some(0),
first_index: Some(0),
transform_buffer: None,
transform_buffer_offset: None,
}]),

View File

@ -133,7 +133,7 @@ impl GlobalPlay for wgc::global::Global {
transform_buffer: tg.transform_buffer,
first_vertex: tg.first_vertex,
vertex_stride: tg.vertex_stride,
index_buffer_offset: tg.index_buffer_offset,
first_index: tg.first_index,
transform_buffer_offset: tg.transform_buffer_offset,
}
});
@ -171,7 +171,7 @@ impl GlobalPlay for wgc::global::Global {
transform_buffer: tg.transform_buffer,
first_vertex: tg.first_vertex,
vertex_stride: tg.vertex_stride,
index_buffer_offset: tg.index_buffer_offset,
first_index: tg.first_index,
transform_buffer_offset: tg.transform_buffer_offset,
}
});

View File

@ -75,7 +75,7 @@ impl AsBuildContext {
first_vertex: 0,
vertex_stride: mem::size_of::<[f32; 3]>() as BufferAddress,
index_buffer: None,
index_buffer_offset: None,
first_index: None,
transform_buffer: None,
transform_buffer_offset: None,
}]),
@ -406,7 +406,7 @@ fn build_with_transform(ctx: TestingContext) {
first_vertex: 0,
vertex_stride: mem::size_of::<[f32; 3]>() as BufferAddress,
index_buffer: None,
index_buffer_offset: None,
first_index: None,
transform_buffer: Some(&transform),
transform_buffer_offset: Some(0),
}]),

View File

@ -78,7 +78,7 @@ fn acceleration_structure_use_after_free(ctx: TestingContext) {
first_vertex: 0,
vertex_stride: mem::size_of::<[f32; 3]>() as BufferAddress,
index_buffer: None,
index_buffer_offset: None,
first_index: None,
transform_buffer: None,
transform_buffer_offset: None,
}]),

View File

@ -85,7 +85,7 @@ fn acceleration_structure_build(ctx: &TestingContext, use_index_buffer: bool) {
first_vertex: 0,
vertex_stride: mem::size_of::<mesh_gen::Vertex>() as u64,
index_buffer: use_index_buffer.then_some(&index_buffer),
index_buffer_offset: use_index_buffer.then_some(0),
first_index: use_index_buffer.then_some(0),
transform_buffer: None,
transform_buffer_offset: None,
}]),

View File

@ -1174,10 +1174,7 @@ impl IndexState {
///
/// Panic if no index buffer has been set.
fn limit(&self) -> u64 {
let bytes_per_index = match self.format {
wgt::IndexFormat::Uint16 => 2,
wgt::IndexFormat::Uint32 => 4,
};
let bytes_per_index = self.format.byte_size() as u64;
(self.range.end - self.range.start) / bytes_per_index
}

View File

@ -104,7 +104,7 @@ impl Global {
transform_buffer: tg.transform_buffer,
first_vertex: tg.first_vertex,
vertex_stride: tg.vertex_stride,
index_buffer_offset: tg.index_buffer_offset,
first_index: tg.first_index,
transform_buffer_offset: tg.transform_buffer_offset,
})
.collect(),
@ -144,7 +144,7 @@ impl Global {
transform_buffer: tg.transform_buffer,
first_vertex: tg.first_vertex,
vertex_stride: tg.vertex_stride,
index_buffer_offset: tg.index_buffer_offset,
first_index: tg.first_index,
transform_buffer_offset: tg.transform_buffer_offset,
});
BlasGeometries::TriangleGeometries(Box::new(iter))
@ -375,7 +375,7 @@ impl Global {
transform_buffer: tg.transform_buffer,
first_vertex: tg.first_vertex,
vertex_stride: tg.vertex_stride,
index_buffer_offset: tg.index_buffer_offset,
first_index: tg.first_index,
transform_buffer_offset: tg.transform_buffer_offset,
})
.collect(),
@ -428,7 +428,7 @@ impl Global {
transform_buffer: tg.transform_buffer,
first_vertex: tg.first_vertex,
vertex_stride: tg.vertex_stride,
index_buffer_offset: tg.index_buffer_offset,
first_index: tg.first_index,
transform_buffer_offset: tg.transform_buffer_offset,
});
BlasGeometries::TriangleGeometries(Box::new(iter))
@ -906,7 +906,7 @@ fn iter_blas<'a>(
);
let index_data = if let Some(index_id) = mesh.index_buffer {
let index_buffer = hub.buffers.get(index_id).get()?;
if mesh.index_buffer_offset.is_none()
if mesh.first_index.is_none()
|| mesh.size.index_count.is_none()
|| mesh.size.index_count.is_none()
{
@ -1017,15 +1017,8 @@ fn iter_buffers<'a, 'b>(
{
input_barriers.push(barrier);
}
let index_stride = match mesh.size.index_format.unwrap() {
wgt::IndexFormat::Uint16 => 2,
wgt::IndexFormat::Uint32 => 4,
};
if mesh.index_buffer_offset.unwrap() % index_stride != 0 {
return Err(BuildAccelerationStructureError::UnalignedIndexBufferOffset(
index_buffer.error_ident(),
));
}
let index_stride = mesh.size.index_format.unwrap().byte_size() as u64;
let offset = mesh.first_index.unwrap() as u64 * index_stride;
let index_buffer_size = mesh.size.index_count.unwrap() as u64 * index_stride;
if mesh.size.index_count.unwrap() % 3 != 0 {
@ -1034,23 +1027,18 @@ fn iter_buffers<'a, 'b>(
mesh.size.index_count.unwrap(),
));
}
if index_buffer.size
< mesh.size.index_count.unwrap() as u64 * index_stride
+ mesh.index_buffer_offset.unwrap()
{
if index_buffer.size < mesh.size.index_count.unwrap() as u64 * index_stride + offset {
return Err(BuildAccelerationStructureError::InsufficientBufferSize(
index_buffer.error_ident(),
index_buffer.size,
mesh.size.index_count.unwrap() as u64 * index_stride
+ mesh.index_buffer_offset.unwrap(),
mesh.size.index_count.unwrap() as u64 * index_stride + offset,
));
}
cmd_buf_data.buffer_memory_init_actions.extend(
index_buffer.initialization_status.read().create_action(
index_buffer,
mesh.index_buffer_offset.unwrap()
..(mesh.index_buffer_offset.unwrap() + index_buffer_size),
offset..(offset + index_buffer_size),
MemoryInitKind::NeedsInitializedMemory,
),
);
@ -1110,13 +1098,14 @@ fn iter_buffers<'a, 'b>(
first_vertex: mesh.first_vertex,
vertex_count: mesh.size.vertex_count,
vertex_stride: mesh.vertex_stride,
indices: index_buffer.map(|index_buffer| hal::AccelerationStructureTriangleIndices::<
dyn hal::DynBuffer,
> {
format: mesh.size.index_format.unwrap(),
buffer: Some(index_buffer),
offset: mesh.index_buffer_offset.unwrap() as u32,
count: mesh.size.index_count.unwrap(),
indices: index_buffer.map(|index_buffer| {
let index_stride = mesh.size.index_format.unwrap().byte_size() as u32;
hal::AccelerationStructureTriangleIndices::<dyn hal::DynBuffer> {
format: mesh.size.index_format.unwrap(),
buffer: Some(index_buffer),
offset: mesh.first_index.unwrap() * index_stride,
count: mesh.size.index_count.unwrap(),
}
}),
transform: transform_buffer.map(|transform_buffer| {
hal::AccelerationStructureTriangleTransform {

View File

@ -150,7 +150,7 @@ pub struct BlasTriangleGeometry<'a> {
pub transform_buffer: Option<BufferId>,
pub first_vertex: u32,
pub vertex_stride: BufferAddress,
pub index_buffer_offset: Option<BufferAddress>,
pub first_index: Option<u32>,
pub transform_buffer_offset: Option<BufferAddress>,
}
@ -221,7 +221,7 @@ pub struct TraceBlasTriangleGeometry {
pub transform_buffer: Option<BufferId>,
pub first_vertex: u32,
pub vertex_stride: BufferAddress,
pub index_buffer_offset: Option<BufferAddress>,
pub first_index: Option<u32>,
pub transform_buffer_offset: Option<BufferAddress>,
}

View File

@ -5104,6 +5104,16 @@ pub enum IndexFormat {
Uint32 = 1,
}
impl IndexFormat {
/// Returns the size in bytes of the index format
pub fn byte_size(&self) -> usize {
match self {
IndexFormat::Uint16 => 2,
IndexFormat::Uint32 => 4,
}
}
}
/// Operation to perform on the stencil value.
///
/// Corresponds to [WebGPU `GPUStencilOperation`](

View File

@ -101,8 +101,8 @@ pub struct BlasTriangleGeometry<'a> {
pub vertex_stride: wgt::BufferAddress,
/// Index buffer (optional).
pub index_buffer: Option<&'a Buffer>,
/// Index buffer offset in bytes (optional, required if index buffer is present).
pub index_buffer_offset: Option<wgt::BufferAddress>,
/// Number of indexes to skip in the index buffer (optional, required if index buffer is present).
pub first_index: Option<u32>,
/// Transform buffer containing 3x4 (rows x columns, row major) affine transform matrices `[f32; 12]` (optional).
pub transform_buffer: Option<&'a Buffer>,
/// Transform buffer offset in bytes (optional, required if transform buffer is present).

View File

@ -2447,7 +2447,7 @@ impl dispatch::CommandEncoderInterface for CoreCommandEncoder {
transform_buffer_offset: tg.transform_buffer_offset,
first_vertex: tg.first_vertex,
vertex_stride: tg.vertex_stride,
index_buffer_offset: tg.index_buffer_offset,
first_index: tg.first_index,
}
});
wgc::ray_tracing::BlasGeometries::TriangleGeometries(Box::new(iter))
@ -2497,7 +2497,7 @@ impl dispatch::CommandEncoderInterface for CoreCommandEncoder {
transform_buffer_offset: tg.transform_buffer_offset,
first_vertex: tg.first_vertex,
vertex_stride: tg.vertex_stride,
index_buffer_offset: tg.index_buffer_offset,
first_index: tg.first_index,
}
});
wgc::ray_tracing::BlasGeometries::TriangleGeometries(Box::new(iter))