Skip to content

Commit 8d00c38

Browse files
MarijnS95claude
andcommitted
Add YAML-driven acceleration structure definitions for .test files.
Add AccelerationStructure to ResourceKind and introduce pipeline structs (CPUTriangleGeometry, CPUAABBGeometry, CPUBLASDesc, CPUInstanceDesc, CPUTLASDesc) with YAML parsing and name resolution for buffer/BLAS/TLAS references. Backend switch statements are updated to handle the new enum value. Includes three placeholder InlineRT test files exercising the new YAML format (gated behind REQUIRES: raytracing). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7cd5ae1 commit 8d00c38

13 files changed

Lines changed: 543 additions & 6 deletions

File tree

include/API/Enums.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ enum class ResourceKind {
2323
ConstantBuffer,
2424
Sampler,
2525
SampledTexture2D,
26+
AccelerationStructure,
2627
};
2728

2829
enum ShaderContainerType {

include/Support/Pipeline.h

Lines changed: 147 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
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"
@@ -91,6 +92,8 @@ static inline DescriptorKind getDescriptorKind(ResourceKind RK) {
9192
return DescriptorKind::SAMPLER;
9293
case ResourceKind::SampledTexture2D:
9394
llvm_unreachable("Sampled textures aren't supported!");
95+
case ResourceKind::AccelerationStructure:
96+
return DescriptorKind::SRV;
9497
}
9598
llvm_unreachable("All cases handled");
9699
}
@@ -217,6 +220,8 @@ struct Result {
217220
double Epsilon;
218221
};
219222

223+
struct TLASDesc;
224+
220225
struct Resource {
221226
ResourceKind Kind;
222227
std::string Name;
@@ -227,6 +232,11 @@ struct Resource {
227232
bool HasCounter;
228233
std::optional<uint32_t> TilesMapped;
229234
bool IsReserved = false;
235+
TLASDesc *TLASPtr = nullptr;
236+
237+
bool isAccelerationStructure() const {
238+
return Kind == ResourceKind::AccelerationStructure;
239+
}
230240

231241
bool isRaw() const {
232242
switch (Kind) {
@@ -236,6 +246,7 @@ struct Resource {
236246
case ResourceKind::RWTexture2D:
237247
case ResourceKind::Sampler:
238248
case ResourceKind::SampledTexture2D:
249+
case ResourceKind::AccelerationStructure:
239250
return false;
240251
case ResourceKind::StructuredBuffer:
241252
case ResourceKind::RWStructuredBuffer:
@@ -261,6 +272,7 @@ struct Resource {
261272
case ResourceKind::Texture2D:
262273
case ResourceKind::RWTexture2D:
263274
case ResourceKind::SampledTexture2D:
275+
case ResourceKind::AccelerationStructure:
264276
return false;
265277
}
266278
llvm_unreachable("All cases handled");
@@ -276,6 +288,7 @@ struct Resource {
276288
case ResourceKind::RWByteAddressBuffer:
277289
case ResourceKind::ConstantBuffer:
278290
case ResourceKind::Sampler:
291+
case ResourceKind::AccelerationStructure:
279292
return false;
280293
case ResourceKind::Texture2D:
281294
case ResourceKind::RWTexture2D:
@@ -315,18 +328,22 @@ struct Resource {
315328
}
316329

317330
uint32_t getElementSize() const {
318-
assert(!isSampler() && "Samplers do not have element size");
331+
assert(!isSampler() && !isAccelerationStructure() &&
332+
"Samplers and AS do not have element size");
319333
// ByteAddressBuffers are treated as 4-byte elements to match their memory
320334
// format.
321335
return isByteAddressBuffer() ? 4 : BufferPtr->getElementSize();
322336
}
323337

324338
uint32_t getArraySize() const {
325-
return isSampler() ? 1 : BufferPtr->ArraySize;
339+
if (isSampler() || isAccelerationStructure())
340+
return 1;
341+
return BufferPtr->ArraySize;
326342
}
327343

328344
uint32_t size() const {
329-
assert(!isSampler() && "Samplers do not have size");
345+
assert(!isSampler() && !isAccelerationStructure() &&
346+
"Samplers and AS do not have size");
330347
return BufferPtr->size();
331348
}
332349

@@ -339,6 +356,7 @@ struct Resource {
339356
case ResourceKind::ConstantBuffer:
340357
case ResourceKind::Sampler:
341358
case ResourceKind::SampledTexture2D:
359+
case ResourceKind::AccelerationStructure:
342360
return false;
343361
case ResourceKind::RWBuffer:
344362
case ResourceKind::RWStructuredBuffer:
@@ -454,6 +472,53 @@ struct DispatchParametersSet {
454472
std::optional<uint32_t> VertexCount;
455473
};
456474

475+
enum class IndexFormat { Uint16, Uint32 };
476+
477+
struct TriangleGeometry {
478+
std::string VertexBuffer;
479+
CPUBuffer *VertexBufferPtr = nullptr;
480+
Format VertexFormat = Format::RGB32Float;
481+
uint32_t VertexStride = 12;
482+
uint32_t VertexCount = 0;
483+
std::string IndexBuffer;
484+
CPUBuffer *IndexBufferPtr = nullptr;
485+
IndexFormat IdxFormat = IndexFormat::Uint32;
486+
uint32_t IndexCount = 0;
487+
bool Opaque = true;
488+
};
489+
490+
struct AABBGeometry {
491+
std::string AABBBuffer;
492+
CPUBuffer *AABBBufferPtr = nullptr;
493+
uint32_t AABBCount = 0;
494+
uint32_t AABBStride = 24;
495+
bool Opaque = true;
496+
};
497+
498+
struct BLASDesc {
499+
std::string Name;
500+
llvm::SmallVector<TriangleGeometry> Triangles;
501+
llvm::SmallVector<AABBGeometry> AABBs;
502+
};
503+
504+
struct InstanceDesc {
505+
std::string BLAS;
506+
int BLASIdx = -1;
507+
float Transform[12] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0};
508+
uint32_t InstanceID = 0;
509+
uint8_t InstanceMask = 0xFF;
510+
};
511+
512+
struct TLASDesc {
513+
std::string Name;
514+
llvm::SmallVector<InstanceDesc> Instances;
515+
};
516+
517+
struct AccelerationStructureDescs {
518+
llvm::SmallVector<BLASDesc> BLAS;
519+
llvm::SmallVector<TLASDesc> TLAS;
520+
};
521+
457522
struct Pipeline {
458523
ShaderPipelineKind Kind;
459524
llvm::SmallVector<Shader> Shaders;
@@ -466,6 +531,7 @@ struct Pipeline {
466531
llvm::SmallVector<Result> Results;
467532
llvm::SmallVector<DescriptorSet> Sets;
468533
DispatchParametersSet DispatchParameters;
534+
AccelerationStructureDescs AccelStructs;
469535

470536
uint32_t getVertexCount() const {
471537
if (DispatchParameters.VertexCount)
@@ -506,6 +572,20 @@ struct Pipeline {
506572
return nullptr;
507573
}
508574

575+
BLASDesc *getBLAS(llvm::StringRef Name) {
576+
for (auto &B : AccelStructs.BLAS)
577+
if (Name == B.Name)
578+
return &B;
579+
return nullptr;
580+
}
581+
582+
TLASDesc *getTLAS(llvm::StringRef Name) {
583+
for (auto &T : AccelStructs.TLAS)
584+
if (Name == T.Name)
585+
return &T;
586+
return nullptr;
587+
}
588+
509589
llvm::Error validatePipelineKind();
510590
llvm::Error validateDispatchParameters();
511591

@@ -534,6 +614,11 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::SpecializationConstant)
534614
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantBlock)
535615
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantValue)
536616
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::DispatchParametersSet)
617+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::TriangleGeometry)
618+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::AABBGeometry)
619+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::BLASDesc)
620+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::InstanceDesc)
621+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::TLASDesc)
537622

538623
namespace llvm {
539624
namespace yaml {
@@ -618,6 +703,30 @@ template <> struct MappingTraits<offloadtest::SpecializationConstant> {
618703
static void mapping(IO &I, offloadtest::SpecializationConstant &C);
619704
};
620705

706+
template <> struct MappingTraits<offloadtest::TriangleGeometry> {
707+
static void mapping(IO &I, offloadtest::TriangleGeometry &G);
708+
};
709+
710+
template <> struct MappingTraits<offloadtest::AABBGeometry> {
711+
static void mapping(IO &I, offloadtest::AABBGeometry &G);
712+
};
713+
714+
template <> struct MappingTraits<offloadtest::BLASDesc> {
715+
static void mapping(IO &I, offloadtest::BLASDesc &D);
716+
};
717+
718+
template <> struct MappingTraits<offloadtest::InstanceDesc> {
719+
static void mapping(IO &I, offloadtest::InstanceDesc &D);
720+
};
721+
722+
template <> struct MappingTraits<offloadtest::TLASDesc> {
723+
static void mapping(IO &I, offloadtest::TLASDesc &D);
724+
};
725+
726+
template <> struct MappingTraits<offloadtest::AccelerationStructureDescs> {
727+
static void mapping(IO &I, offloadtest::AccelerationStructureDescs &D);
728+
};
729+
621730
template <> struct ScalarEnumerationTraits<offloadtest::Rule> {
622731
static void enumeration(IO &I, offloadtest::Rule &V) {
623732
#define ENUM_CASE(Val) I.enumCase(V, #Val, offloadtest::Rule::Val)
@@ -719,6 +828,41 @@ template <> struct ScalarEnumerationTraits<offloadtest::ResourceKind> {
719828
ENUM_CASE(ConstantBuffer);
720829
ENUM_CASE(Sampler);
721830
ENUM_CASE(SampledTexture2D);
831+
ENUM_CASE(AccelerationStructure);
832+
#undef ENUM_CASE
833+
}
834+
};
835+
836+
template <> struct ScalarEnumerationTraits<offloadtest::Format> {
837+
static void enumeration(IO &I, offloadtest::Format &V) {
838+
#define ENUM_CASE(Val) I.enumCase(V, #Val, offloadtest::Format::Val)
839+
ENUM_CASE(R16Sint);
840+
ENUM_CASE(R16Uint);
841+
ENUM_CASE(RG16Sint);
842+
ENUM_CASE(RG16Uint);
843+
ENUM_CASE(RGBA16Sint);
844+
ENUM_CASE(RGBA16Uint);
845+
ENUM_CASE(R32Sint);
846+
ENUM_CASE(R32Uint);
847+
ENUM_CASE(R32Float);
848+
ENUM_CASE(RG32Sint);
849+
ENUM_CASE(RG32Uint);
850+
ENUM_CASE(RG32Float);
851+
ENUM_CASE(RGB32Float);
852+
ENUM_CASE(RGBA32Sint);
853+
ENUM_CASE(RGBA32Uint);
854+
ENUM_CASE(RGBA32Float);
855+
ENUM_CASE(D32Float);
856+
ENUM_CASE(D32FloatS8Uint);
857+
#undef ENUM_CASE
858+
}
859+
};
860+
861+
template <> struct ScalarEnumerationTraits<offloadtest::IndexFormat> {
862+
static void enumeration(IO &I, offloadtest::IndexFormat &V) {
863+
#define ENUM_CASE(Val) I.enumCase(V, #Val, offloadtest::IndexFormat::Val)
864+
ENUM_CASE(Uint16);
865+
ENUM_CASE(Uint32);
722866
#undef ENUM_CASE
723867
}
724868
};

lib/API/DX/DXFeatures.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ static ArrayRef<EnumEntry<MeshShaderTier>> getMeshShaderTiers() {
4343
return ArrayRef(MeshShaderTierNames);
4444
}
4545

46+
#define RAYTRACING_TIER_ENUM(NewCase, Str, Value) {#Str, NewCase},
47+
static const EnumEntry<directx::RaytracingTier> RaytracingTierNames[]{
48+
#include "DXFeatures.def"
49+
};
50+
51+
static ArrayRef<EnumEntry<RaytracingTier>> getRaytracingTiers() {
52+
return ArrayRef(RaytracingTierNames);
53+
}
54+
4655
template <typename T>
4756
static std::string enumEntryToString(ArrayRef<EnumEntry<T>> EnumValues,
4857
T Value) {
@@ -66,3 +75,8 @@ std::string CapabilityPrinter<directx::MeshShaderTier>::toString(
6675
const directx::MeshShaderTier &V) {
6776
return enumEntryToString(getMeshShaderTiers(), V);
6877
}
78+
79+
std::string CapabilityPrinter<directx::RaytracingTier>::toString(
80+
const directx::RaytracingTier &V) {
81+
return enumEntryToString(getRaytracingTiers(), V);
82+
}

lib/API/DX/DXFeatures.def

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,19 @@ MESH_SHADER_TIER_ENUM(MeshShaderTier1, Tier1,10)
2828
#undef MESH_SHADER_TIER_ENUM
2929
#endif
3030

31+
#ifdef RAYTRACING_TIER_ENUM
32+
RAYTRACING_TIER_ENUM(RT_NotSupported, NotSupported, 0)
33+
RAYTRACING_TIER_ENUM(RT_1_0, 1.0, 10)
34+
RAYTRACING_TIER_ENUM(RT_1_1, 1.1, 11)
35+
RAYTRACING_TIER_ENUM(RT_1_2, 1.2, 12)
36+
#undef RAYTRACING_TIER_ENUM
37+
#endif
38+
3139
#ifdef D3D_FEATURE_ENUM
3240
D3D_FEATURE_ENUM(directx::ShaderModel, HighestShaderModel)
3341
D3D_FEATURE_ENUM(directx::RootSignature, HighestRootSignatureVersion)
3442
D3D_FEATURE_ENUM(directx::MeshShaderTier, MeshShaderTier)
43+
D3D_FEATURE_ENUM(directx::RaytracingTier, RaytracingTier)
3544
#undef D3D_FEATURE_ENUM
3645
#endif
3746

lib/API/DX/DXFeatures.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ enum MeshShaderTier {
3737
#include "DXFeatures.def"
3838
};
3939

40+
#define RAYTRACING_TIER_ENUM(NewCase, Str, Value) NewCase = Value,
41+
enum RaytracingTier {
42+
#include "DXFeatures.def"
43+
};
44+
4045
} // namespace directx
4146

4247
template <> struct CapabilityPrinter<directx::ShaderModel> {
@@ -51,6 +56,10 @@ template <> struct CapabilityPrinter<directx::MeshShaderTier> {
5156
static std::string toString(const directx::MeshShaderTier &V);
5257
};
5358

59+
template <> struct CapabilityPrinter<directx::RaytracingTier> {
60+
static std::string toString(const directx::RaytracingTier &V);
61+
};
62+
5463
} // namespace offloadtest
5564

5665
#endif // OFFLOADTEST_API_DXFEATURES_H

lib/API/DX/Device.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ using ID3D12GraphicsCommandListX = ID3D12GraphicsCommandList6;
6363
template <> char CapabilityValueEnum<directx::ShaderModel>::ID = 0;
6464
template <> char CapabilityValueEnum<directx::RootSignature>::ID = 0;
6565
template <> char CapabilityValueEnum<directx::MeshShaderTier>::ID = 0;
66+
template <> char CapabilityValueEnum<directx::RaytracingTier>::ID = 0;
6667

6768
static std::mutex SignalHandlerMutex;
6869
static llvm::SmallVector<ID3D12DeviceX *> SignalHandlerDevices;
@@ -195,6 +196,8 @@ static D3D12_RESOURCE_DIMENSION getDXDimension(ResourceKind RK) {
195196
return D3D12_RESOURCE_DIMENSION_UNKNOWN;
196197
case ResourceKind::SampledTexture2D:
197198
llvm_unreachable("SampledTextures aren't supported in DirectX!");
199+
case ResourceKind::AccelerationStructure:
200+
return D3D12_RESOURCE_DIMENSION_BUFFER;
198201
}
199202
llvm_unreachable("All cases handled");
200203
}
@@ -268,6 +271,8 @@ static D3D12_SHADER_RESOURCE_VIEW_DESC getSRVDescription(const Resource &R) {
268271
llvm_unreachable("Not an SRV type!");
269272
case ResourceKind::SampledTexture2D:
270273
llvm_unreachable("Sampled textures aren't supported in DirectX!");
274+
case ResourceKind::AccelerationStructure:
275+
llvm_unreachable("Acceleration structures use a separate descriptor path!");
271276
}
272277
return Desc;
273278
}
@@ -307,6 +312,8 @@ static D3D12_UNORDERED_ACCESS_VIEW_DESC getUAVDescription(const Resource &R) {
307312
llvm_unreachable("Not a UAV type!");
308313
case ResourceKind::SampledTexture2D:
309314
llvm_unreachable("Sampled textures aren't supported in DirectX!");
315+
case ResourceKind::AccelerationStructure:
316+
llvm_unreachable("Acceleration structures use a separate descriptor path!");
310317
}
311318
return Desc;
312319
}

lib/API/MTL/MTLDevice.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,8 @@ class MTLDevice : public offloadtest::Device {
10721072
case ResourceKind::RWByteAddressBuffer:
10731073
case ResourceKind::ConstantBuffer:
10741074
llvm_unreachable("Raw is checked above");
1075+
case ResourceKind::AccelerationStructure:
1076+
llvm_unreachable("Acceleration structures use a separate path!");
10751077
}
10761078

10771079
MTL::Texture *NewTex = Device->newTexture(Desc);
@@ -1878,7 +1880,12 @@ class MTLDevice : public offloadtest::Device {
18781880
virtual ~MTLDevice() {};
18791881

18801882
private:
1881-
void queryCapabilities() {}
1883+
void queryCapabilities() {
1884+
Caps.insert(
1885+
std::make_pair("supportsRaytracing",
1886+
makeCapability<bool>("supportsRaytracing",
1887+
Device->supportsRaytracing())));
1888+
}
18821889
};
18831890
} // namespace
18841891

0 commit comments

Comments
 (0)