Skip to content

Commit 38b3de7

Browse files
committed
Bug reproducer
1 parent d5797e8 commit 38b3de7

File tree

1 file changed

+74
-20
lines changed
  • examples/features/src/ray_cube_fragment

1 file changed

+74
-20
lines changed

examples/features/src/ray_cube_fragment/mod.rs

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,14 @@ fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
6262
20, 21, 22, 22, 23, 20, // back
6363
];
6464

65-
(vertex_data.to_vec(), index_data.to_vec())
65+
(
66+
vertex_data.to_vec(),
67+
std::iter::repeat(index_data)
68+
.flatten()
69+
.take(153 * 3)
70+
.cloned()
71+
.collect(),
72+
)
6673
}
6774

6875
#[repr(C)]
@@ -98,6 +105,7 @@ struct Example {
98105
uniforms: Uniforms,
99106
uniform_buf: wgpu::Buffer,
100107
blas: wgpu::Blas,
108+
blas_with_one_too_much_triangles: wgpu::Blas,
101109
tlas_package: wgpu::TlasPackage,
102110
pipeline: wgpu::RenderPipeline,
103111
bind_group: wgpu::BindGroup,
@@ -164,11 +172,11 @@ impl crate::framework::Example for Example {
164172
usage: wgpu::BufferUsages::INDEX | wgpu::BufferUsages::BLAS_INPUT,
165173
});
166174

167-
let blas_geo_size_desc = wgpu::BlasTriangleGeometrySizeDescriptor {
175+
let mut blas_geo_size_desc = wgpu::BlasTriangleGeometrySizeDescriptor {
168176
vertex_format: wgpu::VertexFormat::Float32x3,
169177
vertex_count: vertex_data.len() as u32,
170178
index_format: Some(wgpu::IndexFormat::Uint16),
171-
index_count: Some(index_data.len() as u32),
179+
index_count: Some(index_data.len() as u32 - 3),
172180
flags: wgpu::AccelerationStructureGeometryFlags::OPAQUE,
173181
};
174182

@@ -183,6 +191,25 @@ impl crate::framework::Example for Example {
183191
},
184192
);
185193

194+
let mut blas_geo_size_desc_2 = wgpu::BlasTriangleGeometrySizeDescriptor {
195+
vertex_format: wgpu::VertexFormat::Float32x3,
196+
vertex_count: vertex_data.len() as u32,
197+
index_format: Some(wgpu::IndexFormat::Uint16),
198+
index_count: Some(index_data.len() as u32),
199+
flags: wgpu::AccelerationStructureGeometryFlags::OPAQUE,
200+
};
201+
202+
let blas_with_one_too_much_triangles = device.create_blas(
203+
&wgpu::CreateBlasDescriptor {
204+
label: None,
205+
flags: wgpu::AccelerationStructureFlags::PREFER_FAST_TRACE,
206+
update_mode: wgpu::AccelerationStructureUpdateMode::Build,
207+
},
208+
wgpu::BlasGeometrySizeDescriptors::Triangles {
209+
descriptors: vec![blas_geo_size_desc_2.clone()],
210+
},
211+
);
212+
186213
let tlas = device.create_tlas(&wgpu::CreateTlasDescriptor {
187214
label: None,
188215
flags: wgpu::AccelerationStructureFlags::PREFER_FAST_TRACE,
@@ -243,22 +270,38 @@ impl crate::framework::Example for Example {
243270
device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
244271

245272
encoder.build_acceleration_structures(
246-
iter::once(&wgpu::BlasBuildEntry {
247-
blas: &blas,
248-
geometry: wgpu::BlasGeometries::TriangleGeometries(vec![
249-
wgpu::BlasTriangleGeometry {
250-
size: &blas_geo_size_desc,
251-
vertex_buffer: &vertex_buf,
252-
first_vertex: 0,
253-
vertex_stride: mem::size_of::<Vertex>() as u64,
254-
index_buffer: Some(&index_buf),
255-
first_index: Some(0),
256-
transform_buffer: None,
257-
transform_buffer_offset: None,
258-
},
259-
]),
260-
}),
261-
// iter::empty(),
273+
vec![
274+
&wgpu::BlasBuildEntry {
275+
blas: &blas,
276+
geometry: wgpu::BlasGeometries::TriangleGeometries(vec![
277+
wgpu::BlasTriangleGeometry {
278+
size: &blas_geo_size_desc,
279+
vertex_buffer: &vertex_buf,
280+
first_vertex: 0,
281+
vertex_stride: mem::size_of::<Vertex>() as u64,
282+
index_buffer: Some(&index_buf),
283+
first_index: Some(0),
284+
transform_buffer: None,
285+
transform_buffer_offset: None,
286+
},
287+
]),
288+
},
289+
&wgpu::BlasBuildEntry {
290+
blas: &blas_with_one_too_much_triangles,
291+
geometry: wgpu::BlasGeometries::TriangleGeometries(vec![
292+
wgpu::BlasTriangleGeometry {
293+
size: &blas_geo_size_desc_2,
294+
vertex_buffer: &vertex_buf,
295+
first_vertex: 0,
296+
vertex_stride: mem::size_of::<Vertex>() as u64,
297+
index_buffer: Some(&index_buf),
298+
first_index: Some(0),
299+
transform_buffer: None,
300+
transform_buffer_offset: None,
301+
},
302+
]),
303+
},
304+
],
262305
iter::once(&tlas_package),
263306
);
264307

@@ -270,6 +313,7 @@ impl crate::framework::Example for Example {
270313
uniforms,
271314
uniform_buf,
272315
blas,
316+
blas_with_one_too_much_triangles,
273317
tlas_package,
274318
pipeline,
275319
bind_group,
@@ -311,6 +355,7 @@ impl crate::framework::Example for Example {
311355
for x in 0..side_count {
312356
for y in 0..side_count {
313357
let instance = self.tlas_package.index_mut((x + y * side_count) as usize);
358+
let checker = (x ^ y) & 1 == 0;
314359

315360
let x = x as f32 / (side_count - 1) as f32;
316361
let y = y as f32 / (side_count - 1) as f32;
@@ -334,7 +379,16 @@ impl crate::framework::Example for Example {
334379
.try_into()
335380
.unwrap();
336381

337-
*instance = Some(wgpu::TlasInstance::new(&self.blas, transform, 0, 0xff));
382+
*instance = Some(wgpu::TlasInstance::new(
383+
if checker {
384+
&self.blas
385+
} else {
386+
&self.blas_with_one_too_much_triangles
387+
},
388+
transform,
389+
0,
390+
0xff,
391+
));
338392
}
339393
}
340394
}

0 commit comments

Comments
 (0)