Skip to content

Commit de55a15

Browse files
MarijnS95claude
andcommitted
Add YAML-driven acceleration structure definitions for .test files
Add AccelerationStructure to ResourceKind and introduce pipeline structs (TriangleGeometry, AABBGeometry, BLASDesc, InstanceDesc, TLASDesc) 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 997b1c7 commit de55a15

13 files changed

Lines changed: 541 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: 146 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"
@@ -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+
221225
struct 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+
459523
struct 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)
536615
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantBlock)
537616
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantValue)
538617
LLVM_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

540624
namespace llvm {
541625
namespace 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+
623731
template <> 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
};

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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ using ID3D12GraphicsCommandListX = ID3D12GraphicsCommandList6;
6464
template <> char CapabilityValueEnum<directx::ShaderModel>::ID = 0;
6565
template <> char CapabilityValueEnum<directx::RootSignature>::ID = 0;
6666
template <> char CapabilityValueEnum<directx::MeshShaderTier>::ID = 0;
67+
template <> char CapabilityValueEnum<directx::RaytracingTier>::ID = 0;
6768

6869
static std::mutex SignalHandlerMutex;
6970
static llvm::SmallVector<ID3D12DeviceX *> SignalHandlerDevices;
@@ -210,6 +211,7 @@ static D3D12_RESOURCE_DIMENSION getDXDimension(ResourceKind RK) {
210211
case ResourceKind::RWBuffer:
211212
case ResourceKind::RWByteAddressBuffer:
212213
case ResourceKind::ConstantBuffer:
214+
case ResourceKind::AccelerationStructure:
213215
return D3D12_RESOURCE_DIMENSION_BUFFER;
214216
case ResourceKind::Texture2D:
215217
case ResourceKind::RWTexture2D:
@@ -291,6 +293,8 @@ static D3D12_SHADER_RESOURCE_VIEW_DESC getSRVDescription(const Resource &R) {
291293
llvm_unreachable("Not an SRV type!");
292294
case ResourceKind::SampledTexture2D:
293295
llvm_unreachable("Sampled textures aren't supported in DirectX!");
296+
case ResourceKind::AccelerationStructure:
297+
llvm_unreachable("Acceleration structures use a separate descriptor path!");
294298
}
295299
return Desc;
296300
}
@@ -330,6 +334,8 @@ static D3D12_UNORDERED_ACCESS_VIEW_DESC getUAVDescription(const Resource &R) {
330334
llvm_unreachable("Not a UAV type!");
331335
case ResourceKind::SampledTexture2D:
332336
llvm_unreachable("Sampled textures aren't supported in DirectX!");
337+
case ResourceKind::AccelerationStructure:
338+
llvm_unreachable("Acceleration structures use a separate descriptor path!");
333339
}
334340
return Desc;
335341
}

lib/API/MTL/MTLDevice.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,8 @@ class MTLDevice : public offloadtest::Device {
10741074
case ResourceKind::RWByteAddressBuffer:
10751075
case ResourceKind::ConstantBuffer:
10761076
llvm_unreachable("Raw is checked above");
1077+
case ResourceKind::AccelerationStructure:
1078+
llvm_unreachable("Acceleration structures use a separate path!");
10771079
}
10781080

10791081
MTL::Texture *NewTex = Device->newTexture(Desc);
@@ -1883,7 +1885,12 @@ class MTLDevice : public offloadtest::Device {
18831885
virtual ~MTLDevice() {};
18841886

18851887
private:
1886-
void queryCapabilities() {}
1888+
void queryCapabilities() {
1889+
Caps.insert(
1890+
std::make_pair("supportsRaytracing",
1891+
makeCapability<bool>("supportsRaytracing",
1892+
Device->supportsRaytracing())));
1893+
}
18871894
};
18881895
} // namespace
18891896

0 commit comments

Comments
 (0)