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