summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-07-11 14:46:12 -0700
committerTim Foley <tfoley@nvidia.com>2017-07-11 14:46:48 -0700
commit5d06d42bbcbf4983bd75f4dd19b89e792698cd14 (patch)
tree509f77ecb1c2ee3849e42e74f88ad44a46687d29 /source
parent88ccba175ee2c7a0748690395de9ce7defb466e1 (diff)
Bug fixes for resources-in-structs.
Diffstat (limited to 'source')
-rw-r--r--source/slang/emit.cpp12
-rw-r--r--source/slang/lower.cpp87
2 files changed, 65 insertions, 34 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index 309a356f4..0c39a98bd 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -2812,8 +2812,16 @@ struct EmitVisitor
// TODO(tfoley): technically have to apply substitution here too...
if (auto initExpr = declRef.getDecl()->Expr)
{
- Emit(" = ");
- EmitExpr(initExpr);
+ if (declRef.As<ParameterSyntaxNode>()
+ && context->shared->target == CodeGenTarget::GLSL)
+ {
+ // Don't emit default parameter values when lowering to GLSL
+ }
+ else
+ {
+ Emit(" = ");
+ EmitExpr(initExpr);
+ }
}
}
diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp
index ea83256a9..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;
}
@@ -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;
}