diff --git a/tools/clang/lib/AST/ASTContextHLSL.cpp b/tools/clang/lib/AST/ASTContextHLSL.cpp
index dcd3e89e9a..3748f8f8f8 100644
--- a/tools/clang/lib/AST/ASTContextHLSL.cpp
+++ b/tools/clang/lib/AST/ASTContextHLSL.cpp
@@ -699,6 +699,10 @@ void hlsl::AddRaytracingConstants(ASTContext &context) {
AddConstUInt(
context, StringRef("RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES"),
(unsigned)DXIL::RaytracingPipelineFlags::SkipProceduralPrimitives);
+ AddConstUInt(context, context.getTranslationUnitDecl(),
+ StringRef("RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS"),
+ (unsigned)DXIL::RaytracingPipelineFlags::AllowOpacityMicromaps,
+ ConstructAvailabilityAttribute(context, VT69));
}
/// Adds all constants and enums for sampler feedback
diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp
index ed727af149..c562ee8d52 100644
--- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp
+++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp
@@ -301,7 +301,8 @@ std::vector GetAllExportedFDecls(clang::Sema *self) {
}
void GatherGlobalsWithInitializers(
- DeclContext *DC, llvm::SmallVectorImpl &GlobalsWithInit) {
+ DeclContext *DC, llvm::SmallVectorImpl &GlobalsWithInit,
+ llvm::SmallVectorImpl &SubObjects) {
for (auto *D : DC->decls()) {
// Skip built-ins and function decls.
if (D->isImplicit() || isa(D))
@@ -310,11 +311,19 @@ void GatherGlobalsWithInitializers(
// Add if user-defined static or groupshared global with initializer.
if (VD->hasInit() && VD->hasGlobalStorage() &&
(VD->getStorageClass() == SC_Static ||
- VD->hasAttr()))
+ VD->hasAttr())) {
+ // Place subobjects in a separate collection.
+ if (const RecordType *RT = VD->getType()->getAs()) {
+ if (RT->getDecl()->hasAttr()) {
+ SubObjects.push_back(VD);
+ continue;
+ }
+ }
GlobalsWithInit.push_back(VD);
+ }
} else if (auto *DC = dyn_cast(D)) {
// Recurse into DeclContexts like namespace, cbuffer, class/struct, etc.
- GatherGlobalsWithInitializers(DC, GlobalsWithInit);
+ GatherGlobalsWithInitializers(DC, GlobalsWithInit, SubObjects);
}
}
}
@@ -592,14 +601,24 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) {
hlsl::ShaderModel::GetByName(self->getLangOpts().HLSLProfile.c_str());
llvm::SmallVector GlobalsWithInit;
- GatherGlobalsWithInitializers(self->getASTContext().getTranslationUnitDecl(),
- GlobalsWithInit);
-
+ llvm::SmallVector SubObjects;
std::set DiagnosedRecursiveDecls;
llvm::SmallPtrSet DiagnosedCalls;
llvm::SmallPtrSet DeclAvailabilityChecked;
llvm::SmallSet DiagnosedTypeLocs;
+ GatherGlobalsWithInitializers(self->getASTContext().getTranslationUnitDecl(),
+ GlobalsWithInit, SubObjects);
+
+ if (shaderModel->GetKind() == DXIL::ShaderKind::Library) {
+ DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid;
+ HLSLReachableDiagnoseVisitor Visitor(
+ self, shaderModel, shaderModel->GetKind(), NodeLaunchTy, nullptr,
+ DiagnosedCalls, DeclAvailabilityChecked, DiagnosedTypeLocs);
+ for (VarDecl *VD : SubObjects)
+ Visitor.TraverseDecl(VD);
+ }
+
// for each FDecl, check for recursion
for (FunctionDecl *FDecl : FDeclsToCheck) {
CallGraphWithRecurseGuard callGraph;
@@ -705,7 +724,6 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) {
<< PatchConstantFunctionReturnIdx;
}
}
-
DXIL::ShaderKind EntrySK = shaderModel->GetKind();
DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid;
if (EntrySK == DXIL::ShaderKind::Library) {
diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/raytracingpipelineconfig1.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/raytracingpipelineconfig1.hlsl
new file mode 100644
index 0000000000..44424f5d14
--- /dev/null
+++ b/tools/clang/test/HLSLFileCheck/d3dreflect/raytracingpipelineconfig1.hlsl
@@ -0,0 +1,19 @@
+// RUN: %dxilver 1.9 | %dxc -T lib_6_9 %s | FileCheck %s
+// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -ast-dump %s | FileCheck -check-prefix=AST %s
+// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -ast-dump-implicit %s | FileCheck -check-prefix=ASTIMPL %s
+
+
+// CHECK: ; RaytracingPipelineConfig1 rpc = { MaxTraceRecursionDepth = 32, Flags = RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS };
+
+// AST: TranslationUnitDecl 0x{{.+}} <>
+// AST-NEXT: VarDecl 0x{{.+}} rpc 'RaytracingPipelineConfig1' static cinit
+// AST-NEXT: InitListExpr 0x{{.+}} 'RaytracingPipelineConfig1'
+// AST-NEXT: ImplicitCastExpr 0x{{.+}} 'unsigned int'
+// AST-NEXT: IntegerLiteral 0x{{.+}} 'literal int' 32
+// AST-NEXT: ImplicitCastExpr 0x{{.+}} 'unsigned int'
+// AST-NEXT: DeclRefExpr 0x{{.+}} 'const unsigned int' lvalue Var 0x{{.+}} 'RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS' 'const unsigned int'
+// ASTIMPL: VarDecl 0x{{.+}} <> implicit referenced RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS 'const unsigned int' static cinit
+// ASTIMPL-NEXT: IntegerLiteral 0x{{.+}} <> 'const unsigned int' 1024
+// ASTIMPL-NEXT: AvailabilityAttr 0x{{.+}} <> Implicit 6.9 0 0 ""
+
+RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS };
diff --git a/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl b/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl
new file mode 100644
index 0000000000..c220f5734d
--- /dev/null
+++ b/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl
@@ -0,0 +1,6 @@
+// RUN: %dxc -T lib_6_8 -verify %s
+
+// expected-warning@+1{{potential misuse of built-in constant 'RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS' in shader model lib_6_8; introduced in shader model 6.9}}
+RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS };
+
+
diff --git a/tools/clang/tools/dxcompiler/dxcdisassembler.cpp b/tools/clang/tools/dxcompiler/dxcdisassembler.cpp
index 01f4973fbe..3af305d52a 100644
--- a/tools/clang/tools/dxcompiler/dxcdisassembler.cpp
+++ b/tools/clang/tools/dxcompiler/dxcdisassembler.cpp
@@ -671,6 +671,8 @@ static const char *FlagToString(DXIL::RaytracingPipelineFlags Flag) {
return "RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES";
case DXIL::RaytracingPipelineFlags::SkipProceduralPrimitives:
return "RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES";
+ case DXIL::RaytracingPipelineFlags::AllowOpacityMicromaps:
+ return "RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS";
}
return "";
}