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