Skip to content

Commit 6580528

Browse files
authored
Use transform_buffer_offset when initialising transform_buffer. (#6864)
* use `transform_buffer_offset` instead of `index_buffer_offset` in part of the initialisation of transform_buffer. * Format. * Changelog. * Only unwrap transform alignment once.
1 parent 0dab31a commit 6580528

File tree

3 files changed

+95
-4
lines changed

3 files changed

+95
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ By @wumpf in [#6849](https://github.com/gfx-rs/wgpu/pull/6849).
213213
- Reduced the overhead of command buffer validation. By @nical in [#6721](https://github.com/gfx-rs/wgpu/pull/6721).
214214
- Set index type to NONE in `get_acceleration_structure_build_sizes`. By @Vecvec in [#6802](https://github.com/gfx-rs/wgpu/pull/6802).
215215
- Fix `wgpu-info` not showing dx12 adapters. By @wumpf in [#6844](https://github.com/gfx-rs/wgpu/pull/6844).
216+
- Use `transform_buffer_offset` when initialising `transform_buffer`. By @Vecvec in [#6864](https://github.com/gfx-rs/wgpu/pull/6864).
216217

217218
#### Naga
218219

tests/tests/ray_tracing/as_build.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,90 @@ fn empty_build(ctx: TestingContext) {
328328
ctx.queue
329329
.submit([encoder_safe.finish(), encoder_unsafe.finish()]);
330330
}
331+
332+
#[gpu_test]
333+
static BUILD_WITH_TRANSFORM: GpuTestConfiguration = GpuTestConfiguration::new()
334+
.parameters(
335+
TestParameters::default()
336+
.test_features_limits()
337+
.features(wgpu::Features::EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE)
338+
// https://github.com/gfx-rs/wgpu/issues/6727
339+
.skip(FailureCase::backend_adapter(wgpu::Backends::VULKAN, "AMD")),
340+
)
341+
.run_sync(build_with_transform);
342+
343+
fn build_with_transform(ctx: TestingContext) {
344+
let vertices = ctx.device.create_buffer_init(&BufferInitDescriptor {
345+
label: None,
346+
contents: &[0; mem::size_of::<[[f32; 3]; 3]>()],
347+
usage: BufferUsages::BLAS_INPUT,
348+
});
349+
350+
let transform = ctx
351+
.device
352+
.create_buffer_init(&wgpu::util::BufferInitDescriptor {
353+
label: Some("Vertex Buffer"),
354+
contents: bytemuck::cast_slice(&[
355+
1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,
356+
]),
357+
usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::BLAS_INPUT,
358+
});
359+
360+
let blas_size = BlasTriangleGeometrySizeDescriptor {
361+
vertex_format: VertexFormat::Float32x3,
362+
vertex_count: 3,
363+
index_format: None,
364+
index_count: None,
365+
flags: AccelerationStructureGeometryFlags::empty(),
366+
};
367+
368+
let blas = ctx.device.create_blas(
369+
&CreateBlasDescriptor {
370+
label: Some("BLAS"),
371+
flags: AccelerationStructureFlags::PREFER_FAST_TRACE,
372+
update_mode: AccelerationStructureUpdateMode::Build,
373+
},
374+
BlasGeometrySizeDescriptors::Triangles {
375+
descriptors: vec![blas_size.clone()],
376+
},
377+
);
378+
379+
let tlas = ctx.device.create_tlas(&CreateTlasDescriptor {
380+
label: Some("TLAS"),
381+
max_instances: 1,
382+
flags: AccelerationStructureFlags::PREFER_FAST_TRACE,
383+
update_mode: AccelerationStructureUpdateMode::Build,
384+
});
385+
386+
let mut tlas_package = TlasPackage::new(tlas);
387+
tlas_package[0] = Some(TlasInstance::new(
388+
&blas,
389+
[1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
390+
0,
391+
0xFF,
392+
));
393+
394+
let mut encoder_build = ctx
395+
.device
396+
.create_command_encoder(&CommandEncoderDescriptor {
397+
label: Some("BUILD 1"),
398+
});
399+
400+
encoder_build.build_acceleration_structures(
401+
[&BlasBuildEntry {
402+
blas: &blas,
403+
geometry: BlasGeometries::TriangleGeometries(vec![BlasTriangleGeometry {
404+
size: &blas_size,
405+
vertex_buffer: &vertices,
406+
first_vertex: 0,
407+
vertex_stride: mem::size_of::<[f32; 3]>() as BufferAddress,
408+
index_buffer: None,
409+
index_buffer_offset: None,
410+
transform_buffer: Some(&transform),
411+
transform_buffer_offset: Some(0),
412+
}]),
413+
}],
414+
[&tlas_package],
415+
);
416+
ctx.queue.submit([encoder_build.finish()]);
417+
}

wgpu-core/src/command/ray_tracing.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,24 +1169,27 @@ fn iter_buffers<'a, 'b>(
11691169
{
11701170
input_barriers.push(barrier);
11711171
}
1172-
if mesh.transform_buffer_offset.unwrap() % wgt::TRANSFORM_BUFFER_ALIGNMENT != 0 {
1172+
1173+
let offset = mesh.transform_buffer_offset.unwrap();
1174+
1175+
if offset % wgt::TRANSFORM_BUFFER_ALIGNMENT != 0 {
11731176
return Err(
11741177
BuildAccelerationStructureError::UnalignedTransformBufferOffset(
11751178
transform_buffer.error_ident(),
11761179
),
11771180
);
11781181
}
1179-
if transform_buffer.size < 48 + mesh.transform_buffer_offset.unwrap() {
1182+
if transform_buffer.size < 48 + offset {
11801183
return Err(BuildAccelerationStructureError::InsufficientBufferSize(
11811184
transform_buffer.error_ident(),
11821185
transform_buffer.size,
1183-
48 + mesh.transform_buffer_offset.unwrap(),
1186+
48 + offset,
11841187
));
11851188
}
11861189
cmd_buf_data.buffer_memory_init_actions.extend(
11871190
transform_buffer.initialization_status.read().create_action(
11881191
transform_buffer,
1189-
mesh.transform_buffer_offset.unwrap()..(mesh.index_buffer_offset.unwrap() + 48),
1192+
offset..(offset + 48),
11901193
MemoryInitKind::NeedsInitializedMemory,
11911194
),
11921195
);

0 commit comments

Comments
 (0)