xref: /third_party/skia/src/gpu/GrShaderVar.h (revision cb93a386)
1/*
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 */
7
8#ifndef GrShaderVar_DEFINED
9#define GrShaderVar_DEFINED
10
11#include "include/core/SkString.h"
12#include "include/private/GrTypesPriv.h"
13
14class GrShaderCaps;
15
16/**
17 * Represents a variable in a shader
18 */
19class GrShaderVar {
20public:
21    enum class TypeModifier {
22        None,
23        Out,
24        In,
25        InOut,
26        Uniform,
27    };
28
29    /** Values for array count that have special meaning. We allow 1-sized arrays. */
30    enum {
31        kNonArray     =  0, // not an array
32    };
33
34    /** Defaults to a void with no type modifier or layout qualifier. */
35    GrShaderVar()
36            : fType(kVoid_GrSLType)
37            , fTypeModifier(TypeModifier::None)
38            , fCount(kNonArray) {}
39
40    GrShaderVar(SkString name, GrSLType type, int arrayCount = kNonArray)
41            : fType(type)
42            , fTypeModifier(TypeModifier::None)
43            , fCount(arrayCount)
44            , fName(std::move(name)) {}
45    GrShaderVar(const char* name, GrSLType type, int arrayCount = kNonArray)
46        : GrShaderVar(SkString(name), type, arrayCount) {}
47
48    GrShaderVar(SkString name, GrSLType type, TypeModifier typeModifier)
49            : fType(type)
50            , fTypeModifier(typeModifier)
51            , fCount(kNonArray)
52            , fName(std::move(name)) {}
53    GrShaderVar(const char* name, GrSLType type, TypeModifier typeModifier)
54        : GrShaderVar(SkString(name), type, typeModifier) {}
55
56    GrShaderVar(SkString name, GrSLType type, TypeModifier typeModifier, int arrayCount)
57            : fType(type)
58            , fTypeModifier(typeModifier)
59            , fCount(arrayCount)
60            , fName(std::move(name)) {}
61
62    GrShaderVar(SkString name, GrSLType type, TypeModifier typeModifier, int arrayCount,
63                SkString layoutQualifier, SkString extraModifier)
64            : fType(type)
65            , fTypeModifier(typeModifier)
66            , fCount(arrayCount)
67            , fName(std::move(name))
68            , fLayoutQualifier(std::move(layoutQualifier))
69            , fExtraModifiers(std::move(extraModifier)) {}
70
71    GrShaderVar(const GrShaderVar&) = default;
72    GrShaderVar& operator=(const GrShaderVar&) = default;
73    GrShaderVar(GrShaderVar&&) = default;
74    GrShaderVar& operator=(GrShaderVar&&) = default;
75
76    /** Sets as a non-array. */
77    void set(GrSLType type,
78             const char* name) {
79        SkASSERT(kVoid_GrSLType != type);
80        fType = type;
81        fName = name;
82    }
83
84    /** Is the var an array. */
85    bool isArray() const { return kNonArray != fCount; }
86
87    /** Get the array length. */
88    int getArrayCount() const { return fCount; }
89
90    /** Get the name. */
91    const SkString& getName() const { return fName; }
92
93    /** Shortcut for this->getName().c_str(); */
94    const char* c_str() const { return this->getName().c_str(); }
95
96    /** Get the type. */
97    GrSLType getType() const { return fType; }
98
99    TypeModifier getTypeModifier() const { return fTypeModifier; }
100    void setTypeModifier(TypeModifier type) { fTypeModifier = type; }
101
102    /** Appends to the layout qualifier. */
103    void addLayoutQualifier(const char* layoutQualifier) {
104        if (!layoutQualifier || !strlen(layoutQualifier)) {
105            return;
106        }
107        if (fLayoutQualifier.isEmpty()) {
108            fLayoutQualifier = layoutQualifier;
109        } else {
110            fLayoutQualifier.appendf(", %s", layoutQualifier);
111        }
112    }
113
114    /** Appends to the modifiers. */
115    void addModifier(const char* modifier) {
116        if (!modifier || !strlen(modifier)) {
117            return;
118        }
119        if (fExtraModifiers.isEmpty()) {
120            fExtraModifiers = modifier;
121        } else {
122            fExtraModifiers.appendf(" %s", modifier);
123        }
124    }
125
126    /** Write a declaration of this variable to out. */
127    void appendDecl(const GrShaderCaps*, SkString* out) const;
128
129private:
130    GrSLType        fType;
131    TypeModifier    fTypeModifier;
132    int             fCount;
133
134    SkString        fName;
135    SkString        fLayoutQualifier;
136    SkString        fExtraModifiers;
137};
138
139#endif
140