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