diff options
Diffstat (limited to 'source/slang/lower.cpp')
| -rw-r--r-- | source/slang/lower.cpp | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp index ecf23d9ed..02da47ccb 100644 --- a/source/slang/lower.cpp +++ b/source/slang/lower.cpp @@ -210,7 +210,8 @@ struct SharedLoweringContext { CompileRequest* compileRequest; - ProgramLayout* programLayout; + ProgramLayout* programLayout; + EntryPointLayout* entryPointLayout; // The target we are going to generate code for. // @@ -607,6 +608,8 @@ struct LoweringVisitor RefPtr<ExpressionSyntaxNode> visitVarExpressionSyntaxNode( VarExpressionSyntaxNode* expr) { + doSampleRateInputCheck(expr->name); + // If the expression didn't get resolved, we can leave it as-is if (!expr->declRef) return expr; @@ -1019,6 +1022,12 @@ struct LoweringVisitor RefPtr<UnparsedStmt> loweredStmt = new UnparsedStmt(); lowerStmtFields(loweredStmt, stmt); + for (auto token : stmt->tokens) + { + if (token.Type == TokenType::Identifier) + doSampleRateInputCheck(token.Content); + } + loweredStmt->tokens = stmt->tokens; addStmt(loweredStmt); @@ -2052,9 +2061,39 @@ struct LoweringVisitor return SourceLanguage::Unknown; } + void setSampleRateFlag() + { + shared->entryPointLayout->flags |= EntryPointLayout::Flag::usesAnySampleRateInput; + } + + void doSampleRateInputCheck(VarDeclBase* decl) + { + if (decl->HasModifier<HLSLSampleModifier>()) + { + setSampleRateFlag(); + } + } + + void doSampleRateInputCheck(String const& name) + { + if (name == "gl_SampleIndex") + { + setSampleRateFlag(); + } + } + RefPtr<VarDeclBase> visitVariable( Variable* decl) { + // Global variable? Check if it is a sample-rate input. + if (dynamic_cast<ProgramSyntaxNode*>(decl->ParentDecl)) + { + if (decl->HasModifier<InModifier>()) + { + doSampleRateInputCheck(decl); + } + } + auto loweredDecl = lowerVarDeclCommon(decl, getClass<Variable>()); if(!loweredDecl) return nullptr; @@ -2905,6 +2944,8 @@ LoweredEntryPoint lowerEntryPoint( bool isRewrite = isRewriteRequest(translationUnit->sourceLanguage, target); sharedContext.isRewrite = isRewrite; + sharedContext.entryPointLayout = visitor.findEntryPointLayout(entryPoint); + LoweredEntryPoint result; if (isRewrite) { |
