#include "libANGLE/ProgramLinkedResources.h"
#include "common/string_utils.h"
#include "common/utilities.h"
#include "libANGLE/Caps.h"
#include "libANGLE/Context.h"
#include "libANGLE/Shader.h"
#include "libANGLE/features.h"
namespace gl
{
namespace
{
UsedUniform *FindUniform(std::vector<UsedUniform> &list, const std::string &name)
{ … }
template <typename VarT>
void SetActive(std::vector<VarT> *list,
const std::string &name,
ShaderType shaderType,
bool active,
uint32_t id)
{ … }
template <typename VarT>
void SetActive(std::vector<VarT> *list,
std::vector<std::string> *nameList,
const std::string &name,
ShaderType shaderType,
bool active,
uint32_t id)
{ … }
LinkMismatchError LinkValidateUniforms(const sh::ShaderVariable &uniform1,
const sh::ShaderVariable &uniform2,
std::string *mismatchedStructFieldName)
{ … }
GLuint GetMaximumShaderUniformVectors(ShaderType shaderType, const Caps &caps)
{ … }
enum class UniformType : uint8_t
{ … };
const char *GetUniformResourceNameString(UniformType uniformType)
{ … }
std::string GetUniformResourceLimitName(ShaderType shaderType, UniformType uniformType)
{ … }
void LogUniformsExceedLimit(ShaderType shaderType,
UniformType uniformType,
GLuint limit,
InfoLog &infoLog)
{ … }
class UniformBlockEncodingVisitor : public sh::VariableNameVisitor
{ … };
class ShaderStorageBlockVisitor : public sh::BlockEncoderVisitor
{ … };
struct ShaderUniformCount
{ … };
ShaderUniformCount &operator+=(ShaderUniformCount &lhs, const ShaderUniformCount &rhs)
{ … }
class FlattenUniformVisitor : public sh::VariableNameVisitor
{ … };
class InterfaceBlockInfo final : angle::NonCopyable
{ … };
void InterfaceBlockInfo::getShaderBlockInfo(const std::vector<sh::InterfaceBlock> &interfaceBlocks)
{ … }
size_t InterfaceBlockInfo::getBlockInfo(const sh::InterfaceBlock &interfaceBlock)
{ … }
bool InterfaceBlockInfo::getBlockSize(const std::string &name,
const std::string &mappedName,
size_t *sizeOut)
{ … }
bool InterfaceBlockInfo::getBlockMemberInfo(const std::string &name,
const std::string &mappedName,
sh::BlockMemberInfo *infoOut)
{ … }
void GetFilteredVaryings(const std::vector<sh::ShaderVariable> &varyings,
std::vector<const sh::ShaderVariable *> *filteredVaryingsOut)
{ … }
LinkMismatchError LinkValidateVaryings(const sh::ShaderVariable &outputVarying,
const sh::ShaderVariable &inputVarying,
int shaderVersion,
ShaderType frontShaderType,
ShaderType backShaderType,
bool isSeparable,
std::string *mismatchedStructFieldName)
{ … }
bool DoShaderVariablesMatch(int frontShaderVersion,
ShaderType frontShaderType,
ShaderType backShaderType,
const sh::ShaderVariable &input,
const sh::ShaderVariable &output,
bool isSeparable,
gl::InfoLog &infoLog)
{ … }
const char *GetInterfaceBlockTypeString(sh::BlockType blockType)
{ … }
std::string GetInterfaceBlockLimitName(ShaderType shaderType, sh::BlockType blockType)
{ … }
void LogInterfaceBlocksExceedLimit(InfoLog &infoLog,
ShaderType shaderType,
sh::BlockType blockType,
GLuint limit)
{ … }
bool ValidateInterfaceBlocksCount(GLuint maxInterfaceBlocks,
const std::vector<sh::InterfaceBlock> &interfaceBlocks,
ShaderType shaderType,
sh::BlockType blockType,
GLuint *combinedInterfaceBlocksCount,
InfoLog &infoLog)
{ … }
}
UsedUniform::UsedUniform() { … }
UsedUniform::UsedUniform(GLenum typeIn,
GLenum precisionIn,
const std::string &nameIn,
const std::vector<unsigned int> &arraySizesIn,
const int bindingIn,
const int offsetIn,
const int locationIn,
const int bufferIndexIn,
const sh::BlockMemberInfo &blockInfoIn)
: … { … }
UsedUniform::UsedUniform(const UsedUniform &other)
{ … }
UsedUniform &UsedUniform::operator=(const UsedUniform &other)
{ … }
UsedUniform::~UsedUniform() { … }
UniformLinker::UniformLinker(const ShaderBitSet &activeShaderStages,
const ShaderMap<std::vector<sh::ShaderVariable>> &shaderUniforms)
: … { … }
UniformLinker::~UniformLinker() = default;
void UniformLinker::getResults(std::vector<LinkedUniform> *uniforms,
std::vector<std::string> *uniformNames,
std::vector<std::string> *uniformMappedNames,
std::vector<UnusedUniform> *unusedUniformsOutOrNull,
std::vector<VariableLocation> *uniformLocationsOutOrNull)
{ … }
bool UniformLinker::link(const Caps &caps,
InfoLog &infoLog,
const ProgramAliasedBindings &uniformLocationBindings)
{ … }
bool UniformLinker::validateGraphicsUniforms(InfoLog &infoLog) const
{ … }
bool UniformLinker::validateGraphicsUniformsPerShader(
ShaderType shaderToLink,
bool extendLinkedUniforms,
std::map<std::string, ShaderUniform> *linkedUniforms,
InfoLog &infoLog) const
{ … }
bool UniformLinker::indexUniforms(InfoLog &infoLog,
const ProgramAliasedBindings &uniformLocationBindings)
{ … }
bool UniformLinker::gatherUniformLocationsAndCheckConflicts(
InfoLog &infoLog,
const ProgramAliasedBindings &uniformLocationBindings,
std::set<GLuint> *ignoredLocations,
int *maxUniformLocation)
{ … }
void UniformLinker::pruneUnusedUniforms()
{ … }
bool UniformLinker::flattenUniformsAndCheckCapsForShader(
ShaderType shaderType,
const Caps &caps,
std::vector<UsedUniform> &samplerUniforms,
std::vector<UsedUniform> &imageUniforms,
std::vector<UsedUniform> &atomicCounterUniforms,
std::vector<UsedUniform> &inputAttachmentUniforms,
std::vector<UnusedUniform> &unusedUniforms,
InfoLog &infoLog)
{ … }
bool UniformLinker::flattenUniformsAndCheckCaps(const Caps &caps, InfoLog &infoLog)
{ … }
bool UniformLinker::checkMaxCombinedAtomicCounters(const Caps &caps, InfoLog &infoLog)
{ … }
InterfaceBlockLinker::InterfaceBlockLinker() = default;
InterfaceBlockLinker::~InterfaceBlockLinker() = default;
void InterfaceBlockLinker::init(std::vector<InterfaceBlock> *blocksOut,
std::vector<std::string> *unusedInterfaceBlocksOut)
{ … }
void InterfaceBlockLinker::addShaderBlocks(ShaderType shaderType,
const std::vector<sh::InterfaceBlock> *blocks)
{ … }
void InterfaceBlockLinker::linkBlocks(const GetBlockSizeFunc &getBlockSize,
const GetBlockMemberInfoFunc &getMemberInfo) const
{ … }
void InterfaceBlockLinker::defineInterfaceBlock(const GetBlockSizeFunc &getBlockSize,
const GetBlockMemberInfoFunc &getMemberInfo,
const sh::InterfaceBlock &interfaceBlock,
ShaderType shaderType) const
{ … }
UniformBlockLinker::UniformBlockLinker() = default;
UniformBlockLinker::~UniformBlockLinker() { … }
void UniformBlockLinker::init(std::vector<InterfaceBlock> *blocksOut,
std::vector<LinkedUniform> *uniformsOut,
std::vector<std::string> *uniformNamesOut,
std::vector<std::string> *uniformMappedNamesOut,
std::vector<std::string> *unusedInterfaceBlocksOut)
{ … }
size_t UniformBlockLinker::getCurrentBlockMemberIndex() const
{ … }
sh::ShaderVariableVisitor *UniformBlockLinker::getVisitor(
const GetBlockMemberInfoFunc &getMemberInfo,
const std::string &namePrefix,
const std::string &mappedNamePrefix,
ShaderType shaderType,
int blockIndex) const
{ … }
ShaderStorageBlockLinker::ShaderStorageBlockLinker() = default;
ShaderStorageBlockLinker::~ShaderStorageBlockLinker() = default;
void ShaderStorageBlockLinker::init(std::vector<InterfaceBlock> *blocksOut,
std::vector<BufferVariable> *bufferVariablesOut,
std::vector<std::string> *unusedInterfaceBlocksOut)
{ … }
size_t ShaderStorageBlockLinker::getCurrentBlockMemberIndex() const
{ … }
sh::ShaderVariableVisitor *ShaderStorageBlockLinker::getVisitor(
const GetBlockMemberInfoFunc &getMemberInfo,
const std::string &namePrefix,
const std::string &mappedNamePrefix,
ShaderType shaderType,
int blockIndex) const
{ … }
AtomicCounterBufferLinker::AtomicCounterBufferLinker() = default;
AtomicCounterBufferLinker::~AtomicCounterBufferLinker() = default;
void AtomicCounterBufferLinker::init(std::vector<AtomicCounterBuffer> *atomicCounterBuffersOut)
{ … }
void AtomicCounterBufferLinker::link(const std::map<int, unsigned int> &sizeMap) const
{ … }
LinkingVariables::LinkingVariables() = default;
LinkingVariables::~LinkingVariables() = default;
void LinkingVariables::initForProgram(const ProgramState &state)
{ … }
void LinkingVariables::initForProgramPipeline(const ProgramPipelineState &state)
{ … }
ProgramLinkedResources::ProgramLinkedResources() = default;
ProgramLinkedResources::~ProgramLinkedResources() = default;
void ProgramLinkedResources::init(std::vector<InterfaceBlock> *uniformBlocksOut,
std::vector<LinkedUniform> *uniformsOut,
std::vector<std::string> *uniformNamesOut,
std::vector<std::string> *uniformMappedNamesOut,
std::vector<InterfaceBlock> *shaderStorageBlocksOut,
std::vector<BufferVariable> *bufferVariablesOut,
std::vector<AtomicCounterBuffer> *atomicCounterBuffersOut)
{ … }
void ProgramLinkedResourcesLinker::linkResources(const ProgramState &programState,
const ProgramLinkedResources &resources) const
{ … }
void ProgramLinkedResourcesLinker::getAtomicCounterBufferSizeMap(
const ProgramExecutable &executable,
std::map<int, unsigned int> &sizeMapOut) const
{ … }
bool LinkValidateProgramGlobalNames(InfoLog &infoLog,
const ProgramExecutable &executable,
const LinkingVariables &linkingVariables)
{ … }
bool LinkValidateShaderInterfaceMatching(const std::vector<sh::ShaderVariable> &outputVaryings,
const std::vector<sh::ShaderVariable> &inputVaryings,
ShaderType frontShaderType,
ShaderType backShaderType,
int frontShaderVersion,
int backShaderVersion,
bool isSeparable,
gl::InfoLog &infoLog)
{ … }
LinkMismatchError LinkValidateProgramVariables(const sh::ShaderVariable &variable1,
const sh::ShaderVariable &variable2,
bool validatePrecision,
bool treatVariable1AsNonArray,
bool treatVariable2AsNonArray,
std::string *mismatchedStructOrBlockMemberName)
{ … }
void AddProgramVariableParentPrefix(const std::string &parentName, std::string *mismatchedFieldName)
{ … }
bool LinkValidateBuiltInVaryingsInvariant(const std::vector<sh::ShaderVariable> &vertexVaryings,
const std::vector<sh::ShaderVariable> &fragmentVaryings,
int vertexShaderVersion,
InfoLog &infoLog)
{ … }
bool LinkValidateBuiltInVaryings(const std::vector<sh::ShaderVariable> &outputVaryings,
const std::vector<sh::ShaderVariable> &inputVaryings,
ShaderType outputShaderType,
ShaderType inputShaderType,
int outputShaderVersion,
int inputShaderVersion,
InfoLog &infoLog)
{ … }
void LogAmbiguousFieldLinkMismatch(InfoLog &infoLog,
const std::string &blockName1,
const std::string &blockName2,
const std::string &fieldName,
ShaderType shaderType1,
ShaderType shaderType2)
{ … }
bool ValidateInstancelessGraphicsInterfaceBlocksPerShader(
const std::vector<sh::InterfaceBlock> &interfaceBlocks,
ShaderType shaderType,
InterfaceBlockMap *instancelessBlocksFields,
InfoLog &infoLog)
{ … }
LinkMismatchError LinkValidateInterfaceBlockFields(const sh::ShaderVariable &blockField1,
const sh::ShaderVariable &blockField2,
bool webglCompatibility,
std::string *mismatchedBlockFieldName)
{ … }
LinkMismatchError AreMatchingInterfaceBlocks(const sh::InterfaceBlock &interfaceBlock1,
const sh::InterfaceBlock &interfaceBlock2,
bool webglCompatibility,
std::string *mismatchedBlockFieldName)
{ … }
void InitializeInterfaceBlockMap(const std::vector<sh::InterfaceBlock> &interfaceBlocks,
ShaderType shaderType,
InterfaceBlockMap *linkedInterfaceBlocks)
{ … }
bool ValidateGraphicsInterfaceBlocksPerShader(
const std::vector<sh::InterfaceBlock> &interfaceBlocksToLink,
ShaderType shaderType,
bool webglCompatibility,
InterfaceBlockMap *linkedBlocks,
InfoLog &infoLog)
{ … }
bool ValidateInterfaceBlocksMatch(
GLuint numShadersHasInterfaceBlocks,
const ShaderMap<const std::vector<sh::InterfaceBlock> *> &shaderInterfaceBlocks,
InfoLog &infoLog,
bool webglCompatibility,
InterfaceBlockMap *instancelessInterfaceBlocksFields)
{ … }
bool LinkValidateProgramInterfaceBlocks(const Caps &caps,
const Version &clientVersion,
bool webglCompatibility,
ShaderBitSet activeProgramStages,
const ProgramLinkedResources &resources,
InfoLog &infoLog,
GLuint *combinedShaderStorageBlocksCountOut)
{ … }
}