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 ""; }