blob: 17f180a727b7ab640f0c68eab8f808f017cc8105 [file] [log] [blame]
ethannicholasb3058bd2016-07-01 08:22:01 -07001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
Ethan Nicholas11d53972016-11-28 11:23:23 -05007
ethannicholasb3058bd2016-07-01 08:22:01 -07008#ifndef SKSL_ASTINTERFACEBLOCK
9#define SKSL_ASTINTERFACEBLOCK
10
11#include "SkSLASTVarDeclaration.h"
Ethan Nicholas11d53972016-11-28 11:23:23 -050012#include "../ir/SkSLModifiers.h"
ethannicholasb3058bd2016-07-01 08:22:01 -070013
14namespace SkSL {
15
16/**
17 * An interface block, as in:
18 *
Ethan Nicholasbed683a2017-09-26 14:23:59 -040019 * out sk_PerVertex {
20 * layout(builtin=0) float4 sk_Position;
21 * layout(builtin=1) float sk_PointSize;
ethannicholasb3058bd2016-07-01 08:22:01 -070022 * };
23 */
24struct ASTInterfaceBlock : public ASTDeclaration {
25 // valueName is empty when it was not present in the source
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070026 ASTInterfaceBlock(int offset,
Ethan Nicholas11d53972016-11-28 11:23:23 -050027 Modifiers modifiers,
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070028 StringFragment typeName,
Ethan Nicholas50afc172017-02-16 14:49:57 -050029 std::vector<std::unique_ptr<ASTVarDeclarations>> declarations,
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070030 StringFragment instanceName,
Ethan Nicholas50afc172017-02-16 14:49:57 -050031 std::vector<std::unique_ptr<ASTExpression>> sizes)
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070032 : INHERITED(offset, kInterfaceBlock_Kind)
ethannicholasb3058bd2016-07-01 08:22:01 -070033 , fModifiers(modifiers)
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070034 , fTypeName(typeName)
Ethan Nicholas50afc172017-02-16 14:49:57 -050035 , fDeclarations(std::move(declarations))
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070036 , fInstanceName(instanceName)
Ethan Nicholas50afc172017-02-16 14:49:57 -050037 , fSizes(std::move(sizes)) {}
ethannicholasb3058bd2016-07-01 08:22:01 -070038
Ethan Nicholas0df1b042017-03-31 13:56:23 -040039 String description() const override {
40 String result = fModifiers.description() + fTypeName + " {\n";
ethannicholasb3058bd2016-07-01 08:22:01 -070041 for (size_t i = 0; i < fDeclarations.size(); i++) {
42 result += fDeclarations[i]->description() + "\n";
43 }
44 result += "}";
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070045 if (fInstanceName.fLength) {
Ethan Nicholas50afc172017-02-16 14:49:57 -050046 result += " " + fInstanceName;
47 for (const auto& size : fSizes) {
48 result += "[";
49 if (size) {
50 result += size->description();
51 }
52 result += "]";
53 }
ethannicholasb3058bd2016-07-01 08:22:01 -070054 }
55 return result + ";";
56 }
57
Ethan Nicholas11d53972016-11-28 11:23:23 -050058 const Modifiers fModifiers;
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070059 const StringFragment fTypeName;
ethannicholas14fe8cc2016-09-07 13:37:16 -070060 const std::vector<std::unique_ptr<ASTVarDeclarations>> fDeclarations;
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070061 const StringFragment fInstanceName;
Ethan Nicholas50afc172017-02-16 14:49:57 -050062 const std::vector<std::unique_ptr<ASTExpression>> fSizes;
ethannicholasb3058bd2016-07-01 08:22:01 -070063
64 typedef ASTDeclaration INHERITED;
65};
66
67} // namespace
68
69#endif