Skip to content

Commit fe1a6e6

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 9f2f14d commit fe1a6e6

13 files changed

Lines changed: 540 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"
@@ -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+
210215
struct 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+
447512
struct 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)
518598
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantBlock)
519599
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantValue)
520600
LLVM_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

522607
namespace llvm {
523608
namespace 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+
605714
template <> 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
};

lib/API/DX/DXFeatures.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,17 @@ std::string CapabilityPrinter<directx::RootSignature>::toString(
5252
const directx::RootSignature &V) {
5353
return enumEntryToString(getRootSignatures(), V);
5454
}
55+
56+
#define RAYTRACING_TIER_ENUM(NewCase, Str, Value) {#Str, NewCase},
57+
static const EnumEntry<directx::RaytracingTier> RaytracingTierNames[]{
58+
#include "DXFeatures.def"
59+
};
60+
61+
static ArrayRef<EnumEntry<RaytracingTier>> getRaytracingTiers() {
62+
return ArrayRef(RaytracingTierNames);
63+
}
64+
65+
std::string CapabilityPrinter<directx::RaytracingTier>::toString(
66+
const directx::RaytracingTier &V) {
67+
return enumEntryToString(getRaytracingTiers(), V);
68+
}

lib/API/DX/DXFeatures.def

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,18 @@ ROOT_SIGNATURE_ENUM(RootSig_v1_2, 1.2, 0x3)
2222
#undef ROOT_SIGNATURE_ENUM
2323
#endif
2424

25+
#ifdef RAYTRACING_TIER_ENUM
26+
RAYTRACING_TIER_ENUM(RT_NotSupported, NotSupported, 0)
27+
RAYTRACING_TIER_ENUM(RT_1_0, 1.0, 10)
28+
RAYTRACING_TIER_ENUM(RT_1_1, 1.1, 11)
29+
RAYTRACING_TIER_ENUM(RT_1_2, 1.2, 12)
30+
#undef RAYTRACING_TIER_ENUM
31+
#endif
32+
2533
#ifdef D3D_FEATURE_ENUM
2634
D3D_FEATURE_ENUM(directx::ShaderModel, HighestShaderModel)
2735
D3D_FEATURE_ENUM(directx::RootSignature, HighestRootSignatureVersion)
36+
D3D_FEATURE_ENUM(directx::RaytracingTier, RaytracingTier)
2837
#undef D3D_FEATURE_ENUM
2938
#endif
3039

lib/API/DX/DXFeatures.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ enum RootSignature {
3232
#include "DXFeatures.def"
3333
};
3434

35+
#define RAYTRACING_TIER_ENUM(NewCase, Str, Value) NewCase = Value,
36+
enum RaytracingTier {
37+
#include "DXFeatures.def"
38+
};
39+
3540
} // namespace directx
3641

3742
template <> struct CapabilityPrinter<directx::ShaderModel> {
@@ -42,6 +47,10 @@ template <> struct CapabilityPrinter<directx::RootSignature> {
4247
static std::string toString(const directx::RootSignature &V);
4348
};
4449

50+
template <> struct CapabilityPrinter<directx::RaytracingTier> {
51+
static std::string toString(const directx::RaytracingTier &V);
52+
};
53+
4554
} // namespace offloadtest
4655

4756
#endif // OFFLOADTEST_API_DXFEATURES_H

lib/API/DX/Device.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ using Microsoft::WRL::ComPtr;
5959

6060
template <> char CapabilityValueEnum<directx::ShaderModel>::ID = 0;
6161
template <> char CapabilityValueEnum<directx::RootSignature>::ID = 0;
62+
template <> char CapabilityValueEnum<directx::RaytracingTier>::ID = 0;
6263

6364
static std::mutex SignalHandlerMutex;
6465
static llvm::SmallVector<ID3D12Device *> SignalHandlerDevices;
@@ -191,6 +192,8 @@ static D3D12_RESOURCE_DIMENSION getDXDimension(ResourceKind RK) {
191192
return D3D12_RESOURCE_DIMENSION_UNKNOWN;
192193
case ResourceKind::SampledTexture2D:
193194
llvm_unreachable("SampledTextures aren't supported in DirectX!");
195+
case ResourceKind::AccelerationStructure:
196+
return D3D12_RESOURCE_DIMENSION_BUFFER;
194197
}
195198
llvm_unreachable("All cases handled");
196199
}
@@ -264,6 +267,8 @@ static D3D12_SHADER_RESOURCE_VIEW_DESC getSRVDescription(const Resource &R) {
264267
llvm_unreachable("Not an SRV type!");
265268
case ResourceKind::SampledTexture2D:
266269
llvm_unreachable("Sampled textures aren't supported in DirectX!");
270+
case ResourceKind::AccelerationStructure:
271+
llvm_unreachable("Acceleration structures use a separate descriptor path!");
267272
}
268273
return Desc;
269274
}
@@ -303,6 +308,8 @@ static D3D12_UNORDERED_ACCESS_VIEW_DESC getUAVDescription(const Resource &R) {
303308
llvm_unreachable("Not a UAV type!");
304309
case ResourceKind::SampledTexture2D:
305310
llvm_unreachable("Sampled textures aren't supported in DirectX!");
311+
case ResourceKind::AccelerationStructure:
312+
llvm_unreachable("Acceleration structures use a separate descriptor path!");
306313
}
307314
return Desc;
308315
}

lib/API/MTL/MTLDevice.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1048,6 +1048,8 @@ class MTLDevice : public offloadtest::Device {
10481048
case ResourceKind::RWByteAddressBuffer:
10491049
case ResourceKind::ConstantBuffer:
10501050
llvm_unreachable("Raw is checked above");
1051+
case ResourceKind::AccelerationStructure:
1052+
llvm_unreachable("Acceleration structures use a separate path!");
10511053
}
10521054

10531055
MTL::Texture *NewTex = Device->newTexture(Desc);
@@ -1838,7 +1840,12 @@ class MTLDevice : public offloadtest::Device {
18381840
virtual ~MTLDevice() {};
18391841

18401842
private:
1841-
void queryCapabilities() {}
1843+
void queryCapabilities() {
1844+
Caps.insert(
1845+
std::make_pair("supportsRaytracing",
1846+
makeCapability<bool>("supportsRaytracing",
1847+
Device->supportsRaytracing())));
1848+
}
18421849
};
18431850
} // namespace
18441851

0 commit comments

Comments
 (0)