Skip to content

Commit 6c4fecc

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 a315dd1 commit 6c4fecc

14 files changed

Lines changed: 548 additions & 5 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/API/Resources.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ enum class MemoryLocation {
2525
GpuToCpu,
2626
};
2727

28+
enum class IndexFormat { Uint16, Uint32 };
29+
2830
// TODO: Add Unorm types (e.g. R8Unorm, RGBA8Unorm) which can be sampled as
2931
// floats.
3032
// TODO: Add SRGB types (e.g. RGBA8Srgb) once needed.

include/Support/Pipeline.h

Lines changed: 144 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"
@@ -80,6 +81,7 @@ static inline DescriptorKind getDescriptorKind(ResourceKind RK) {
8081
case ResourceKind::StructuredBuffer:
8182
case ResourceKind::ByteAddressBuffer:
8283
case ResourceKind::Texture2D:
84+
case ResourceKind::AccelerationStructure:
8385
return DescriptorKind::SRV;
8486

8587
case ResourceKind::RWStructuredBuffer:
@@ -221,6 +223,8 @@ struct Result {
221223
double Epsilon;
222224
};
223225

226+
struct TLASDesc;
227+
224228
struct Resource {
225229
ResourceKind Kind;
226230
std::string Name;
@@ -231,6 +235,11 @@ struct Resource {
231235
bool HasCounter;
232236
std::optional<uint32_t> TilesMapped;
233237
bool IsReserved = false;
238+
TLASDesc *TLASPtr = nullptr;
239+
240+
bool isAccelerationStructure() const {
241+
return Kind == ResourceKind::AccelerationStructure;
242+
}
234243

235244
bool isRaw() const {
236245
switch (Kind) {
@@ -240,6 +249,7 @@ struct Resource {
240249
case ResourceKind::RWTexture2D:
241250
case ResourceKind::Sampler:
242251
case ResourceKind::SampledTexture2D:
252+
case ResourceKind::AccelerationStructure:
243253
return false;
244254
case ResourceKind::StructuredBuffer:
245255
case ResourceKind::RWStructuredBuffer:
@@ -265,6 +275,7 @@ struct Resource {
265275
case ResourceKind::Texture2D:
266276
case ResourceKind::RWTexture2D:
267277
case ResourceKind::SampledTexture2D:
278+
case ResourceKind::AccelerationStructure:
268279
return false;
269280
}
270281
llvm_unreachable("All cases handled");
@@ -280,6 +291,7 @@ struct Resource {
280291
case ResourceKind::RWByteAddressBuffer:
281292
case ResourceKind::ConstantBuffer:
282293
case ResourceKind::Sampler:
294+
case ResourceKind::AccelerationStructure:
283295
return false;
284296
case ResourceKind::Texture2D:
285297
case ResourceKind::RWTexture2D:
@@ -319,18 +331,22 @@ struct Resource {
319331
}
320332

321333
uint32_t getElementSize() const {
322-
assert(!isSampler() && "Samplers do not have element size");
334+
assert(!isSampler() && !isAccelerationStructure() &&
335+
"Samplers and AS do not have element size");
323336
// ByteAddressBuffers are treated as 4-byte elements to match their memory
324337
// format.
325338
return isByteAddressBuffer() ? 4 : BufferPtr->getElementSize();
326339
}
327340

328341
uint32_t getArraySize() const {
329-
return isSampler() ? 1 : BufferPtr->ArraySize;
342+
if (isSampler() || isAccelerationStructure())
343+
return 1;
344+
return BufferPtr->ArraySize;
330345
}
331346

332347
uint32_t size() const {
333-
assert(!isSampler() && "Samplers do not have size");
348+
assert(!isSampler() && !isAccelerationStructure() &&
349+
"Samplers and AS do not have size");
334350
return BufferPtr->size();
335351
}
336352

@@ -343,6 +359,7 @@ struct Resource {
343359
case ResourceKind::ConstantBuffer:
344360
case ResourceKind::Sampler:
345361
case ResourceKind::SampledTexture2D:
362+
case ResourceKind::AccelerationStructure:
346363
return false;
347364
case ResourceKind::RWBuffer:
348365
case ResourceKind::RWStructuredBuffer:
@@ -465,6 +482,51 @@ struct DispatchParametersSet {
465482
std::optional<uint32_t> VertexCount;
466483
};
467484

485+
struct TriangleGeometry {
486+
std::string VertexBuffer;
487+
CPUBuffer *VertexBufferPtr = nullptr;
488+
Format VertexFormat = Format::RGB32Float;
489+
uint32_t VertexStride = 12;
490+
uint32_t VertexCount = 0;
491+
std::string IndexBuffer;
492+
CPUBuffer *IndexBufferPtr = nullptr;
493+
IndexFormat IdxFormat = IndexFormat::Uint32;
494+
uint32_t IndexCount = 0;
495+
bool Opaque = true;
496+
};
497+
498+
struct AABBGeometry {
499+
std::string AABBBuffer;
500+
CPUBuffer *AABBBufferPtr = nullptr;
501+
uint32_t AABBCount = 0;
502+
uint32_t AABBStride = 24;
503+
bool Opaque = true;
504+
};
505+
506+
struct BLASDesc {
507+
std::string Name;
508+
llvm::SmallVector<TriangleGeometry> Triangles;
509+
llvm::SmallVector<AABBGeometry> AABBs;
510+
};
511+
512+
struct InstanceDesc {
513+
std::string BLAS;
514+
int BLASIdx = -1;
515+
float Transform[12] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0};
516+
uint32_t InstanceID = 0;
517+
uint8_t InstanceMask = 0xFF;
518+
};
519+
520+
struct TLASDesc {
521+
std::string Name;
522+
llvm::SmallVector<InstanceDesc> Instances;
523+
};
524+
525+
struct AccelerationStructureDescs {
526+
llvm::SmallVector<BLASDesc> BLAS;
527+
llvm::SmallVector<TLASDesc> TLAS;
528+
};
529+
468530
struct Pipeline {
469531
ShaderPipelineKind Kind;
470532
llvm::SmallVector<Shader> Shaders;
@@ -477,6 +539,7 @@ struct Pipeline {
477539
llvm::SmallVector<Result> Results;
478540
llvm::SmallVector<DescriptorSet> Sets;
479541
DispatchParametersSet DispatchParameters;
542+
AccelerationStructureDescs AccelStructs;
480543

481544
uint32_t getVertexCount() const {
482545
if (DispatchParameters.VertexCount)
@@ -517,6 +580,20 @@ struct Pipeline {
517580
return nullptr;
518581
}
519582

583+
BLASDesc *getBLAS(llvm::StringRef Name) {
584+
for (auto &B : AccelStructs.BLAS)
585+
if (Name == B.Name)
586+
return &B;
587+
return nullptr;
588+
}
589+
590+
TLASDesc *getTLAS(llvm::StringRef Name) {
591+
for (auto &T : AccelStructs.TLAS)
592+
if (Name == T.Name)
593+
return &T;
594+
return nullptr;
595+
}
596+
520597
llvm::Error validatePipelineKind();
521598
llvm::Error validateDispatchParameters();
522599

@@ -545,6 +622,11 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::SpecializationConstant)
545622
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantBlock)
546623
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::PushConstantValue)
547624
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::DispatchParametersSet)
625+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::TriangleGeometry)
626+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::AABBGeometry)
627+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::BLASDesc)
628+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::InstanceDesc)
629+
LLVM_YAML_IS_SEQUENCE_VECTOR(offloadtest::TLASDesc)
548630

549631
namespace llvm {
550632
namespace yaml {
@@ -629,6 +711,30 @@ template <> struct MappingTraits<offloadtest::SpecializationConstant> {
629711
static void mapping(IO &I, offloadtest::SpecializationConstant &C);
630712
};
631713

714+
template <> struct MappingTraits<offloadtest::TriangleGeometry> {
715+
static void mapping(IO &I, offloadtest::TriangleGeometry &G);
716+
};
717+
718+
template <> struct MappingTraits<offloadtest::AABBGeometry> {
719+
static void mapping(IO &I, offloadtest::AABBGeometry &G);
720+
};
721+
722+
template <> struct MappingTraits<offloadtest::BLASDesc> {
723+
static void mapping(IO &I, offloadtest::BLASDesc &D);
724+
};
725+
726+
template <> struct MappingTraits<offloadtest::InstanceDesc> {
727+
static void mapping(IO &I, offloadtest::InstanceDesc &D);
728+
};
729+
730+
template <> struct MappingTraits<offloadtest::TLASDesc> {
731+
static void mapping(IO &I, offloadtest::TLASDesc &D);
732+
};
733+
734+
template <> struct MappingTraits<offloadtest::AccelerationStructureDescs> {
735+
static void mapping(IO &I, offloadtest::AccelerationStructureDescs &D);
736+
};
737+
632738
template <> struct ScalarEnumerationTraits<offloadtest::Rule> {
633739
static void enumeration(IO &I, offloadtest::Rule &V) {
634740
#define ENUM_CASE(Val) I.enumCase(V, #Val, offloadtest::Rule::Val)
@@ -730,6 +836,41 @@ template <> struct ScalarEnumerationTraits<offloadtest::ResourceKind> {
730836
ENUM_CASE(ConstantBuffer);
731837
ENUM_CASE(Sampler);
732838
ENUM_CASE(SampledTexture2D);
839+
ENUM_CASE(AccelerationStructure);
840+
#undef ENUM_CASE
841+
}
842+
};
843+
844+
template <> struct ScalarEnumerationTraits<offloadtest::Format> {
845+
static void enumeration(IO &I, offloadtest::Format &V) {
846+
#define ENUM_CASE(Val) I.enumCase(V, #Val, offloadtest::Format::Val)
847+
ENUM_CASE(R16Sint);
848+
ENUM_CASE(R16Uint);
849+
ENUM_CASE(RG16Sint);
850+
ENUM_CASE(RG16Uint);
851+
ENUM_CASE(RGBA16Sint);
852+
ENUM_CASE(RGBA16Uint);
853+
ENUM_CASE(R32Sint);
854+
ENUM_CASE(R32Uint);
855+
ENUM_CASE(R32Float);
856+
ENUM_CASE(RG32Sint);
857+
ENUM_CASE(RG32Uint);
858+
ENUM_CASE(RG32Float);
859+
ENUM_CASE(RGB32Float);
860+
ENUM_CASE(RGBA32Sint);
861+
ENUM_CASE(RGBA32Uint);
862+
ENUM_CASE(RGBA32Float);
863+
ENUM_CASE(D32Float);
864+
ENUM_CASE(D32FloatS8Uint);
865+
#undef ENUM_CASE
866+
}
867+
};
868+
869+
template <> struct ScalarEnumerationTraits<offloadtest::IndexFormat> {
870+
static void enumeration(IO &I, offloadtest::IndexFormat &V) {
871+
#define ENUM_CASE(Val) I.enumCase(V, #Val, offloadtest::IndexFormat::Val)
872+
ENUM_CASE(Uint16);
873+
ENUM_CASE(Uint32);
733874
#undef ENUM_CASE
734875
}
735876
};

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;
@@ -220,6 +221,7 @@ static D3D12_RESOURCE_DIMENSION getDXDimension(ResourceKind RK) {
220221
case ResourceKind::RWBuffer:
221222
case ResourceKind::RWByteAddressBuffer:
222223
case ResourceKind::ConstantBuffer:
224+
case ResourceKind::AccelerationStructure:
223225
return D3D12_RESOURCE_DIMENSION_BUFFER;
224226
case ResourceKind::Texture2D:
225227
case ResourceKind::RWTexture2D:
@@ -301,6 +303,8 @@ static D3D12_SHADER_RESOURCE_VIEW_DESC getSRVDescription(const Resource &R) {
301303
llvm_unreachable("Not an SRV type!");
302304
case ResourceKind::SampledTexture2D:
303305
llvm_unreachable("Sampled textures aren't supported in DirectX!");
306+
case ResourceKind::AccelerationStructure:
307+
llvm_unreachable("Acceleration structures use a separate descriptor path!");
304308
}
305309
return Desc;
306310
}
@@ -340,6 +344,8 @@ static D3D12_UNORDERED_ACCESS_VIEW_DESC getUAVDescription(const Resource &R) {
340344
llvm_unreachable("Not a UAV type!");
341345
case ResourceKind::SampledTexture2D:
342346
llvm_unreachable("Sampled textures aren't supported in DirectX!");
347+
case ResourceKind::AccelerationStructure:
348+
llvm_unreachable("Acceleration structures use a separate descriptor path!");
343349
}
344350
return Desc;
345351
}

lib/API/MTL/MTLDevice.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,8 @@ class MTLDevice : public offloadtest::Device {
11021102
case ResourceKind::RWByteAddressBuffer:
11031103
case ResourceKind::ConstantBuffer:
11041104
llvm_unreachable("Raw is checked above");
1105+
case ResourceKind::AccelerationStructure:
1106+
llvm_unreachable("Acceleration structures use a separate path!");
11051107
}
11061108

11071109
MTL::Texture *NewTex = Device->newTexture(Desc);
@@ -2091,6 +2093,10 @@ class MTLDevice : public offloadtest::Device {
20912093
Device->supportsFamily(MTL::GPUFamilyMetal3);
20922094
Caps.insert(std::make_pair(
20932095
"MeshShader", makeCapability<bool>("MeshShader", MeshShaderSupported)));
2096+
Caps.insert(
2097+
std::make_pair("supportsRaytracing",
2098+
makeCapability<bool>("supportsRaytracing",
2099+
Device->supportsRaytracing())));
20942100
}
20952101
};
20962102
} // namespace

0 commit comments

Comments
 (0)