1414#define OFFLOADTEST_SUPPORT_PIPELINE_H
1515
1616#include " API/Enums.h"
17+ #include " API/Resources.h"
1718#include " llvm/ADT/SmallVector.h"
1819#include " llvm/ADT/StringRef.h"
1920#include " llvm/Support/Error.h"
@@ -77,6 +78,7 @@ static inline DescriptorKind getDescriptorKind(ResourceKind RK) {
7778 case ResourceKind::StructuredBuffer:
7879 case ResourceKind::ByteAddressBuffer:
7980 case ResourceKind::Texture2D:
81+ case ResourceKind::AccelerationStructure:
8082 return DescriptorKind::SRV ;
8183
8284 case ResourceKind::RWStructuredBuffer:
@@ -218,6 +220,8 @@ struct Result {
218220 double Epsilon;
219221};
220222
223+ struct TLASDesc ;
224+
221225struct Resource {
222226 ResourceKind Kind;
223227 std::string Name;
@@ -228,6 +232,11 @@ struct Resource {
228232 bool HasCounter;
229233 std::optional<uint32_t > TilesMapped;
230234 bool IsReserved = false ;
235+ TLASDesc *TLASPtr = nullptr ;
236+
237+ bool isAccelerationStructure () const {
238+ return Kind == ResourceKind::AccelerationStructure;
239+ }
231240
232241 bool isRaw () const {
233242 switch (Kind) {
@@ -237,6 +246,7 @@ struct Resource {
237246 case ResourceKind::RWTexture2D:
238247 case ResourceKind::Sampler:
239248 case ResourceKind::SampledTexture2D:
249+ case ResourceKind::AccelerationStructure:
240250 return false ;
241251 case ResourceKind::StructuredBuffer:
242252 case ResourceKind::RWStructuredBuffer:
@@ -262,6 +272,7 @@ struct Resource {
262272 case ResourceKind::Texture2D:
263273 case ResourceKind::RWTexture2D:
264274 case ResourceKind::SampledTexture2D:
275+ case ResourceKind::AccelerationStructure:
265276 return false ;
266277 }
267278 llvm_unreachable (" All cases handled" );
@@ -277,6 +288,7 @@ struct Resource {
277288 case ResourceKind::RWByteAddressBuffer:
278289 case ResourceKind::ConstantBuffer:
279290 case ResourceKind::Sampler:
291+ case ResourceKind::AccelerationStructure:
280292 return false ;
281293 case ResourceKind::Texture2D:
282294 case ResourceKind::RWTexture2D:
@@ -316,18 +328,22 @@ struct Resource {
316328 }
317329
318330 uint32_t getElementSize () const {
319- assert (!isSampler () && " Samplers do not have element size" );
331+ assert (!isSampler () && !isAccelerationStructure () &&
332+ " Samplers and AS do not have element size" );
320333 // ByteAddressBuffers are treated as 4-byte elements to match their memory
321334 // format.
322335 return isByteAddressBuffer () ? 4 : BufferPtr->getElementSize ();
323336 }
324337
325338 uint32_t getArraySize () const {
326- return isSampler () ? 1 : BufferPtr->ArraySize ;
339+ if (isSampler () || isAccelerationStructure ())
340+ return 1 ;
341+ return BufferPtr->ArraySize ;
327342 }
328343
329344 uint32_t size () const {
330- assert (!isSampler () && " Samplers do not have size" );
345+ assert (!isSampler () && !isAccelerationStructure () &&
346+ " Samplers and AS do not have size" );
331347 return BufferPtr->size ();
332348 }
333349
@@ -340,6 +356,7 @@ struct Resource {
340356 case ResourceKind::ConstantBuffer:
341357 case ResourceKind::Sampler:
342358 case ResourceKind::SampledTexture2D:
359+ case ResourceKind::AccelerationStructure:
343360 return false ;
344361 case ResourceKind::RWBuffer:
345362 case ResourceKind::RWStructuredBuffer:
@@ -456,6 +473,53 @@ struct DispatchParametersSet {
456473 std::optional<uint32_t > VertexCount;
457474};
458475
476+ enum class IndexFormat { Uint16, Uint32 };
477+
478+ struct TriangleGeometry {
479+ std::string VertexBuffer;
480+ CPUBuffer *VertexBufferPtr = nullptr ;
481+ Format VertexFormat = Format::RGB32Float;
482+ uint32_t VertexStride = 12 ;
483+ uint32_t VertexCount = 0 ;
484+ std::string IndexBuffer;
485+ CPUBuffer *IndexBufferPtr = nullptr ;
486+ IndexFormat IdxFormat = IndexFormat::Uint32;
487+ uint32_t IndexCount = 0 ;
488+ bool Opaque = true ;
489+ };
490+
491+ struct AABBGeometry {
492+ std::string AABBBuffer;
493+ CPUBuffer *AABBBufferPtr = nullptr ;
494+ uint32_t AABBCount = 0 ;
495+ uint32_t AABBStride = 24 ;
496+ bool Opaque = true ;
497+ };
498+
499+ struct BLASDesc {
500+ std::string Name;
501+ llvm::SmallVector<TriangleGeometry> Triangles;
502+ llvm::SmallVector<AABBGeometry> AABBs;
503+ };
504+
505+ struct InstanceDesc {
506+ std::string BLAS ;
507+ int BLASIdx = -1 ;
508+ float Transform[12 ] = {1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 };
509+ uint32_t InstanceID = 0 ;
510+ uint8_t InstanceMask = 0xFF ;
511+ };
512+
513+ struct TLASDesc {
514+ std::string Name;
515+ llvm::SmallVector<InstanceDesc> Instances;
516+ };
517+
518+ struct AccelerationStructureDescs {
519+ llvm::SmallVector<BLASDesc> BLAS ;
520+ llvm::SmallVector<TLASDesc> TLAS ;
521+ };
522+
459523struct Pipeline {
460524 ShaderPipelineKind Kind;
461525 llvm::SmallVector<Shader> Shaders;
@@ -468,6 +532,7 @@ struct Pipeline {
468532 llvm::SmallVector<Result> Results;
469533 llvm::SmallVector<DescriptorSet> Sets;
470534 DispatchParametersSet DispatchParameters;
535+ AccelerationStructureDescs AccelStructs;
471536
472537 uint32_t getVertexCount () const {
473538 if (DispatchParameters.VertexCount )
@@ -508,6 +573,20 @@ struct Pipeline {
508573 return nullptr ;
509574 }
510575
576+ BLASDesc *getBLAS (llvm::StringRef Name) {
577+ for (auto &B : AccelStructs.BLAS )
578+ if (Name == B.Name )
579+ return &B;
580+ return nullptr ;
581+ }
582+
583+ TLASDesc *getTLAS (llvm::StringRef Name) {
584+ for (auto &T : AccelStructs.TLAS )
585+ if (Name == T.Name )
586+ return &T;
587+ return nullptr ;
588+ }
589+
511590 llvm::Error validatePipelineKind ();
512591 llvm::Error validateDispatchParameters ();
513592
@@ -536,6 +615,11 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::SpecializationConstant)
536615LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::PushConstantBlock)
537616LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::PushConstantValue)
538617LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::DispatchParametersSet)
618+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::TriangleGeometry)
619+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::AABBGeometry)
620+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::BLASDesc)
621+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::InstanceDesc)
622+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::TLASDesc)
539623
540624namespace llvm {
541625namespace yaml {
@@ -620,6 +704,30 @@ template <> struct MappingTraits<offloadtest::SpecializationConstant> {
620704 static void mapping (IO &I, offloadtest::SpecializationConstant &C);
621705};
622706
707+ template <> struct MappingTraits <offloadtest::TriangleGeometry> {
708+ static void mapping (IO &I, offloadtest::TriangleGeometry &G);
709+ };
710+
711+ template <> struct MappingTraits <offloadtest::AABBGeometry> {
712+ static void mapping (IO &I, offloadtest::AABBGeometry &G);
713+ };
714+
715+ template <> struct MappingTraits <offloadtest::BLASDesc> {
716+ static void mapping (IO &I, offloadtest::BLASDesc &D);
717+ };
718+
719+ template <> struct MappingTraits <offloadtest::InstanceDesc> {
720+ static void mapping (IO &I, offloadtest::InstanceDesc &D);
721+ };
722+
723+ template <> struct MappingTraits <offloadtest::TLASDesc> {
724+ static void mapping (IO &I, offloadtest::TLASDesc &D);
725+ };
726+
727+ template <> struct MappingTraits <offloadtest::AccelerationStructureDescs> {
728+ static void mapping (IO &I, offloadtest::AccelerationStructureDescs &D);
729+ };
730+
623731template <> struct ScalarEnumerationTraits <offloadtest::Rule> {
624732 static void enumeration (IO &I, offloadtest::Rule &V) {
625733#define ENUM_CASE (Val ) I.enumCase(V, #Val, offloadtest::Rule::Val)
@@ -721,6 +829,41 @@ template <> struct ScalarEnumerationTraits<offloadtest::ResourceKind> {
721829 ENUM_CASE (ConstantBuffer);
722830 ENUM_CASE (Sampler);
723831 ENUM_CASE (SampledTexture2D);
832+ ENUM_CASE (AccelerationStructure);
833+ #undef ENUM_CASE
834+ }
835+ };
836+
837+ template <> struct ScalarEnumerationTraits <offloadtest::Format> {
838+ static void enumeration (IO &I, offloadtest::Format &V) {
839+ #define ENUM_CASE (Val ) I.enumCase(V, #Val, offloadtest::Format::Val)
840+ ENUM_CASE (R16Sint);
841+ ENUM_CASE (R16Uint);
842+ ENUM_CASE (RG16Sint);
843+ ENUM_CASE (RG16Uint);
844+ ENUM_CASE (RGBA16Sint);
845+ ENUM_CASE (RGBA16Uint);
846+ ENUM_CASE (R32Sint);
847+ ENUM_CASE (R32Uint);
848+ ENUM_CASE (R32Float);
849+ ENUM_CASE (RG32Sint);
850+ ENUM_CASE (RG32Uint);
851+ ENUM_CASE (RG32Float);
852+ ENUM_CASE (RGB32Float);
853+ ENUM_CASE (RGBA32Sint);
854+ ENUM_CASE (RGBA32Uint);
855+ ENUM_CASE (RGBA32Float);
856+ ENUM_CASE (D32Float);
857+ ENUM_CASE (D32FloatS8Uint);
858+ #undef ENUM_CASE
859+ }
860+ };
861+
862+ template <> struct ScalarEnumerationTraits <offloadtest::IndexFormat> {
863+ static void enumeration (IO &I, offloadtest::IndexFormat &V) {
864+ #define ENUM_CASE (Val ) I.enumCase(V, #Val, offloadtest::IndexFormat::Val)
865+ ENUM_CASE (Uint16);
866+ ENUM_CASE (Uint32);
724867#undef ENUM_CASE
725868 }
726869};
0 commit comments