/*
|
* 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_ASTINTERFACEBLOCK
|
#define SKSL_ASTINTERFACEBLOCK
|
|
#include "SkSLASTVarDeclaration.h"
|
#include "../ir/SkSLModifiers.h"
|
|
namespace SkSL {
|
|
/**
|
* An interface block, as in:
|
*
|
* out sk_PerVertex {
|
* layout(builtin=0) float4 sk_Position;
|
* layout(builtin=1) float sk_PointSize;
|
* };
|
*/
|
struct ASTInterfaceBlock : public ASTDeclaration {
|
// valueName is empty when it was not present in the source
|
ASTInterfaceBlock(int offset,
|
Modifiers modifiers,
|
StringFragment typeName,
|
std::vector<std::unique_ptr<ASTVarDeclarations>> declarations,
|
StringFragment instanceName,
|
std::vector<std::unique_ptr<ASTExpression>> sizes)
|
: INHERITED(offset, kInterfaceBlock_Kind)
|
, fModifiers(modifiers)
|
, fTypeName(typeName)
|
, fDeclarations(std::move(declarations))
|
, fInstanceName(instanceName)
|
, fSizes(std::move(sizes)) {}
|
|
String description() const override {
|
String result = fModifiers.description() + fTypeName + " {\n";
|
for (size_t i = 0; i < fDeclarations.size(); i++) {
|
result += fDeclarations[i]->description() + "\n";
|
}
|
result += "}";
|
if (fInstanceName.fLength) {
|
result += " " + fInstanceName;
|
for (const auto& size : fSizes) {
|
result += "[";
|
if (size) {
|
result += size->description();
|
}
|
result += "]";
|
}
|
}
|
return result + ";";
|
}
|
|
const Modifiers fModifiers;
|
const StringFragment fTypeName;
|
const std::vector<std::unique_ptr<ASTVarDeclarations>> fDeclarations;
|
const StringFragment fInstanceName;
|
const std::vector<std::unique_ptr<ASTExpression>> fSizes;
|
|
typedef ASTDeclaration INHERITED;
|
};
|
|
} // namespace
|
|
#endif
|