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 | |
| parent | fa48d2d59abb7e2e5f92ab1477e0700cb8a76680 (diff) | |
| parent | 5d06d42bbcbf4983bd75f4dd19b89e792698cd14 (diff) | |
Merge pull request #74 from tfoleyNV/resources-in-structs
Resources in structs
| -rw-r--r-- | source/slang/emit.cpp | 12 | ||||
| -rw-r--r-- | source/slang/lower.cpp | 89 | ||||
| -rw-r--r-- | source/slang/slang-stdlib.cpp | 90 |
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 |
