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_VARIABLE 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SKSL_VARIABLE 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSLModifiers.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSLPosition.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSLSymbol.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSLType.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace SkSL { 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct Expression; 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Represents a variable, whether local, global, or a function parameter. This represents the 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * variable itself (the storage location), which is shared between all VariableReferences which 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * read or write that storage location. 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct Variable : public Symbol { 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum Storage { 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kGlobal_Storage, 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kLocal_Storage, 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kParameter_Storage 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot Variable(int offset, Modifiers modifiers, StringFragment name, const Type& type, 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot Storage storage, Expression* initialValue = nullptr) 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : INHERITED(offset, kVariable_Kind, name) 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fModifiers(modifiers) 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fType(type) 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fStorage(storage) 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fInitialValue(initialValue) 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fReadCount(0) 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fWriteCount(0) {} 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual String description() const override { 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fModifiers.description() + fType.fName + " " + fName; 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool dead() const { 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return !fWriteCount || (!fReadCount && !(fModifiers.fFlags & Modifiers::kOut_Flag)); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot mutable Modifiers fModifiers; 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const Type& fType; 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const Storage fStorage; 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot Expression* fInitialValue = nullptr; 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Tracks how many sites read from the variable. If this is zero for a non-out variable (or 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // becomes zero during optimization), the variable is dead and may be eliminated. 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot mutable int fReadCount; 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Tracks how many sites write to the variable. If this is zero, the variable is dead and may be 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // eliminated. 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot mutable int fWriteCount; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Symbol INHERITED; 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} // namespace SkSL 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 69