/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SKSL_INTERFACEBLOCK #define SKSL_INTERFACEBLOCK #include "SkSLProgramElement.h" #include "SkSLVarDeclaration.h" namespace SkSL { /** * An interface block, as in: * * out gl_PerVertex { * layout(builtin=0) vec4 gl_Position; * layout(builtin=1) float gl_PointSize; * }; * * At the IR level, this is represented by a single variable of struct type. */ struct InterfaceBlock : public ProgramElement { InterfaceBlock(Position position, const Variable& var, std::shared_ptr typeOwner) : INHERITED(position, kInterfaceBlock_Kind) , fVariable(std::move(var)) , fTypeOwner(typeOwner) { ASSERT(fVariable.fType.kind() == Type::kStruct_Kind); } std::string description() const override { std::string result = fVariable.fModifiers.description() + fVariable.fName + " {\n"; for (size_t i = 0; i < fVariable.fType.fields().size(); i++) { result += fVariable.fType.fields()[i].description() + "\n"; } result += "};"; return result; } const Variable& fVariable; const std::shared_ptr fTypeOwner; typedef ProgramElement INHERITED; }; } // namespace #endif