@@ -545,10 +545,19 @@ hlsl::DeclareRecordTypeWithHandle(ASTContext &context, StringRef name,
545
545
return typeDeclBuilder.getRecordDecl ();
546
546
}
547
547
548
+ AvailabilityAttr *ConstructAvailabilityAttribute (clang::ASTContext &context,
549
+ VersionTuple Introduced) {
550
+ AvailabilityAttr *AAttr = AvailabilityAttr::CreateImplicit (
551
+ context, &context.Idents .get (" " ), clang::VersionTuple (6 , 9 ),
552
+ clang::VersionTuple (), clang::VersionTuple (), false , " " );
553
+ return AAttr;
554
+ }
555
+
548
556
// creates a global static constant unsigned integer with value.
549
557
// equivalent to: static const uint name = val;
550
558
static void AddConstUInt (clang::ASTContext &context, DeclContext *DC,
551
- StringRef name, unsigned val) {
559
+ StringRef name, unsigned val,
560
+ AvailabilityAttr *AAttr = nullptr ) {
552
561
IdentifierInfo &Id = context.Idents .get (name, tok::TokenKind::identifier);
553
562
QualType type = context.getConstType (context.UnsignedIntTy );
554
563
VarDecl *varDecl = VarDecl::Create (context, DC, NoLoc, NoLoc, &Id, type,
@@ -558,6 +567,9 @@ static void AddConstUInt(clang::ASTContext &context, DeclContext *DC,
558
567
context, llvm::APInt (context.getIntWidth (type), val), type, NoLoc);
559
568
varDecl->setInit (exprVal);
560
569
varDecl->setImplicit (true );
570
+ if (AAttr)
571
+ varDecl->addAttr (AAttr);
572
+
561
573
DC->addDecl (varDecl);
562
574
}
563
575
@@ -570,6 +582,7 @@ static void AddConstUInt(clang::ASTContext &context, StringRef name,
570
582
struct Enumerant {
571
583
StringRef name;
572
584
unsigned value;
585
+ AvailabilityAttr *avail = nullptr ;
573
586
};
574
587
575
588
static void AddTypedefPseudoEnum (ASTContext &context, StringRef name,
@@ -585,33 +598,45 @@ static void AddTypedefPseudoEnum(ASTContext &context, StringRef name,
585
598
enumDecl->setImplicit (true );
586
599
// static const uint <enumerant.name> = <enumerant.value>;
587
600
for (const Enumerant &enumerant : enumerants) {
588
- AddConstUInt (context, curDC, enumerant.name , enumerant.value );
601
+ AddConstUInt (context, curDC, enumerant.name , enumerant.value ,
602
+ enumerant.avail );
589
603
}
590
604
}
591
605
592
606
// / <summary> Adds all constants and enums for ray tracing </summary>
593
607
void hlsl::AddRaytracingConstants (ASTContext &context) {
608
+
609
+ // Create aversion tuple for availability attributes
610
+ // for the RAYQUERY_FLAG enum
611
+ VersionTuple VT69 = VersionTuple (6 , 9 );
612
+
594
613
AddTypedefPseudoEnum (
595
614
context, " RAY_FLAG" ,
596
- {
597
- {" RAY_FLAG_NONE" , (unsigned )DXIL::RayFlag::None},
598
- {" RAY_FLAG_FORCE_OPAQUE" , (unsigned )DXIL::RayFlag::ForceOpaque},
599
- {" RAY_FLAG_FORCE_NON_OPAQUE" ,
600
- (unsigned )DXIL::RayFlag::ForceNonOpaque},
601
- {" RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH" ,
602
- (unsigned )DXIL::RayFlag::AcceptFirstHitAndEndSearch},
603
- {" RAY_FLAG_SKIP_CLOSEST_HIT_SHADER" ,
604
- (unsigned )DXIL::RayFlag::SkipClosestHitShader},
605
- {" RAY_FLAG_CULL_BACK_FACING_TRIANGLES" ,
606
- (unsigned )DXIL::RayFlag::CullBackFacingTriangles},
607
- {" RAY_FLAG_CULL_FRONT_FACING_TRIANGLES" ,
608
- (unsigned )DXIL::RayFlag::CullFrontFacingTriangles},
609
- {" RAY_FLAG_CULL_OPAQUE" , (unsigned )DXIL::RayFlag::CullOpaque},
610
- {" RAY_FLAG_CULL_NON_OPAQUE" , (unsigned )DXIL::RayFlag::CullNonOpaque},
611
- {" RAY_FLAG_SKIP_TRIANGLES" , (unsigned )DXIL::RayFlag::SkipTriangles},
612
- {" RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES" ,
613
- (unsigned )DXIL::RayFlag::SkipProceduralPrimitives},
614
- });
615
+ {{" RAY_FLAG_NONE" , (unsigned )DXIL::RayFlag::None},
616
+ {" RAY_FLAG_FORCE_OPAQUE" , (unsigned )DXIL::RayFlag::ForceOpaque},
617
+ {" RAY_FLAG_FORCE_NON_OPAQUE" , (unsigned )DXIL::RayFlag::ForceNonOpaque},
618
+ {" RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH" ,
619
+ (unsigned )DXIL::RayFlag::AcceptFirstHitAndEndSearch},
620
+ {" RAY_FLAG_SKIP_CLOSEST_HIT_SHADER" ,
621
+ (unsigned )DXIL::RayFlag::SkipClosestHitShader},
622
+ {" RAY_FLAG_CULL_BACK_FACING_TRIANGLES" ,
623
+ (unsigned )DXIL::RayFlag::CullBackFacingTriangles},
624
+ {" RAY_FLAG_CULL_FRONT_FACING_TRIANGLES" ,
625
+ (unsigned )DXIL::RayFlag::CullFrontFacingTriangles},
626
+ {" RAY_FLAG_CULL_OPAQUE" , (unsigned )DXIL::RayFlag::CullOpaque},
627
+ {" RAY_FLAG_CULL_NON_OPAQUE" , (unsigned )DXIL::RayFlag::CullNonOpaque},
628
+ {" RAY_FLAG_SKIP_TRIANGLES" , (unsigned )DXIL::RayFlag::SkipTriangles},
629
+ {" RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES" ,
630
+ (unsigned )DXIL::RayFlag::SkipProceduralPrimitives},
631
+ {" RAY_FLAG_FORCE_OMM_2_STATE" , (unsigned )DXIL::RayFlag::ForceOMM2State,
632
+ ConstructAvailabilityAttribute (context, VT69)}});
633
+
634
+ AddTypedefPseudoEnum (
635
+ context, " RAYQUERY_FLAG" ,
636
+ {{" RAYQUERY_FLAG_NONE" , (unsigned )DXIL::RayQueryFlag::None},
637
+ {" RAYQUERY_FLAG_ALLOW_OPACITY_MICROMAPS" ,
638
+ (unsigned )DXIL::RayQueryFlag::AllowOpacityMicromaps,
639
+ ConstructAvailabilityAttribute (context, VT69)}});
615
640
616
641
AddTypedefPseudoEnum (
617
642
context, " COMMITTED_STATUS" ,
@@ -1161,7 +1186,14 @@ CXXRecordDecl *hlsl::DeclareRayQueryType(ASTContext &context) {
1161
1186
// template<uint kind> RayQuery { ... }
1162
1187
BuiltinTypeDeclBuilder typeDeclBuilder (context.getTranslationUnitDecl (),
1163
1188
" RayQuery" );
1164
- typeDeclBuilder.addIntegerTemplateParam (" flags" , context.UnsignedIntTy );
1189
+ typeDeclBuilder.addIntegerTemplateParam (" constRayFlags" ,
1190
+ context.UnsignedIntTy );
1191
+ // create an optional second template argument with default value
1192
+ // that contains the value of DXIL::RayFlag::None
1193
+ llvm::Optional<int64_t > DefaultRayQueryFlag =
1194
+ static_cast <int64_t >(DXIL::RayFlag::None);
1195
+ typeDeclBuilder.addIntegerTemplateParam (
1196
+ " RayQueryFlags" , context.UnsignedIntTy , DefaultRayQueryFlag);
1165
1197
typeDeclBuilder.startDefinition ();
1166
1198
typeDeclBuilder.addField (
1167
1199
" h" , context.UnsignedIntTy ); // Add an 'h' field to hold the handle.
@@ -1178,7 +1210,8 @@ CXXRecordDecl *hlsl::DeclareRayQueryType(ASTContext &context) {
1178
1210
context.DeclarationNames .getCXXConstructorName (canQualType), false ,
1179
1211
&pConstructorDecl, &pTypeSourceInfo);
1180
1212
typeDeclBuilder.getRecordDecl ()->addDecl (pConstructorDecl);
1181
-
1213
+ typeDeclBuilder.getRecordDecl ()->addAttr (
1214
+ HLSLRayQueryObjectAttr::CreateImplicit (context));
1182
1215
return typeDeclBuilder.getRecordDecl ();
1183
1216
}
1184
1217
0 commit comments