diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-07-11 15:10:24 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-11 15:10:24 -0700 |
| commit | d8d8fefb9693e83bea215629f3a77f8a48d2f50f (patch) | |
| tree | 509f77ecb1c2ee3849e42e74f88ad44a46687d29 /source/slang/lower.cpp | |
| parent | fa48d2d59abb7e2e5f92ab1477e0700cb8a76680 (diff) | |
| parent | 5d06d42bbcbf4983bd75f4dd19b89e792698cd14 (diff) | |
Merge pull request #74 from tfoleyNV/resources-in-structs
Resources in structs
Diffstat (limited to 'source/slang/lower.cpp')
| -rw-r--r-- | source/slang/lower.cpp | 89 |
1 files changed, 56 insertions, 33 deletions
diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp index 4f1342075..ecf23d9ed 100644 --- a/source/slang/lower.cpp +++ b/source/slang/lower.cpp @@ -637,10 +637,10 @@ struct LoweringVisitor if (argTuple->primaryExpr) { addArgs(callExpr, argTuple->primaryExpr); - for (auto elem : argTuple->tupleElements) - { - addArgs(callExpr, elem.expr); - } + } + for (auto elem : argTuple->tupleElements) + { + addArgs(callExpr, elem.expr); } } else @@ -728,6 +728,7 @@ struct LoweringVisitor auto loweredDeclRef = translateDeclRef(expr->declRef); + // Are we extracting an element from a tuple? if (auto baseTuple = loweredBase.As<TupleExpr>()) { @@ -1517,6 +1518,11 @@ struct LoweringVisitor bool isResourceType(ExpressionType* type) { + while (auto arrayType = type->As<ArrayExpressionType>()) + { + type = arrayType->BaseType; + } + if (auto textureTypeBase = type->As<TextureTypeBase>()) { return true; @@ -1580,6 +1586,7 @@ struct LoweringVisitor continue; } + // If the field is of a type that requires special handling, // we need to make a note of it. auto loweredFieldType = loweredField->Type.type; @@ -1596,7 +1603,7 @@ struct LoweringVisitor hasAnyNonTupleFields = true; } } - if (isResourceType(loweredFieldType)) + else if (isResourceType(loweredFieldType)) { isTupleField = true; } @@ -1638,9 +1645,18 @@ struct LoweringVisitor addModifier(loweredDecl, tupleTypeMod); } - addMember( - shared->loweredProgram, - loweredDecl); + if (isResultATupleType && !hasAnyNonTupleFields) + { + // We don't want any pure-tuple types showing up in + // the output program, so we skip that here. + } + else + { + addMember( + shared->loweredProgram, + loweredDecl); + } + return loweredDecl; } @@ -1804,7 +1820,7 @@ struct LoweringVisitor makeDeclRef(fieldTupleTypeMod->decl), fieldInitExpr, fieldLayout, - getBodyStructTypeLayout(fieldLayout->typeLayout)); + getBodyStructTypeLayout(fieldLayout ? fieldLayout->typeLayout : nullptr)); fieldVarOrTupleDecl = fieldTupleDecl; } @@ -1934,7 +1950,7 @@ struct LoweringVisitor tupleTypeLayout); } - RefPtr<VarDeclBase> lowerVarDeclCommon( + RefPtr<VarDeclBase> lowerVarDeclCommonInner( VarDeclBase* decl, SyntaxClass<VarDeclBase> loweredDeclClass) { @@ -1964,7 +1980,7 @@ struct LoweringVisitor varLayout); shared->loweredDecls.Add(decl, tupleDecl); - return nullptr; + return tupleDecl; } if (auto bufferType = loweredType->As<UniformParameterBlockType>()) { @@ -1983,14 +1999,42 @@ struct LoweringVisitor varLayout); shared->loweredDecls.Add(decl, tupleDecl); - return nullptr; + return tupleDecl; } } RefPtr<VarDeclBase> loweredDecl = loweredDeclClass.createInstance(); + addDecl(loweredDecl); return lowerSimpleVarDeclCommon(loweredDecl, decl, loweredType); } + RefPtr<VarDeclBase> lowerVarDeclCommon( + VarDeclBase* decl, + SyntaxClass<VarDeclBase> loweredDeclClass) + { + // We need to add things to an appropriate scope, based on what + // we are referencing. + // + // If this is a global variable (program scope), then add it + // to the global scope. + RefPtr<ContainerDecl> pp = decl->ParentDecl; + if (auto parentModuleDecl = pp.As<ProgramSyntaxNode>()) + { + LoweringVisitor subVisitor = *this; + subVisitor.parentDecl = translateDeclRef(parentModuleDecl); + subVisitor.isBuildingStmt = false; + + return subVisitor.lowerVarDeclCommonInner(decl, loweredDeclClass); + } + // TODO: handle `static` function-scope variables + else + { + // The default behavior is to lower into whatever + // scope was already in places + return lowerVarDeclCommonInner(decl, loweredDeclClass); + } + } + SourceLanguage getSourceLanguage(ProgramSyntaxNode* moduleDecl) { for (auto translationUnit : shared->compileRequest->translationUnits) @@ -2015,26 +2059,6 @@ struct LoweringVisitor if(!loweredDecl) return nullptr; - // We need to add things to an appropriate scope, based on what - // we are referencing. - // - // If this is a global variable (program scope), then add it - // to the global scope. - RefPtr<ContainerDecl> pp = decl->ParentDecl; - if (auto parentModuleDecl = pp.As<ProgramSyntaxNode>()) - { - addMember( - translateDeclRef(parentModuleDecl), - loweredDecl); - } - // TODO: handle `static` function-scope variables - else - { - // A local variable declaration will get added to the - // statement scope we are currently processing. - addDecl(loweredDecl); - } - return loweredDecl; } @@ -2048,7 +2072,6 @@ struct LoweringVisitor ParameterSyntaxNode* decl) { auto loweredDecl = lowerVarDeclCommon(decl, getClass<ParameterSyntaxNode>()); - addDecl(loweredDecl); return loweredDecl; } |
