@@ -545,10 +545,19 @@ hlsl::DeclareRecordTypeWithHandle(ASTContext &context, StringRef name,
545545 return typeDeclBuilder.getRecordDecl ();
546546}
547547
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+
548556// creates a global static constant unsigned integer with value.
549557// equivalent to: static const uint name = val;
550558static void AddConstUInt (clang::ASTContext &context, DeclContext *DC,
551- StringRef name, unsigned val) {
559+ StringRef name, unsigned val,
560+ AvailabilityAttr *AAttr = nullptr ) {
552561 IdentifierInfo &Id = context.Idents .get (name, tok::TokenKind::identifier);
553562 QualType type = context.getConstType (context.UnsignedIntTy );
554563 VarDecl *varDecl = VarDecl::Create (context, DC, NoLoc, NoLoc, &Id, type,
@@ -558,6 +567,9 @@ static void AddConstUInt(clang::ASTContext &context, DeclContext *DC,
558567 context, llvm::APInt (context.getIntWidth (type), val), type, NoLoc);
559568 varDecl->setInit (exprVal);
560569 varDecl->setImplicit (true );
570+ if (AAttr)
571+ varDecl->addAttr (AAttr);
572+
561573 DC->addDecl (varDecl);
562574}
563575
@@ -570,6 +582,7 @@ static void AddConstUInt(clang::ASTContext &context, StringRef name,
570582struct Enumerant {
571583 StringRef name;
572584 unsigned value;
585+ AvailabilityAttr *avail = nullptr ;
573586};
574587
575588static void AddTypedefPseudoEnum (ASTContext &context, StringRef name,
@@ -585,33 +598,45 @@ static void AddTypedefPseudoEnum(ASTContext &context, StringRef name,
585598 enumDecl->setImplicit (true );
586599 // static const uint <enumerant.name> = <enumerant.value>;
587600 for (const Enumerant &enumerant : enumerants) {
588- AddConstUInt (context, curDC, enumerant.name , enumerant.value );
601+ AddConstUInt (context, curDC, enumerant.name , enumerant.value ,
602+ enumerant.avail );
589603 }
590604}
591605
592606// / <summary> Adds all constants and enums for ray tracing </summary>
593607void 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+
594613 AddTypedefPseudoEnum (
595614 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)}});
615640
616641 AddTypedefPseudoEnum (
617642 context, " COMMITTED_STATUS" ,
@@ -1161,7 +1186,14 @@ CXXRecordDecl *hlsl::DeclareRayQueryType(ASTContext &context) {
11611186 // template<uint kind> RayQuery { ... }
11621187 BuiltinTypeDeclBuilder typeDeclBuilder (context.getTranslationUnitDecl (),
11631188 " 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);
11651197 typeDeclBuilder.startDefinition ();
11661198 typeDeclBuilder.addField (
11671199 " h" , context.UnsignedIntTy ); // Add an 'h' field to hold the handle.
@@ -1178,7 +1210,8 @@ CXXRecordDecl *hlsl::DeclareRayQueryType(ASTContext &context) {
11781210 context.DeclarationNames .getCXXConstructorName (canQualType), false ,
11791211 &pConstructorDecl, &pTypeSourceInfo);
11801212 typeDeclBuilder.getRecordDecl ()->addDecl (pConstructorDecl);
1181-
1213+ typeDeclBuilder.getRecordDecl ()->addAttr (
1214+ HLSLRayQueryObjectAttr::CreateImplicit (context));
11821215 return typeDeclBuilder.getRecordDecl ();
11831216}
11841217
0 commit comments