From 20aac944ed3d5ab2af89ee0425af06768253fdbd Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Tue, 11 Jul 2017 12:33:15 -0700 Subject: Bug fix for lowering of tuple types without layout. - Don't try to extract the body layout for a field without a layout --- source/slang/lower.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp index 4f1342075..ea83256a9 100644 --- a/source/slang/lower.cpp +++ b/source/slang/lower.cpp @@ -1804,7 +1804,7 @@ struct LoweringVisitor makeDeclRef(fieldTupleTypeMod->decl), fieldInitExpr, fieldLayout, - getBodyStructTypeLayout(fieldLayout->typeLayout)); + getBodyStructTypeLayout(fieldLayout ? fieldLayout->typeLayout : nullptr)); fieldVarOrTupleDecl = fieldTupleDecl; } -- cgit v1.2.3 From 88ccba175ee2c7a0748690395de9ce7defb466e1 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Tue, 11 Jul 2017 13:08:42 -0700 Subject: Add GLSL lowerings for `ddx*` and `ddy*` --- source/slang/slang-stdlib.cpp | 90 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 18 deletions(-) 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 __intrinsic vector cross(vector __intrinsic int4 D3DCOLORtoUBYTE4(float4 x); // Partial-difference derivatives -__generic __intrinsic T ddx(T x); -__generic __intrinsic vector ddx(vector x); -__generic __intrinsic matrix ddx(matrix x); +__generic +__intrinsic(glsl, dFdx) +__intrinsic +T ddx(T x); +__generic +__intrinsic(glsl, dFdx) +__intrinsic +vector ddx(vector x); +__generic +__intrinsic(glsl, dFdx) +__intrinsic +matrix ddx(matrix x); -__generic __intrinsic T ddx_coarse(T x); -__generic __intrinsic vector ddx_coarse(vector x); -__generic __intrinsic matrix ddx_coarse(matrix x); +__generic +__intrinsic(glsl, dFdxCoarse) +__intrinsic +T ddx_coarse(T x); +__generic +__intrinsic(glsl, dFdxCoarse) +__intrinsic +vector ddx_coarse(vector x); +__generic +__intrinsic(glsl, dFdxCoarse) +__intrinsic +matrix ddx_coarse(matrix x); -__generic __intrinsic T ddx_fine(T x); -__generic __intrinsic vector ddx_fine(vector x); -__generic __intrinsic matrix ddx_fine(matrix x); +__generic +__intrinsic(glsl, dFdxFine) +__intrinsic +T ddx_fine(T x); +__generic +__intrinsic(glsl, dFdxFine) +__intrinsic +vector ddx_fine(vector x); +__generic +__intrinsic(glsl, dFdxFine) +__intrinsic +matrix ddx_fine(matrix x); -__generic __intrinsic T ddy(T x); -__generic __intrinsic vector ddy(vector x); -__generic __intrinsic matrix ddy(matrix x); +__generic +__intrinsic(glsl, dFdy) +__intrinsic +T ddy(T x); +__generic +__intrinsic(glsl, dFdy) +__intrinsic +vector ddy(vector x); +__generic +__intrinsic(glsl, dFdy) +__intrinsic + matrix ddy(matrix x); -__generic __intrinsic T ddy_coarse(T x); -__generic __intrinsic vector ddy_coarse(vector x); -__generic __intrinsic matrix ddy_coarse(matrix x); +__generic +__intrinsic(glsl, dFdyCoarse) +__intrinsic +T ddy_coarse(T x); +__generic +__intrinsic(glsl, dFdyCoarse) +__intrinsic +vector ddy_coarse(vector x); +__generic +__intrinsic(glsl, dFdyCoarse) +__intrinsic +matrix ddy_coarse(matrix x); -__generic __intrinsic T ddy_fine(T x); -__generic __intrinsic vector ddy_fine(vector x); -__generic __intrinsic matrix ddy_fine(matrix x); +__generic +__intrinsic(glsl, dFdyFine) +__intrinsic +T ddy_fine(T x); +__generic +__intrinsic(glsl, dFdyFine) +__intrinsic +vector ddy_fine(vector x); +__generic +__intrinsic(glsl, dFdyFine) +__intrinsic +matrix ddy_fine(matrix x); // Radians to degrees -- cgit v1.2.3 From 5d06d42bbcbf4983bd75f4dd19b89e792698cd14 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Tue, 11 Jul 2017 14:46:12 -0700 Subject: Bug fixes for resources-in-structs. --- source/slang/emit.cpp | 12 +++++-- source/slang/lower.cpp | 87 +++++++++++++++++++++++++++++++------------------- 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() + && 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()) { @@ -1517,6 +1518,11 @@ struct LoweringVisitor bool isResourceType(ExpressionType* type) { + while (auto arrayType = type->As()) + { + type = arrayType->BaseType; + } + if (auto textureTypeBase = type->As()) { 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 lowerVarDeclCommon( + RefPtr lowerVarDeclCommonInner( VarDeclBase* decl, SyntaxClass loweredDeclClass) { @@ -1964,7 +1980,7 @@ struct LoweringVisitor varLayout); shared->loweredDecls.Add(decl, tupleDecl); - return nullptr; + return tupleDecl; } if (auto bufferType = loweredType->As()) { @@ -1983,14 +1999,42 @@ struct LoweringVisitor varLayout); shared->loweredDecls.Add(decl, tupleDecl); - return nullptr; + return tupleDecl; } } RefPtr loweredDecl = loweredDeclClass.createInstance(); + addDecl(loweredDecl); return lowerSimpleVarDeclCommon(loweredDecl, decl, loweredType); } + RefPtr lowerVarDeclCommon( + VarDeclBase* decl, + SyntaxClass 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 pp = decl->ParentDecl; + if (auto parentModuleDecl = pp.As()) + { + 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 pp = decl->ParentDecl; - if (auto parentModuleDecl = pp.As()) - { - 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()); - addDecl(loweredDecl); return loweredDecl; } -- cgit v1.2.3