• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // ShaderInterfaceVariableInfoMap.cpp:
7 //    Implements helper class for shader compilers
8 //
9 
10 #include "libANGLE/renderer/ShaderInterfaceVariableInfoMap.h"
11 namespace rx
12 {
13 
ShaderInterfaceVariableInfo()14 ShaderInterfaceVariableInfo::ShaderInterfaceVariableInfo() {}
15 
16 // ShaderInterfaceVariableInfoMap implementation.
17 ShaderInterfaceVariableInfoMap::ShaderInterfaceVariableInfoMap() = default;
18 
19 ShaderInterfaceVariableInfoMap::~ShaderInterfaceVariableInfoMap() = default;
20 
clear()21 void ShaderInterfaceVariableInfoMap::clear()
22 {
23     for (gl::ShaderType shaderType : gl::AllShaderTypes())
24     {
25         for (ShaderVariableType variableType : angle::AllEnums<ShaderVariableType>())
26         {
27             mData[shaderType][variableType].clear();
28             mIndexedResourceIndexMap[shaderType][variableType].clear();
29         }
30         mNameToTypeAndIndexMap[shaderType].clear();
31     }
32 }
33 
load(const gl::ShaderMap<VariableTypeToInfoMap> & data,const gl::ShaderMap<NameToTypeAndIndexMap> & nameToTypeAndIndexMap,const gl::ShaderMap<VariableTypeToIndexMap> & indexedResourceIndexMap)34 void ShaderInterfaceVariableInfoMap::load(
35     const gl::ShaderMap<VariableTypeToInfoMap> &data,
36     const gl::ShaderMap<NameToTypeAndIndexMap> &nameToTypeAndIndexMap,
37     const gl::ShaderMap<VariableTypeToIndexMap> &indexedResourceIndexMap)
38 {
39     mData                    = data;
40     mNameToTypeAndIndexMap   = nameToTypeAndIndexMap;
41     mIndexedResourceIndexMap = indexedResourceIndexMap;
42 }
43 
setActiveStages(gl::ShaderType shaderType,ShaderVariableType variableType,const std::string & variableName,gl::ShaderBitSet activeStages)44 void ShaderInterfaceVariableInfoMap::setActiveStages(gl::ShaderType shaderType,
45                                                      ShaderVariableType variableType,
46                                                      const std::string &variableName,
47                                                      gl::ShaderBitSet activeStages)
48 {
49     ASSERT(hasVariable(shaderType, variableName));
50     uint32_t index = mNameToTypeAndIndexMap[shaderType][variableName].index;
51     mData[shaderType][variableType][index].activeStages = activeStages;
52 }
53 
getMutable(gl::ShaderType shaderType,ShaderVariableType variableType,const std::string & variableName)54 ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::getMutable(
55     gl::ShaderType shaderType,
56     ShaderVariableType variableType,
57     const std::string &variableName)
58 {
59     ASSERT(hasVariable(shaderType, variableName));
60     uint32_t index = mNameToTypeAndIndexMap[shaderType][variableName].index;
61     return mData[shaderType][variableType][index];
62 }
63 
markAsDuplicate(gl::ShaderType shaderType,ShaderVariableType variableType,const std::string & variableName)64 void ShaderInterfaceVariableInfoMap::markAsDuplicate(gl::ShaderType shaderType,
65                                                      ShaderVariableType variableType,
66                                                      const std::string &variableName)
67 {
68     ASSERT(hasVariable(shaderType, variableName));
69     uint32_t index = mNameToTypeAndIndexMap[shaderType][variableName].index;
70     mData[shaderType][variableType][index].isDuplicate = true;
71 }
72 
add(gl::ShaderType shaderType,ShaderVariableType variableType,const std::string & variableName)73 ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::add(gl::ShaderType shaderType,
74                                                                  ShaderVariableType variableType,
75                                                                  const std::string &variableName)
76 {
77     ASSERT(!hasVariable(shaderType, variableName));
78     uint32_t index = static_cast<uint32_t>(mData[shaderType][variableType].size());
79     mNameToTypeAndIndexMap[shaderType][variableName] = {variableType, index};
80     mData[shaderType][variableType].resize(index + 1);
81     return mData[shaderType][variableType][index];
82 }
83 
addOrGet(gl::ShaderType shaderType,ShaderVariableType variableType,const std::string & variableName)84 ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::addOrGet(
85     gl::ShaderType shaderType,
86     ShaderVariableType variableType,
87     const std::string &variableName)
88 {
89     if (!hasVariable(shaderType, variableName))
90     {
91         return add(shaderType, variableType, variableName);
92     }
93     else
94     {
95         uint32_t index = mNameToTypeAndIndexMap[shaderType][variableName].index;
96         return mData[shaderType][variableType][index];
97     }
98 }
99 
hasVariable(gl::ShaderType shaderType,const std::string & variableName) const100 bool ShaderInterfaceVariableInfoMap::hasVariable(gl::ShaderType shaderType,
101                                                  const std::string &variableName) const
102 {
103     auto iter = mNameToTypeAndIndexMap[shaderType].find(variableName);
104     return (iter != mNameToTypeAndIndexMap[shaderType].end());
105 }
106 
getVariableByName(gl::ShaderType shaderType,const std::string & variableName) const107 const ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::getVariableByName(
108     gl::ShaderType shaderType,
109     const std::string &variableName) const
110 {
111     auto iter = mNameToTypeAndIndexMap[shaderType].find(variableName);
112     ASSERT(iter != mNameToTypeAndIndexMap[shaderType].end());
113     TypeAndIndex typeAndIndex = iter->second;
114     return mData[shaderType][typeAndIndex.variableType][typeAndIndex.index];
115 }
116 
hasTransformFeedbackInfo(gl::ShaderType shaderType,uint32_t bufferIndex) const117 bool ShaderInterfaceVariableInfoMap::hasTransformFeedbackInfo(gl::ShaderType shaderType,
118                                                               uint32_t bufferIndex) const
119 {
120     std::string bufferName = rx::GetXfbBufferName(bufferIndex);
121     return hasVariable(shaderType, bufferName);
122 }
123 
mapIndexedResourceByName(gl::ShaderType shaderType,ShaderVariableType variableType,uint32_t resourceIndex,const std::string & variableName)124 void ShaderInterfaceVariableInfoMap::mapIndexedResourceByName(gl::ShaderType shaderType,
125                                                               ShaderVariableType variableType,
126                                                               uint32_t resourceIndex,
127                                                               const std::string &variableName)
128 {
129     ASSERT(hasVariable(shaderType, variableName));
130     const auto &iter                 = mNameToTypeAndIndexMap[shaderType].find(variableName);
131     const TypeAndIndex &typeAndIndex = iter->second;
132     ASSERT(typeAndIndex.variableType == variableType);
133     mapIndexedResource(shaderType, variableType, resourceIndex, typeAndIndex.index);
134 }
135 
mapIndexedResource(gl::ShaderType shaderType,ShaderVariableType variableType,uint32_t resourceIndex,uint32_t variableIndex)136 void ShaderInterfaceVariableInfoMap::mapIndexedResource(gl::ShaderType shaderType,
137                                                         ShaderVariableType variableType,
138                                                         uint32_t resourceIndex,
139                                                         uint32_t variableIndex)
140 {
141     mIndexedResourceIndexMap[shaderType][variableType][resourceIndex] = variableIndex;
142 }
143 
144 const ShaderInterfaceVariableInfoMap::VariableInfoArray &
getAttributes() const145 ShaderInterfaceVariableInfoMap::getAttributes() const
146 {
147     return mData[gl::ShaderType::Vertex][ShaderVariableType::Attribute];
148 }
149 
150 const gl::ShaderMap<ShaderInterfaceVariableInfoMap::VariableTypeToInfoMap>
getData() const151     &ShaderInterfaceVariableInfoMap::getData() const
152 {
153     return mData;
154 }
155 
156 const gl::ShaderMap<ShaderInterfaceVariableInfoMap::NameToTypeAndIndexMap>
getNameToTypeAndIndexMap() const157     &ShaderInterfaceVariableInfoMap::getNameToTypeAndIndexMap() const
158 {
159     return mNameToTypeAndIndexMap;
160 }
161 
162 const gl::ShaderMap<ShaderInterfaceVariableInfoMap::VariableTypeToIndexMap>
getIndexedResourceMap() const163     &ShaderInterfaceVariableInfoMap::getIndexedResourceMap() const
164 {
165     return mIndexedResourceIndexMap;
166 }
167 }  // namespace rx
168