Skip to content

Commit e2af1c3

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 2034cde commit e2af1c3

13 files changed

Lines changed: 542 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"
@@ -92,6 +93,8 @@ static inline DescriptorKind getDescriptorKind(ResourceKind RK) {
9293
return DescriptorKind::SAMPLER;
9394
case ResourceKind::SampledTexture2D:
9495
llvm_unreachable("Sampled textures aren't supported!");
96+
case ResourceKind::AccelerationStructure:
97+
return DescriptorKind::SRV;
9598
}
9699
llvm_unreachable("All cases handled");
97100
}
@@ -218,6 +221,8 @@ struct Result {
218221
double Epsilon;
219222
};
220223

224+
struct TLASDesc;
225+
221226
struct Resource {
222227
ResourceKind Kind;
223228
std::string Name;
@@ -228,6 +233,11 @@ struct Resource {
228233
bool HasCounter;
229234
std::optional<uint32_t> TilesMapped;
230235
bool IsReserved = false;
236+
TLASDesc *TLASPtr = nullptr;
237+
238+
bool isAccelerationStructure() const {
239+
return Kind == ResourceKind::AccelerationStructure;
240+
}
231241

232242
bool isRaw() const {
233243
switch (Kind) {
@@ -237,6 +247,7 @@ struct Resource {
237247
case ResourceKind::RWTexture2D:
238248
case ResourceKind::Sampler:
239249
case ResourceKind::SampledTexture2D:
250+
case ResourceKind::AccelerationStructure:
240251
return false;
241252
case ResourceKind::StructuredBuffer:
242253
case ResourceKind::RWStructuredBuffer:
@@ -262,6 +273,7 @@ struct Resource {
262273
case ResourceKind::Texture2D:
263274
case ResourceKind::RWTexture2D:
264275
case ResourceKind::SampledTexture2D:
276+
case ResourceKind::AccelerationStructure:
265277
return false;
266278
}
267279
llvm_unreachable("All cases handled");
@@ -277,6 +289,7 @@ struct Resource {
277289
case ResourceKind::RWByteAddressBuffer:
278290
case ResourceKind::ConstantBuffer:
279291
case ResourceKind::Sampler:
292+
case ResourceKind::AccelerationStructure:
280293
return false;
281294
case ResourceKind::Texture2D:
282295
case ResourceKind::RWTexture2D:
@@ -316,18 +329,22 @@ struct Resource {
316329
}
317330

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

325339
uint32_t getArraySize() const {
326-
return isSampler() ? 1 : BufferPtr->ArraySize;
340+
if (isSampler() || isAccelerationStructure())
341+
return 1;
342+
return BufferPtr->ArraySize;
327343
}
328344

329345
uint32_t size() const {
330-
assert(!isSampler() && "Samplers do not have size");
346+
assert(!isSampler() && !isAccelerationStructure() &&
347+
"Samplers and AS do not have size");
331348
return BufferPtr->size();
332349
}
333350

@@ -340,6 +357,7 @@ struct Resource {
340357
case ResourceKind::ConstantBuffer:
341358
case ResourceKind::Sampler:
342359
case ResourceKind::SampledTexture2D:
360+
case ResourceKind::AccelerationStructure:
343361
return false;
344362
case ResourceKind::RWBuffer:
345363
case ResourceKind::RWStructuredBuffer:
@@ -456,6 +474,53 @@ struct DispatchParametersSet {
456474
std::optional<uint32_t> VertexCount;
457475
};
458476

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

472538
uint32_t getVertexCount() const {
473539
if (DispatchParameters.VertexCount)
@@ -508,6 +574,20 @@ struct Pipeline {
508574
return nullptr;
509575
}
510576

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

@@ -536,6 +616,11 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::SpecializationConstant)
536616
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantBlock)
537617
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantValue)
538618
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::DispatchParametersSet)
619+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::TriangleGeometry)
620+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::AABBGeometry)
621+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::BLASDesc)
622+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::InstanceDesc)
623+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::TLASDesc)
539624

540625
namespace llvm {
541626
namespace yaml {
@@ -620,6 +705,30 @@ template <> struct MappingTraits<offloadtest::SpecializationConstant> {
620705
static void mapping(IO &I, offloadtest::SpecializationConstant &C);
621706
};
622707

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

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);
@@ -1886,7 +1888,12 @@ class MTLDevice : public offloadtest::Device {
18861888
virtual ~MTLDevice() {};
18871889

18881890
private:
1889-
void queryCapabilities() {}
1891+
void queryCapabilities() {
1892+
Caps.insert(
1893+
std::make_pair("supportsRaytracing",
1894+
makeCapability<bool>("supportsRaytracing",
1895+
Device->supportsRaytracing())));
1896+
}
18901897
};
18911898
} // namespace
18921899

0 commit comments

Comments
 (0)