1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2016 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SKSL_INTERFACEBLOCK 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SKSL_INTERFACEBLOCK 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSLProgramElement.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSLSymbolTable.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSLVarDeclarations.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace SkSL { 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * An interface block, as in: 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * out sk_PerVertex { 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * layout(builtin=0) float4 sk_Position; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * layout(builtin=1) float sk_PointSize; 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * }; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * At the IR level, this is represented by a single variable of struct type. 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct InterfaceBlock : public ProgramElement { 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot InterfaceBlock(int offset, const Variable* var, String typeName, String instanceName, 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot std::vector<std::unique_ptr<Expression>> sizes, 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot std::shared_ptr<SymbolTable> typeOwner) 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : INHERITED(offset, kInterfaceBlock_Kind) 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fVariable(*var) 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fTypeName(std::move(typeName)) 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fInstanceName(std::move(instanceName)) 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fSizes(std::move(sizes)) 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fTypeOwner(typeOwner) {} 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot String description() const override { 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot String result = fVariable.fModifiers.description() + fTypeName + " {\n"; 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const Type* structType = &fVariable.fType; 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot while (structType->kind() == Type::kArray_Kind) { 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot structType = &structType->componentType(); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (const auto& f : structType->fields()) { 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result += f.description() + "\n"; 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result += "}"; 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fInstanceName.size()) { 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result += " " + fInstanceName; 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (const auto& size : fSizes) { 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result += "["; 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (size) { 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result += size->description(); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result += "]"; 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return result + ";"; 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const Variable& fVariable; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const String fTypeName; 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const String fInstanceName; 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot std::vector<std::unique_ptr<Expression>> fSizes; 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const std::shared_ptr<SymbolTable> fTypeOwner; 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef ProgramElement INHERITED; 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} // namespace 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 73