@@ -114,6 +114,8 @@ D3D12_DEPTH_STENCILOP_DESC D3DUtil::translateStencilOpDesc(DepthStencilOpDesc de
114
114
case Format::R_Float32: return DXGI_FORMAT_R32_FLOAT;
115
115
case Format::RGBA_Unorm_UInt8: return DXGI_FORMAT_R8G8B8A8_UNORM;
116
116
case Format::BGRA_Unorm_UInt8: return DXGI_FORMAT_B8G8R8A8_UNORM;
117
+ case Format::RGBA_Snorm_UInt16: return DXGI_FORMAT_R16G16B16A16_SNORM;
118
+ case Format::RG_Snorm_UInt16: return DXGI_FORMAT_R16G16_SNORM;
117
119
118
120
case Format::RGBA_Float16: return DXGI_FORMAT_R16G16B16A16_FLOAT;
119
121
case Format::RG_Float16: return DXGI_FORMAT_R16G16_FLOAT;
@@ -133,29 +135,33 @@ D3D12_RESOURCE_STATES D3DUtil::translateResourceState(ResourceState state)
133
135
{
134
136
switch (state)
135
137
{
136
- case gfx:: ResourceState::Undefined:
138
+ case ResourceState::Undefined:
137
139
return D3D12_RESOURCE_STATE_COMMON;
138
- case gfx:: ResourceState::ShaderResource:
140
+ case ResourceState::ShaderResource:
139
141
return D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE |
140
142
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
141
- case gfx:: ResourceState::UnorderedAccess:
143
+ case ResourceState::UnorderedAccess:
142
144
return D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
143
- case gfx:: ResourceState::RenderTarget:
145
+ case ResourceState::RenderTarget:
144
146
return D3D12_RESOURCE_STATE_RENDER_TARGET;
145
- case gfx:: ResourceState::DepthRead:
147
+ case ResourceState::DepthRead:
146
148
return D3D12_RESOURCE_STATE_DEPTH_READ;
147
- case gfx:: ResourceState::DepthWrite:
149
+ case ResourceState::DepthWrite:
148
150
return D3D12_RESOURCE_STATE_DEPTH_WRITE;
149
- case gfx:: ResourceState::Present:
151
+ case ResourceState::Present:
150
152
return D3D12_RESOURCE_STATE_PRESENT;
151
- case gfx:: ResourceState::CopySource:
153
+ case ResourceState::CopySource:
152
154
return D3D12_RESOURCE_STATE_COPY_SOURCE;
153
- case gfx:: ResourceState::CopyDestination:
155
+ case ResourceState::CopyDestination:
154
156
return D3D12_RESOURCE_STATE_COPY_DEST;
155
- case gfx:: ResourceState::ResolveSource:
157
+ case ResourceState::ResolveSource:
156
158
return D3D12_RESOURCE_STATE_RESOLVE_SOURCE;
157
- case gfx:: ResourceState::ResolveDestination:
159
+ case ResourceState::ResolveDestination:
158
160
return D3D12_RESOURCE_STATE_RESOLVE_DEST;
161
+ #if SLANG_GFX_HAS_DXR_SUPPORT
162
+ case ResourceState::AccelerationStructure:
163
+ return D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE;
164
+ #endif
159
165
default :
160
166
return D3D12_RESOURCE_STATE_COMMON;
161
167
}
@@ -583,4 +589,67 @@ bool D3DUtil::isUAVBinding(slang::BindingType bindingType)
583
589
return SLANG_OK;
584
590
}
585
591
586
- } // renderer_test
592
+ #if SLANG_GFX_HAS_DXR_SUPPORT
593
+ Result D3DAccelerationStructureInputsBuilder::build (
594
+ const IAccelerationStructure::BuildInputs& buildInputs,
595
+ IDebugCallback* callback)
596
+ {
597
+ if (buildInputs.geometryDescs )
598
+ {
599
+ geomDescs.setCount (buildInputs.descCount );
600
+ for (Index i = 0 ; i < geomDescs.getCount (); i++)
601
+ {
602
+ auto & inputGeomDesc = buildInputs.geometryDescs [i];
603
+ geomDescs[i].Flags = translateGeometryFlags (inputGeomDesc.flags );
604
+ switch (inputGeomDesc.type )
605
+ {
606
+ case IAccelerationStructure::GeometryType::Triangles:
607
+ geomDescs[i].Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
608
+ geomDescs[i].Triangles .IndexBuffer = inputGeomDesc.content .triangles .indexData ;
609
+ geomDescs[i].Triangles .IndexCount = inputGeomDesc.content .triangles .indexCount ;
610
+ geomDescs[i].Triangles .IndexFormat =
611
+ D3DUtil::getMapFormat (inputGeomDesc.content .triangles .indexFormat );
612
+ geomDescs[i].Triangles .Transform3x4 = inputGeomDesc.content .triangles .transform3x4 ;
613
+ geomDescs[i].Triangles .VertexBuffer .StartAddress =
614
+ inputGeomDesc.content .triangles .vertexData ;
615
+ geomDescs[i].Triangles .VertexBuffer .StrideInBytes =
616
+ inputGeomDesc.content .triangles .vertexStride ;
617
+ geomDescs[i].Triangles .VertexCount = inputGeomDesc.content .triangles .vertexCount ;
618
+ geomDescs[i].Triangles .VertexFormat =
619
+ D3DUtil::getMapFormat (inputGeomDesc.content .triangles .vertexFormat );
620
+ break ;
621
+ case IAccelerationStructure::GeometryType::ProcedurePrimitives:
622
+ geomDescs[i].Type = D3D12_RAYTRACING_GEOMETRY_TYPE_PROCEDURAL_PRIMITIVE_AABBS;
623
+ geomDescs[i].AABBs .AABBCount = inputGeomDesc.content .proceduralAABBs .count ;
624
+ geomDescs[i].AABBs .AABBs .StartAddress = inputGeomDesc.content .proceduralAABBs .data ;
625
+ geomDescs[i].AABBs .AABBs .StrideInBytes =
626
+ inputGeomDesc.content .proceduralAABBs .stride ;
627
+ break ;
628
+ default :
629
+ callback->handleMessage (
630
+ DebugMessageType::Error,
631
+ DebugMessageSource::Layer,
632
+ " invalid value of IAccelerationStructure::GeometryType." );
633
+ return SLANG_E_INVALID_ARG;
634
+ }
635
+ }
636
+ }
637
+ desc.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
638
+ desc.NumDescs = buildInputs.descCount ;
639
+ switch (buildInputs.kind )
640
+ {
641
+ case IAccelerationStructure::Kind::TopLevel:
642
+ desc.Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL;
643
+ desc.InstanceDescs = buildInputs.instanceDescs ;
644
+ break ;
645
+ case IAccelerationStructure::Kind::BottomLevel:
646
+ desc.Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
647
+ desc.pGeometryDescs = geomDescs.getBuffer ();
648
+ break ;
649
+ }
650
+ desc.Flags = (D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS)buildInputs.flags ;
651
+ return SLANG_OK;
652
+ }
653
+ #endif
654
+
655
+ } // namespace gfx
0 commit comments