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"
@@ -81,6 +82,8 @@ static inline DescriptorKind getDescriptorKind(ResourceKind RK) {
8182 return DescriptorKind::SAMPLER ;
8283 case ResourceKind::SampledTexture2D:
8384 llvm_unreachable (" Sampled textures aren't supported!" );
85+ case ResourceKind::AccelerationStructure:
86+ return DescriptorKind::SRV ;
8487 }
8588 llvm_unreachable (" All cases handled" );
8689}
@@ -207,6 +210,8 @@ struct Result {
207210 double Epsilon;
208211};
209212
213+ struct CPUTLASDesc ;
214+
210215struct Resource {
211216 ResourceKind Kind;
212217 std::string Name;
@@ -217,6 +222,11 @@ struct Resource {
217222 bool HasCounter;
218223 std::optional<uint32_t > TilesMapped;
219224 bool IsReserved = false ;
225+ CPUTLASDesc *TLASPtr = nullptr ;
226+
227+ bool isAccelerationStructure () const {
228+ return Kind == ResourceKind::AccelerationStructure;
229+ }
220230
221231 bool isRaw () const {
222232 switch (Kind) {
@@ -226,6 +236,7 @@ struct Resource {
226236 case ResourceKind::RWTexture2D:
227237 case ResourceKind::Sampler:
228238 case ResourceKind::SampledTexture2D:
239+ case ResourceKind::AccelerationStructure:
229240 return false ;
230241 case ResourceKind::StructuredBuffer:
231242 case ResourceKind::RWStructuredBuffer:
@@ -251,6 +262,7 @@ struct Resource {
251262 case ResourceKind::Texture2D:
252263 case ResourceKind::RWTexture2D:
253264 case ResourceKind::SampledTexture2D:
265+ case ResourceKind::AccelerationStructure:
254266 return false ;
255267 }
256268 llvm_unreachable (" All cases handled" );
@@ -266,6 +278,7 @@ struct Resource {
266278 case ResourceKind::RWByteAddressBuffer:
267279 case ResourceKind::ConstantBuffer:
268280 case ResourceKind::Sampler:
281+ case ResourceKind::AccelerationStructure:
269282 return false ;
270283 case ResourceKind::Texture2D:
271284 case ResourceKind::RWTexture2D:
@@ -305,18 +318,22 @@ struct Resource {
305318 }
306319
307320 uint32_t getElementSize () const {
308- assert (!isSampler () && " Samplers do not have element size" );
321+ assert (!isSampler () && !isAccelerationStructure () &&
322+ " Samplers and AS do not have element size" );
309323 // ByteAddressBuffers are treated as 4-byte elements to match their memory
310324 // format.
311325 return isByteAddressBuffer () ? 4 : BufferPtr->getElementSize ();
312326 }
313327
314328 uint32_t getArraySize () const {
315- return isSampler () ? 1 : BufferPtr->ArraySize ;
329+ if (isSampler () || isAccelerationStructure ())
330+ return 1 ;
331+ return BufferPtr->ArraySize ;
316332 }
317333
318334 uint32_t size () const {
319- assert (!isSampler () && " Samplers do not have size" );
335+ assert (!isSampler () && !isAccelerationStructure () &&
336+ " Samplers and AS do not have size" );
320337 return BufferPtr->size ();
321338 }
322339
@@ -329,6 +346,7 @@ struct Resource {
329346 case ResourceKind::ConstantBuffer:
330347 case ResourceKind::Sampler:
331348 case ResourceKind::SampledTexture2D:
349+ case ResourceKind::AccelerationStructure:
332350 return false ;
333351 case ResourceKind::RWBuffer:
334352 case ResourceKind::RWStructuredBuffer:
@@ -444,6 +462,53 @@ struct DispatchParametersSet {
444462 std::optional<uint32_t > VertexCount;
445463};
446464
465+ enum class IndexFormat { Uint16, Uint32 };
466+
467+ struct CPUTriangleGeometry {
468+ std::string VertexBuffer;
469+ CPUBuffer *VertexBufferPtr = nullptr ;
470+ Format VertexFormat = Format::RGB32Float;
471+ uint32_t VertexStride = 12 ;
472+ uint32_t VertexCount = 0 ;
473+ std::string IndexBuffer;
474+ CPUBuffer *IndexBufferPtr = nullptr ;
475+ IndexFormat IdxFormat = IndexFormat::Uint32;
476+ uint32_t IndexCount = 0 ;
477+ bool Opaque = true ;
478+ };
479+
480+ struct CPUAABBGeometry {
481+ std::string AABBBuffer;
482+ CPUBuffer *AABBBufferPtr = nullptr ;
483+ uint32_t AABBCount = 0 ;
484+ uint32_t AABBStride = 24 ;
485+ bool Opaque = true ;
486+ };
487+
488+ struct CPUBLASDesc {
489+ std::string Name;
490+ llvm::SmallVector<CPUTriangleGeometry> Triangles;
491+ llvm::SmallVector<CPUAABBGeometry> AABBs;
492+ };
493+
494+ struct CPUInstanceDesc {
495+ std::string BLAS ;
496+ int BLASIdx = -1 ;
497+ float Transform[12 ] = {1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 };
498+ uint32_t InstanceID = 0 ;
499+ uint8_t InstanceMask = 0xFF ;
500+ };
501+
502+ struct CPUTLASDesc {
503+ std::string Name;
504+ llvm::SmallVector<CPUInstanceDesc> Instances;
505+ };
506+
507+ struct AccelerationStructureDescs {
508+ llvm::SmallVector<CPUBLASDesc> BLAS ;
509+ llvm::SmallVector<CPUTLASDesc> TLAS ;
510+ };
511+
447512struct Pipeline {
448513 ShaderPipelineKind Kind;
449514 llvm::SmallVector<Shader> Shaders;
@@ -456,6 +521,7 @@ struct Pipeline {
456521 llvm::SmallVector<Result> Results;
457522 llvm::SmallVector<DescriptorSet> Sets;
458523 DispatchParametersSet DispatchParameters;
524+ AccelerationStructureDescs AccelStructs;
459525
460526 uint32_t getVertexCount () const {
461527 if (DispatchParameters.VertexCount )
@@ -496,6 +562,20 @@ struct Pipeline {
496562 return nullptr ;
497563 }
498564
565+ CPUBLASDesc *getBLAS (llvm::StringRef Name) {
566+ for (auto &B : AccelStructs.BLAS )
567+ if (Name == B.Name )
568+ return &B;
569+ return nullptr ;
570+ }
571+
572+ CPUTLASDesc *getTLAS (llvm::StringRef Name) {
573+ for (auto &T : AccelStructs.TLAS )
574+ if (Name == T.Name )
575+ return &T;
576+ return nullptr ;
577+ }
578+
499579 llvm::Error validatePipelineKind ();
500580 llvm::Error validateDispatchParameters ();
501581
@@ -518,6 +598,11 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::SpecializationConstant)
518598LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::PushConstantBlock)
519599LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::PushConstantValue)
520600LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::DispatchParametersSet)
601+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::CPUTriangleGeometry)
602+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::CPUAABBGeometry)
603+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::CPUBLASDesc)
604+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::CPUInstanceDesc)
605+ LLVM_YAML_IS_SEQUENCE_VECTOR (offloadtest::CPUTLASDesc)
521606
522607namespace llvm {
523608namespace yaml {
@@ -602,6 +687,30 @@ template <> struct MappingTraits<offloadtest::SpecializationConstant> {
602687 static void mapping (IO &I, offloadtest::SpecializationConstant &C);
603688};
604689
690+ template <> struct MappingTraits <offloadtest::CPUTriangleGeometry> {
691+ static void mapping (IO &I, offloadtest::CPUTriangleGeometry &G);
692+ };
693+
694+ template <> struct MappingTraits <offloadtest::CPUAABBGeometry> {
695+ static void mapping (IO &I, offloadtest::CPUAABBGeometry &G);
696+ };
697+
698+ template <> struct MappingTraits <offloadtest::CPUBLASDesc> {
699+ static void mapping (IO &I, offloadtest::CPUBLASDesc &D);
700+ };
701+
702+ template <> struct MappingTraits <offloadtest::CPUInstanceDesc> {
703+ static void mapping (IO &I, offloadtest::CPUInstanceDesc &D);
704+ };
705+
706+ template <> struct MappingTraits <offloadtest::CPUTLASDesc> {
707+ static void mapping (IO &I, offloadtest::CPUTLASDesc &D);
708+ };
709+
710+ template <> struct MappingTraits <offloadtest::AccelerationStructureDescs> {
711+ static void mapping (IO &I, offloadtest::AccelerationStructureDescs &D);
712+ };
713+
605714template <> struct ScalarEnumerationTraits <offloadtest::Rule> {
606715 static void enumeration (IO &I, offloadtest::Rule &V) {
607716#define ENUM_CASE (Val ) I.enumCase(V, #Val, offloadtest::Rule::Val)
@@ -703,6 +812,41 @@ template <> struct ScalarEnumerationTraits<offloadtest::ResourceKind> {
703812 ENUM_CASE (ConstantBuffer);
704813 ENUM_CASE (Sampler);
705814 ENUM_CASE (SampledTexture2D);
815+ ENUM_CASE (AccelerationStructure);
816+ #undef ENUM_CASE
817+ }
818+ };
819+
820+ template <> struct ScalarEnumerationTraits <offloadtest::Format> {
821+ static void enumeration (IO &I, offloadtest::Format &V) {
822+ #define ENUM_CASE (Val ) I.enumCase(V, #Val, offloadtest::Format::Val)
823+ ENUM_CASE (R16Sint);
824+ ENUM_CASE (R16Uint);
825+ ENUM_CASE (RG16Sint);
826+ ENUM_CASE (RG16Uint);
827+ ENUM_CASE (RGBA16Sint);
828+ ENUM_CASE (RGBA16Uint);
829+ ENUM_CASE (R32Sint);
830+ ENUM_CASE (R32Uint);
831+ ENUM_CASE (R32Float);
832+ ENUM_CASE (RG32Sint);
833+ ENUM_CASE (RG32Uint);
834+ ENUM_CASE (RG32Float);
835+ ENUM_CASE (RGB32Float);
836+ ENUM_CASE (RGBA32Sint);
837+ ENUM_CASE (RGBA32Uint);
838+ ENUM_CASE (RGBA32Float);
839+ ENUM_CASE (D32Float);
840+ ENUM_CASE (D32FloatS8Uint);
841+ #undef ENUM_CASE
842+ }
843+ };
844+
845+ template <> struct ScalarEnumerationTraits <offloadtest::IndexFormat> {
846+ static void enumeration (IO &I, offloadtest::IndexFormat &V) {
847+ #define ENUM_CASE (Val ) I.enumCase(V, #Val, offloadtest::IndexFormat::Val)
848+ ENUM_CASE (Uint16);
849+ ENUM_CASE (Uint32);
706850#undef ENUM_CASE
707851 }
708852};
0 commit comments