mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-12-08 21:26:17 +00:00
[Ray-tracing] Change index offset to first index (#6873)
Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
This commit is contained in:
parent
bd3e7b676e
commit
0b2c9e4f4b
@ -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
|
||||
|
||||
|
||||
@ -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,
|
||||
},
|
||||
|
||||
@ -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,
|
||||
},
|
||||
|
||||
@ -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,
|
||||
})
|
||||
|
||||
@ -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,
|
||||
},
|
||||
|
||||
@ -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,
|
||||
}]),
|
||||
|
||||
@ -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,
|
||||
}
|
||||
});
|
||||
|
||||
@ -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),
|
||||
}]),
|
||||
|
||||
@ -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,
|
||||
}]),
|
||||
|
||||
@ -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,
|
||||
}]),
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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>,
|
||||
}
|
||||
|
||||
|
||||
@ -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`](
|
||||
|
||||
@ -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).
|
||||
|
||||
@ -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))
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user