From bd7105ff8683a680d1270eca8cd74f9002144dbd Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Mon, 10 Jul 2017 15:40:42 -0700 Subject: Initial work on handling resources in structs during cross-compilation - The basic idea is that during the "lowering" pass, some types (notably: aggregate types that contain resource variables) will get turned into "tuple" types, which are pseduo-types that aren't meant to survive lowering. - An attempt to declare a variable with a tuple type expands into a tuple of declarations - An attempt to reference such a tuple-ified variable leads to a tuple of expressions - An attempt to extract a member from such a tuple expression will pick the appropriate sub-element - Dereference a tuple by dereferencing the primary expression - Expand a tuple in the argument list to a call into N arguments (by recursively flattening the tuple) - Don't create tuple types when not generating GLSL - Make sure to preserve the specialized type of a call expression through lowering, since emission of unchecked calls relies on that info. - TODO: maybe the infix/prefix/postifx/select information should come in as a side-band? Should we have modifiers on expressions? - Make sure to offset the layout for a nested field based on teh base offset of its parent variable, when generating declarations for nested fields --- source/slang/emit.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'source/slang/emit.cpp') diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index b2366f564..309a356f4 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -1816,9 +1816,9 @@ struct EmitVisitor // Try to find a suitable sampler-type shader parameter in the global scope // (fingers crossed) RefPtr samplerVar; - for (auto d : context->shared->program->Members) + for (auto dd : context->shared->program->Members) { - if (auto varDecl = d.As()) + if (auto varDecl = dd.As()) { if (auto samplerType = varDecl->Type.type->As()) { @@ -3203,6 +3203,14 @@ struct EmitVisitor void visitVarDeclBase(RefPtr decl, DeclEmitArg const& arg) { + // Skip fields that have been tuple-ified and don't contribute + // any fields of "ordinary" type. + if (auto tupleFieldMod = decl->FindModifier()) + { + if (!tupleFieldMod->hasAnyNonTupleFields) + return; + } + RefPtr layout = arg.layout; layout = maybeFetchLayout(decl, layout); -- cgit v1.2.3