tests: Make raytracing test robust against stubbed implementation.

Don't crash if some things are not implemented fully.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-01-26 15:50:01 +01:00
parent 51bf939743
commit 547867d505
1 changed files with 48 additions and 24 deletions

View File

@ -41773,6 +41773,9 @@ static void test_raytracing(void)
geom_desc[1].Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT; geom_desc[1].Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT;
geom_desc[1].Triangles.VertexCount = 6; geom_desc[1].Triangles.VertexCount = 6;
/* Guard against stubbed variant. */
prebuild_info.ScratchDataSizeInBytes = 16;
prebuild_info.ResultDataMaxSizeInBytes = 16;
ID3D12Device5_GetRaytracingAccelerationStructurePrebuildInfo(device5, &inputs, &prebuild_info); ID3D12Device5_GetRaytracingAccelerationStructurePrebuildInfo(device5, &inputs, &prebuild_info);
/* An AS in D3D12 is just a plain UAV-enabled buffer. */ /* An AS in D3D12 is just a plain UAV-enabled buffer. */
@ -41781,20 +41784,24 @@ static void test_raytracing(void)
bottom_acceleration_structure = create_default_buffer(context.device, prebuild_info.ResultDataMaxSizeInBytes, bottom_acceleration_structure = create_default_buffer(context.device, prebuild_info.ResultDataMaxSizeInBytes,
D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE); D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE);
memset(&build_info, 0, sizeof(build_info)); if (scratch_buffer_bottom && bottom_acceleration_structure)
build_info.DestAccelerationStructureData = ID3D12Resource_GetGPUVirtualAddress(bottom_acceleration_structure); {
build_info.Inputs = inputs; memset(&build_info, 0, sizeof(build_info));
build_info.ScratchAccelerationStructureData = ID3D12Resource_GetGPUVirtualAddress(scratch_buffer_bottom); build_info.DestAccelerationStructureData = ID3D12Resource_GetGPUVirtualAddress(bottom_acceleration_structure);
ID3D12GraphicsCommandList4_BuildRaytracingAccelerationStructure(command_list4, &build_info, 0, NULL); build_info.Inputs = inputs;
build_info.ScratchAccelerationStructureData = ID3D12Resource_GetGPUVirtualAddress(scratch_buffer_bottom);
ID3D12GraphicsCommandList4_BuildRaytracingAccelerationStructure(command_list4, &build_info, 0, NULL);
/* An UAV barrier serves as a raytracing barrier as well ... */ /* An UAV barrier serves as a raytracing barrier as well ... */
resource_barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV; resource_barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
resource_barrier.Flags = 0; resource_barrier.Flags = 0;
resource_barrier.UAV.pResource = bottom_acceleration_structure; resource_barrier.UAV.pResource = bottom_acceleration_structure;
ID3D12GraphicsCommandList_ResourceBarrier(command_list, 1, &resource_barrier); ID3D12GraphicsCommandList_ResourceBarrier(command_list, 1, &resource_barrier);
}
} }
/* Create instance buffer. One for every top-level entry into the AS. */ /* Create instance buffer. One for every top-level entry into the AS. */
if (bottom_acceleration_structure)
{ {
D3D12_RAYTRACING_INSTANCE_DESC instance_desc[3]; D3D12_RAYTRACING_INSTANCE_DESC instance_desc[3];
memset(instance_desc, 0, sizeof(instance_desc)); memset(instance_desc, 0, sizeof(instance_desc));
@ -41824,8 +41831,11 @@ static void test_raytracing(void)
instance_buffer = create_upload_buffer(context.device, sizeof(instance_desc), instance_desc); instance_buffer = create_upload_buffer(context.device, sizeof(instance_desc), instance_desc);
} }
else
instance_buffer = NULL;
/* Create top AS */ /* Create top AS */
if (bottom_acceleration_structure)
{ {
memset(&inputs, 0, sizeof(inputs)); memset(&inputs, 0, sizeof(inputs));
memset(geom_desc, 0, sizeof(geom_desc)); memset(geom_desc, 0, sizeof(geom_desc));
@ -41843,16 +41853,24 @@ static void test_raytracing(void)
top_acceleration_structure = create_default_buffer(context.device, prebuild_info.ResultDataMaxSizeInBytes, top_acceleration_structure = create_default_buffer(context.device, prebuild_info.ResultDataMaxSizeInBytes,
D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE); D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE);
memset(&build_info, 0, sizeof(build_info)); if (scratch_buffer_top && top_acceleration_structure)
build_info.DestAccelerationStructureData = ID3D12Resource_GetGPUVirtualAddress(top_acceleration_structure); {
build_info.Inputs = inputs; memset(&build_info, 0, sizeof(build_info));
build_info.ScratchAccelerationStructureData = ID3D12Resource_GetGPUVirtualAddress(scratch_buffer_top); build_info.DestAccelerationStructureData = ID3D12Resource_GetGPUVirtualAddress(top_acceleration_structure);
ID3D12GraphicsCommandList4_BuildRaytracingAccelerationStructure(command_list4, &build_info, 0, NULL); build_info.Inputs = inputs;
build_info.ScratchAccelerationStructureData = ID3D12Resource_GetGPUVirtualAddress(scratch_buffer_top);
ID3D12GraphicsCommandList4_BuildRaytracingAccelerationStructure(command_list4, &build_info, 0, NULL);
resource_barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV; resource_barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
resource_barrier.Flags = 0; resource_barrier.Flags = 0;
resource_barrier.UAV.pResource = top_acceleration_structure; resource_barrier.UAV.pResource = top_acceleration_structure;
ID3D12GraphicsCommandList_ResourceBarrier(command_list, 1, &resource_barrier); ID3D12GraphicsCommandList_ResourceBarrier(command_list, 1, &resource_barrier);
}
}
else
{
scratch_buffer_top = NULL;
top_acceleration_structure = NULL;
} }
/* Create global root signature. All RT shaders can access these parameters. */ /* Create global root signature. All RT shaders can access these parameters. */
@ -42228,6 +42246,7 @@ static void test_raytracing(void)
cpu_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(descriptor_heap); cpu_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(descriptor_heap);
gpu_handle = ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap); gpu_handle = ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap);
if (top_acceleration_structure)
{ {
D3D12_SHADER_RESOURCE_VIEW_DESC as_desc; D3D12_SHADER_RESOURCE_VIEW_DESC as_desc;
memset(&as_desc, 0, sizeof(as_desc)); memset(&as_desc, 0, sizeof(as_desc));
@ -42301,14 +42320,19 @@ static void test_raytracing(void)
ID3D12Device5_Release(device5); ID3D12Device5_Release(device5);
ID3D12GraphicsCommandList4_Release(command_list4); ID3D12GraphicsCommandList4_Release(command_list4);
ID3D12Resource_Release(vbo); ID3D12Resource_Release(vbo);
ID3D12Resource_Release(instance_buffer); if (instance_buffer)
ID3D12Resource_Release(instance_buffer);
ID3D12Resource_Release(transform_buffer); ID3D12Resource_Release(transform_buffer);
ID3D12RootSignature_Release(global_rs); ID3D12RootSignature_Release(global_rs);
ID3D12RootSignature_Release(local_rs); ID3D12RootSignature_Release(local_rs);
ID3D12Resource_Release(top_acceleration_structure); if (top_acceleration_structure)
ID3D12Resource_Release(bottom_acceleration_structure); ID3D12Resource_Release(top_acceleration_structure);
ID3D12Resource_Release(scratch_buffer_top); if (bottom_acceleration_structure)
ID3D12Resource_Release(scratch_buffer_bottom); ID3D12Resource_Release(bottom_acceleration_structure);
if (scratch_buffer_top)
ID3D12Resource_Release(scratch_buffer_top);
if (scratch_buffer_bottom)
ID3D12Resource_Release(scratch_buffer_bottom);
ID3D12StateObject_Release(rt_pso); ID3D12StateObject_Release(rt_pso);
ID3D12Resource_Release(ray_colors); ID3D12Resource_Release(ray_colors);
ID3D12Resource_Release(ray_positions); ID3D12Resource_Release(ray_positions);