summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-07-11 15:10:24 -0700
committerGitHub <noreply@github.com>2017-07-11 15:10:24 -0700
commitd8d8fefb9693e83bea215629f3a77f8a48d2f50f (patch)
tree509f77ecb1c2ee3849e42e74f88ad44a46687d29
parentfa48d2d59abb7e2e5f92ab1477e0700cb8a76680 (diff)
parent5d06d42bbcbf4983bd75f4dd19b89e792698cd14 (diff)
Merge pull request #74 from tfoleyNV/resources-in-structs
Resources in structs
-rw-r--r--source/slang/emit.cpp12
-rw-r--r--source/slang/lower.cpp89
-rw-r--r--source/slang/slang-stdlib.cpp90
3 files changed, 138 insertions, 53 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 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;
}
diff --git a/source/slang/slang-stdlib.cpp b/source/slang/slang-stdlib.cpp
index 09958ddab..bcc87b201 100644
--- a/source/slang/slang-stdlib.cpp
+++ b/source/slang/slang-stdlib.cpp
@@ -399,29 +399,83 @@ __generic<T : __BuiltinArithmeticType> __intrinsic vector<T,3> cross(vector<T,3>
__intrinsic int4 D3DCOLORtoUBYTE4(float4 x);
// Partial-difference derivatives
-__generic<T : __BuiltinFloatingPointType> __intrinsic T ddx(T x);
-__generic<T : __BuiltinFloatingPointType, let N : int> __intrinsic vector<T,N> ddx(vector<T,N> x);
-__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> __intrinsic matrix<T,N,M> ddx(matrix<T,N,M> x);
+__generic<T : __BuiltinFloatingPointType>
+__intrinsic(glsl, dFdx)
+__intrinsic
+T ddx(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__intrinsic(glsl, dFdx)
+__intrinsic
+vector<T,N> ddx(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__intrinsic(glsl, dFdx)
+__intrinsic
+matrix<T,N,M> ddx(matrix<T,N,M> x);
-__generic<T : __BuiltinFloatingPointType> __intrinsic T ddx_coarse(T x);
-__generic<T : __BuiltinFloatingPointType, let N : int> __intrinsic vector<T,N> ddx_coarse(vector<T,N> x);
-__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> __intrinsic matrix<T,N,M> ddx_coarse(matrix<T,N,M> x);
+__generic<T : __BuiltinFloatingPointType>
+__intrinsic(glsl, dFdxCoarse)
+__intrinsic
+T ddx_coarse(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__intrinsic(glsl, dFdxCoarse)
+__intrinsic
+vector<T,N> ddx_coarse(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__intrinsic(glsl, dFdxCoarse)
+__intrinsic
+matrix<T,N,M> ddx_coarse(matrix<T,N,M> x);
-__generic<T : __BuiltinFloatingPointType> __intrinsic T ddx_fine(T x);
-__generic<T : __BuiltinFloatingPointType, let N : int> __intrinsic vector<T,N> ddx_fine(vector<T,N> x);
-__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> __intrinsic matrix<T,N,M> ddx_fine(matrix<T,N,M> x);
+__generic<T : __BuiltinFloatingPointType>
+__intrinsic(glsl, dFdxFine)
+__intrinsic
+T ddx_fine(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__intrinsic(glsl, dFdxFine)
+__intrinsic
+vector<T,N> ddx_fine(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__intrinsic(glsl, dFdxFine)
+__intrinsic
+matrix<T,N,M> ddx_fine(matrix<T,N,M> x);
-__generic<T : __BuiltinFloatingPointType> __intrinsic T ddy(T x);
-__generic<T : __BuiltinFloatingPointType, let N : int> __intrinsic vector<T,N> ddy(vector<T,N> x);
-__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> __intrinsic matrix<T,N,M> ddy(matrix<T,N,M> x);
+__generic<T : __BuiltinFloatingPointType>
+__intrinsic(glsl, dFdy)
+__intrinsic
+T ddy(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__intrinsic(glsl, dFdy)
+__intrinsic
+vector<T,N> ddy(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__intrinsic(glsl, dFdy)
+__intrinsic
+ matrix<T,N,M> ddy(matrix<T,N,M> x);
-__generic<T : __BuiltinFloatingPointType> __intrinsic T ddy_coarse(T x);
-__generic<T : __BuiltinFloatingPointType, let N : int> __intrinsic vector<T,N> ddy_coarse(vector<T,N> x);
-__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> __intrinsic matrix<T,N,M> ddy_coarse(matrix<T,N,M> x);
+__generic<T : __BuiltinFloatingPointType>
+__intrinsic(glsl, dFdyCoarse)
+__intrinsic
+T ddy_coarse(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__intrinsic(glsl, dFdyCoarse)
+__intrinsic
+vector<T,N> ddy_coarse(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__intrinsic(glsl, dFdyCoarse)
+__intrinsic
+matrix<T,N,M> ddy_coarse(matrix<T,N,M> x);
-__generic<T : __BuiltinFloatingPointType> __intrinsic T ddy_fine(T x);
-__generic<T : __BuiltinFloatingPointType, let N : int> __intrinsic vector<T,N> ddy_fine(vector<T,N> x);
-__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> __intrinsic matrix<T,N,M> ddy_fine(matrix<T,N,M> x);
+__generic<T : __BuiltinFloatingPointType>
+__intrinsic(glsl, dFdyFine)
+__intrinsic
+T ddy_fine(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__intrinsic(glsl, dFdyFine)
+__intrinsic
+vector<T,N> ddy_fine(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__intrinsic(glsl, dFdyFine)
+__intrinsic
+matrix<T,N,M> ddy_fine(matrix<T,N,M> x);
// Radians to degrees