blob: 9e69e2fa308675249c48aee6b44b09cd4a5d2dfa [file] [log] [blame]
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ShaderInterfaceVariableInfoMap.cpp:
// Implements helper class for shader compilers
//
#include "libANGLE/renderer/ShaderInterfaceVariableInfoMap.h"
namespace rx
{
ShaderInterfaceVariableInfo::ShaderInterfaceVariableInfo() {}
// ShaderInterfaceVariableInfoMap implementation.
ShaderInterfaceVariableInfoMap::ShaderInterfaceVariableInfoMap() = default;
ShaderInterfaceVariableInfoMap::~ShaderInterfaceVariableInfoMap() = default;
void ShaderInterfaceVariableInfoMap::clear()
{
for (gl::ShaderType shaderType : gl::AllShaderTypes())
{
for (ShaderVariableType variableType : angle::AllEnums<ShaderVariableType>())
{
mData[shaderType][variableType].clear();
mIndexedResourceIndexMap[shaderType][variableType].clear();
}
mNameToTypeAndIndexMap[shaderType].clear();
}
}
void ShaderInterfaceVariableInfoMap::load(
const gl::ShaderMap<VariableTypeToInfoMap> &data,
const gl::ShaderMap<NameToTypeAndIndexMap> &nameToTypeAndIndexMap,
const gl::ShaderMap<VariableTypeToIndexMap> &indexedResourceIndexMap)
{
mData = data;
mNameToTypeAndIndexMap = nameToTypeAndIndexMap;
mIndexedResourceIndexMap = indexedResourceIndexMap;
}
void ShaderInterfaceVariableInfoMap::setActiveStages(gl::ShaderType shaderType,
ShaderVariableType variableType,
const std::string &variableName,
gl::ShaderBitSet activeStages)
{
ASSERT(hasVariable(shaderType, variableName));
uint32_t index = mNameToTypeAndIndexMap[shaderType][variableName].index;
mData[shaderType][variableType][index].activeStages = activeStages;
}
ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::getMutable(
gl::ShaderType shaderType,
ShaderVariableType variableType,
const std::string &variableName)
{
ASSERT(hasVariable(shaderType, variableName));
uint32_t index = mNameToTypeAndIndexMap[shaderType][variableName].index;
return mData[shaderType][variableType][index];
}
void ShaderInterfaceVariableInfoMap::markAsDuplicate(gl::ShaderType shaderType,
ShaderVariableType variableType,
const std::string &variableName)
{
ASSERT(hasVariable(shaderType, variableName));
uint32_t index = mNameToTypeAndIndexMap[shaderType][variableName].index;
mData[shaderType][variableType][index].isDuplicate = true;
}
ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::add(gl::ShaderType shaderType,
ShaderVariableType variableType,
const std::string &variableName)
{
ASSERT(!hasVariable(shaderType, variableName));
uint32_t index = static_cast<uint32_t>(mData[shaderType][variableType].size());
mNameToTypeAndIndexMap[shaderType][variableName] = {variableType, index};
mData[shaderType][variableType].resize(index + 1);
return mData[shaderType][variableType][index];
}
ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::addOrGet(
gl::ShaderType shaderType,
ShaderVariableType variableType,
const std::string &variableName)
{
if (!hasVariable(shaderType, variableName))
{
return add(shaderType, variableType, variableName);
}
else
{
uint32_t index = mNameToTypeAndIndexMap[shaderType][variableName].index;
return mData[shaderType][variableType][index];
}
}
bool ShaderInterfaceVariableInfoMap::hasVariable(gl::ShaderType shaderType,
const std::string &variableName) const
{
auto iter = mNameToTypeAndIndexMap[shaderType].find(variableName);
return (iter != mNameToTypeAndIndexMap[shaderType].end());
}
const ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::getVariableByName(
gl::ShaderType shaderType,
const std::string &variableName) const
{
auto iter = mNameToTypeAndIndexMap[shaderType].find(variableName);
ASSERT(iter != mNameToTypeAndIndexMap[shaderType].end());
TypeAndIndex typeAndIndex = iter->second;
return mData[shaderType][typeAndIndex.variableType][typeAndIndex.index];
}
#if ANGLE_ENABLE_METAL_SPIRV
bool ShaderInterfaceVariableInfoMap::hasTransformFeedbackInfo(gl::ShaderType shaderType,
uint32_t bufferIndex) const
{
std::string bufferName = rx::GetXfbBufferName(bufferIndex);
return hasVariable(shaderType, bufferName);
}
#endif
void ShaderInterfaceVariableInfoMap::mapIndexedResourceByName(gl::ShaderType shaderType,
ShaderVariableType variableType,
uint32_t resourceIndex,
const std::string &variableName)
{
ASSERT(hasVariable(shaderType, variableName));
const auto &iter = mNameToTypeAndIndexMap[shaderType].find(variableName);
const TypeAndIndex &typeAndIndex = iter->second;
ASSERT(typeAndIndex.variableType == variableType);
mapIndexedResource(shaderType, variableType, resourceIndex, typeAndIndex.index);
}
void ShaderInterfaceVariableInfoMap::mapIndexedResource(gl::ShaderType shaderType,
ShaderVariableType variableType,
uint32_t resourceIndex,
uint32_t variableIndex)
{
mIndexedResourceIndexMap[shaderType][variableType][resourceIndex] = variableIndex;
}
const ShaderInterfaceVariableInfoMap::VariableInfoArray &
ShaderInterfaceVariableInfoMap::getAttributes() const
{
return mData[gl::ShaderType::Vertex][ShaderVariableType::Attribute];
}
const gl::ShaderMap<ShaderInterfaceVariableInfoMap::VariableTypeToInfoMap>
&ShaderInterfaceVariableInfoMap::getData() const
{
return mData;
}
const gl::ShaderMap<ShaderInterfaceVariableInfoMap::NameToTypeAndIndexMap>
&ShaderInterfaceVariableInfoMap::getNameToTypeAndIndexMap() const
{
return mNameToTypeAndIndexMap;
}
const gl::ShaderMap<ShaderInterfaceVariableInfoMap::VariableTypeToIndexMap>
&ShaderInterfaceVariableInfoMap::getIndexedResourceMap() const
{
return mIndexedResourceIndexMap;
}
} // namespace rx