Commit 9b11ea4f by Jiajia Qin Committed by Commit Bot

Gather UniformBlock and ShaderStorageBlock separately

Refactor InterfaceBlocks since it only stands for UniformBlock before ES31. But for ES31, uniform block and shader storage block both belong to interface block. This CL will add GetUniformBlocks and GetShaderStorageBlocks in ShaderLang.h. Meanwhile, keep GetInterfaceBlocks which can return all the interface blocks together. BUG=angleproject:1951 Change-Id: I3036e201aadfbd490575ed03538c81bcc3793ff3 Reviewed-on: https://chromium-review.googlesource.com/582546 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 0d671c9a
...@@ -541,6 +541,8 @@ const std::vector<sh::Varying> *GetOutputVaryings(const ShHandle handle); ...@@ -541,6 +541,8 @@ const std::vector<sh::Varying> *GetOutputVaryings(const ShHandle handle);
const std::vector<sh::Attribute> *GetAttributes(const ShHandle handle); const std::vector<sh::Attribute> *GetAttributes(const ShHandle handle);
const std::vector<sh::OutputVariable> *GetOutputVariables(const ShHandle handle); const std::vector<sh::OutputVariable> *GetOutputVariables(const ShHandle handle);
const std::vector<sh::InterfaceBlock> *GetInterfaceBlocks(const ShHandle handle); const std::vector<sh::InterfaceBlock> *GetInterfaceBlocks(const ShHandle handle);
const std::vector<sh::InterfaceBlock> *GetUniformBlocks(const ShHandle handle);
const std::vector<sh::InterfaceBlock> *GetShaderStorageBlocks(const ShHandle handle);
sh::WorkGroupSize GetComputeShaderLocalGroupSize(const ShHandle handle); sh::WorkGroupSize GetComputeShaderLocalGroupSize(const ShHandle handle);
// Returns the number of views specified through the num_views layout qualifier. If num_views is // Returns the number of views specified through the num_views layout qualifier. If num_views is
// not set, the function returns -1. // not set, the function returns -1.
...@@ -556,18 +558,18 @@ int GetVertexShaderNumViews(const ShHandle handle); ...@@ -556,18 +558,18 @@ int GetVertexShaderNumViews(const ShHandle handle);
bool CheckVariablesWithinPackingLimits(int maxVectors, bool CheckVariablesWithinPackingLimits(int maxVectors,
const std::vector<sh::ShaderVariable> &variables); const std::vector<sh::ShaderVariable> &variables);
// Gives the compiler-assigned register for an interface block. // Gives the compiler-assigned register for a uniform block.
// The method writes the value to the output variable "indexOut". // The method writes the value to the output variable "indexOut".
// Returns true if it found a valid interface block, false otherwise. // Returns true if it found a valid uniform block, false otherwise.
// Parameters: // Parameters:
// handle: Specifies the compiler // handle: Specifies the compiler
// interfaceBlockName: Specifies the interface block // uniformBlockName: Specifies the uniform block
// indexOut: output variable that stores the assigned register // indexOut: output variable that stores the assigned register
bool GetInterfaceBlockRegister(const ShHandle handle, bool GetUniformBlockRegister(const ShHandle handle,
const std::string &interfaceBlockName, const std::string &uniformBlockName,
unsigned int *indexOut); unsigned int *indexOut);
// Gives a map from uniform names to compiler-assigned registers in the default interface block. // Gives a map from uniform names to compiler-assigned registers in the default uniform block.
// Note that the map contains also registers of samplers that have been extracted from structs. // Note that the map contains also registers of samplers that have been extracted from structs.
const std::map<std::string, unsigned int> *GetUniformRegisterMap(const ShHandle handle); const std::map<std::string, unsigned int> *GetUniformRegisterMap(const ShHandle handle);
......
...@@ -41,6 +41,13 @@ enum BlockLayoutType ...@@ -41,6 +41,13 @@ enum BlockLayoutType
BLOCKLAYOUT_SHARED BLOCKLAYOUT_SHARED
}; };
// Interface Blocks, see section 4.3.9 of the ESSL 3.10 spec
enum class BlockType
{
BLOCK_UNIFORM,
BLOCK_BUFFER
};
// Base class for all variables defined in shaders, including Varyings, Uniforms, etc // Base class for all variables defined in shaders, including Varyings, Uniforms, etc
// Note: we must override the copy constructor and assignment operator so we can // Note: we must override the copy constructor and assignment operator so we can
// work around excessive GCC binary bloating: // work around excessive GCC binary bloating:
...@@ -219,6 +226,7 @@ struct InterfaceBlock ...@@ -219,6 +226,7 @@ struct InterfaceBlock
bool isRowMajorLayout; bool isRowMajorLayout;
int binding; int binding;
bool staticUse; bool staticUse;
BlockType blockType;
std::vector<InterfaceBlockField> fields; std::vector<InterfaceBlockField> fields;
}; };
......
...@@ -474,8 +474,9 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], ...@@ -474,8 +474,9 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
{ {
ASSERT(!variablesCollected); ASSERT(!variablesCollected);
CollectVariables(root, &attributes, &outputVariables, &uniforms, &inputVaryings, CollectVariables(root, &attributes, &outputVariables, &uniforms, &inputVaryings,
&outputVaryings, &interfaceBlocks, hashFunction, &symbolTable, &outputVaryings, &uniformBlocks, &shaderStorageBlocks, hashFunction,
shaderVersion, extensionBehavior); &symbolTable, shaderVersion, extensionBehavior);
collectInterfaceBlocks();
variablesCollected = true; variablesCollected = true;
if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS) if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS)
{ {
...@@ -749,6 +750,15 @@ void TCompiler::setResourceString() ...@@ -749,6 +750,15 @@ void TCompiler::setResourceString()
builtInResourcesString = strstream.str(); builtInResourcesString = strstream.str();
} }
void TCompiler::collectInterfaceBlocks()
{
ASSERT(interfaceBlocks.empty());
interfaceBlocks.reserve(uniformBlocks.size() + shaderStorageBlocks.size());
interfaceBlocks.insert(interfaceBlocks.end(), uniformBlocks.begin(), uniformBlocks.end());
interfaceBlocks.insert(interfaceBlocks.end(), shaderStorageBlocks.begin(),
shaderStorageBlocks.end());
}
void TCompiler::clearResults() void TCompiler::clearResults()
{ {
arrayBoundsClamper.Cleanup(); arrayBoundsClamper.Cleanup();
...@@ -763,6 +773,8 @@ void TCompiler::clearResults() ...@@ -763,6 +773,8 @@ void TCompiler::clearResults()
inputVaryings.clear(); inputVaryings.clear();
outputVaryings.clear(); outputVaryings.clear();
interfaceBlocks.clear(); interfaceBlocks.clear();
uniformBlocks.clear();
shaderStorageBlocks.clear();
variablesCollected = false; variablesCollected = false;
mGLPositionInitialized = false; mGLPositionInitialized = false;
...@@ -983,7 +995,7 @@ void TCompiler::useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root) ...@@ -983,7 +995,7 @@ void TCompiler::useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root)
{ {
sh::InterfaceBlockList list; sh::InterfaceBlockList list;
for (auto block : interfaceBlocks) for (auto block : uniformBlocks)
{ {
if (!block.staticUse && if (!block.staticUse &&
(block.layout == sh::BLOCKLAYOUT_STANDARD || block.layout == sh::BLOCKLAYOUT_SHARED)) (block.layout == sh::BLOCKLAYOUT_STANDARD || block.layout == sh::BLOCKLAYOUT_SHARED))
......
...@@ -113,6 +113,11 @@ class TCompiler : public TShHandleBase ...@@ -113,6 +113,11 @@ class TCompiler : public TShHandleBase
const std::vector<sh::Varying> &getInputVaryings() const { return inputVaryings; } const std::vector<sh::Varying> &getInputVaryings() const { return inputVaryings; }
const std::vector<sh::Varying> &getOutputVaryings() const { return outputVaryings; } const std::vector<sh::Varying> &getOutputVaryings() const { return outputVaryings; }
const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const { return interfaceBlocks; } const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const { return interfaceBlocks; }
const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return uniformBlocks; }
const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const
{
return shaderStorageBlocks;
}
ShHashFunction64 getHashFunction() const { return hashFunction; } ShHashFunction64 getHashFunction() const { return hashFunction; }
NameMap &getNameMap() { return nameMap; } NameMap &getNameMap() { return nameMap; }
...@@ -188,6 +193,8 @@ class TCompiler : public TShHandleBase ...@@ -188,6 +193,8 @@ class TCompiler : public TShHandleBase
std::vector<sh::Varying> inputVaryings; std::vector<sh::Varying> inputVaryings;
std::vector<sh::Varying> outputVaryings; std::vector<sh::Varying> outputVaryings;
std::vector<sh::InterfaceBlock> interfaceBlocks; std::vector<sh::InterfaceBlock> interfaceBlocks;
std::vector<sh::InterfaceBlock> uniformBlocks;
std::vector<sh::InterfaceBlock> shaderStorageBlocks;
private: private:
// Creates the function call DAG for further analysis, returning false if there is a recursion // Creates the function call DAG for further analysis, returning false if there is a recursion
...@@ -198,6 +205,8 @@ class TCompiler : public TShHandleBase ...@@ -198,6 +205,8 @@ class TCompiler : public TShHandleBase
void initSamplerDefaultPrecision(TBasicType samplerType); void initSamplerDefaultPrecision(TBasicType samplerType);
void collectInterfaceBlocks();
bool variablesCollected; bool variablesCollected;
bool mGLPositionInitialized; bool mGLPositionInitialized;
......
...@@ -147,7 +147,7 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType, ...@@ -147,7 +147,7 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType,
} }
// Reserve registers for the default uniform block and driver constants // Reserve registers for the default uniform block and driver constants
mUniformHLSL->reserveInterfaceBlockRegisters(2); mUniformHLSL->reserveUniformBlockRegisters(2);
} }
OutputHLSL::~OutputHLSL() OutputHLSL::~OutputHLSL()
...@@ -231,9 +231,9 @@ void OutputHLSL::makeFlaggedStructMaps(const std::vector<TIntermTyped *> &flagge ...@@ -231,9 +231,9 @@ void OutputHLSL::makeFlaggedStructMaps(const std::vector<TIntermTyped *> &flagge
} }
} }
const std::map<std::string, unsigned int> &OutputHLSL::getInterfaceBlockRegisterMap() const const std::map<std::string, unsigned int> &OutputHLSL::getUniformBlockRegisterMap() const
{ {
return mUniformHLSL->getInterfaceBlockRegisterMap(); return mUniformHLSL->getUniformBlockRegisterMap();
} }
const std::map<std::string, unsigned int> &OutputHLSL::getUniformRegisterMap() const const std::map<std::string, unsigned int> &OutputHLSL::getUniformRegisterMap() const
...@@ -354,7 +354,7 @@ void OutputHLSL::header(TInfoSinkBase &out, const BuiltInFunctionEmulator *built ...@@ -354,7 +354,7 @@ void OutputHLSL::header(TInfoSinkBase &out, const BuiltInFunctionEmulator *built
out << mStructureHLSL->structsHeader(); out << mStructureHLSL->structsHeader();
mUniformHLSL->uniformsHeader(out, mOutputType, mReferencedUniforms); mUniformHLSL->uniformsHeader(out, mOutputType, mReferencedUniforms);
out << mUniformHLSL->interfaceBlocksHeader(mReferencedInterfaceBlocks); out << mUniformHLSL->uniformBlocksHeader(mReferencedUniformBlocks);
if (!mEqualityFunctions.empty()) if (!mEqualityFunctions.empty())
{ {
...@@ -792,7 +792,7 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node) ...@@ -792,7 +792,7 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node)
if (interfaceBlock) if (interfaceBlock)
{ {
mReferencedInterfaceBlocks[interfaceBlock->name()] = node; mReferencedUniformBlocks[interfaceBlock->name()] = node;
} }
else else
{ {
...@@ -1138,9 +1138,9 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -1138,9 +1138,9 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
{ {
TInterfaceBlock *interfaceBlock = leftType.getInterfaceBlock(); TInterfaceBlock *interfaceBlock = leftType.getInterfaceBlock();
const int arrayIndex = node->getRight()->getAsConstantUnion()->getIConst(0); const int arrayIndex = node->getRight()->getAsConstantUnion()->getIConst(0);
mReferencedInterfaceBlocks[interfaceBlock->instanceName()] = mReferencedUniformBlocks[interfaceBlock->instanceName()] =
node->getLeft()->getAsSymbolNode(); node->getLeft()->getAsSymbolNode();
out << mUniformHLSL->interfaceBlockInstanceString(*interfaceBlock, arrayIndex); out << mUniformHLSL->uniformBlockInstanceString(*interfaceBlock, arrayIndex);
return false; return false;
} }
} }
......
...@@ -43,7 +43,7 @@ class OutputHLSL : public TIntermTraverser ...@@ -43,7 +43,7 @@ class OutputHLSL : public TIntermTraverser
void output(TIntermNode *treeRoot, TInfoSinkBase &objSink); void output(TIntermNode *treeRoot, TInfoSinkBase &objSink);
const std::map<std::string, unsigned int> &getInterfaceBlockRegisterMap() const; const std::map<std::string, unsigned int> &getUniformBlockRegisterMap() const;
const std::map<std::string, unsigned int> &getUniformRegisterMap() const; const std::map<std::string, unsigned int> &getUniformRegisterMap() const;
static TString initializer(const TType &type); static TString initializer(const TType &type);
...@@ -154,7 +154,7 @@ class OutputHLSL : public TIntermTraverser ...@@ -154,7 +154,7 @@ class OutputHLSL : public TIntermTraverser
std::stack<TInfoSinkBase *> mInfoSinkStack; std::stack<TInfoSinkBase *> mInfoSinkStack;
ReferencedSymbols mReferencedUniforms; ReferencedSymbols mReferencedUniforms;
ReferencedSymbols mReferencedInterfaceBlocks; ReferencedSymbols mReferencedUniformBlocks;
ReferencedSymbols mReferencedAttributes; ReferencedSymbols mReferencedAttributes;
ReferencedSymbols mReferencedVaryings; ReferencedSymbols mReferencedVaryings;
ReferencedSymbols mReferencedOutputVariables; ReferencedSymbols mReferencedOutputVariables;
......
...@@ -405,6 +405,26 @@ const std::vector<InterfaceBlock> *GetInterfaceBlocks(const ShHandle handle) ...@@ -405,6 +405,26 @@ const std::vector<InterfaceBlock> *GetInterfaceBlocks(const ShHandle handle)
return GetShaderVariables<InterfaceBlock>(handle); return GetShaderVariables<InterfaceBlock>(handle);
} }
const std::vector<InterfaceBlock> *GetUniformBlocks(const ShHandle handle)
{
ASSERT(handle);
TShHandleBase *base = static_cast<TShHandleBase *>(handle);
TCompiler *compiler = base->getAsCompiler();
ASSERT(compiler);
return &compiler->getUniformBlocks();
}
const std::vector<InterfaceBlock> *GetShaderStorageBlocks(const ShHandle handle)
{
ASSERT(handle);
TShHandleBase *base = static_cast<TShHandleBase *>(handle);
TCompiler *compiler = base->getAsCompiler();
ASSERT(compiler);
return &compiler->getShaderStorageBlocks();
}
WorkGroupSize GetComputeShaderLocalGroupSize(const ShHandle handle) WorkGroupSize GetComputeShaderLocalGroupSize(const ShHandle handle)
{ {
ASSERT(handle); ASSERT(handle);
...@@ -432,8 +452,8 @@ bool CheckVariablesWithinPackingLimits(int maxVectors, const std::vector<ShaderV ...@@ -432,8 +452,8 @@ bool CheckVariablesWithinPackingLimits(int maxVectors, const std::vector<ShaderV
return packer.CheckVariablesWithinPackingLimits(maxVectors, variables); return packer.CheckVariablesWithinPackingLimits(maxVectors, variables);
} }
bool GetInterfaceBlockRegister(const ShHandle handle, bool GetUniformBlockRegister(const ShHandle handle,
const std::string &interfaceBlockName, const std::string &uniformBlockName,
unsigned int *indexOut) unsigned int *indexOut)
{ {
#ifdef ANGLE_ENABLE_HLSL #ifdef ANGLE_ENABLE_HLSL
...@@ -442,12 +462,12 @@ bool GetInterfaceBlockRegister(const ShHandle handle, ...@@ -442,12 +462,12 @@ bool GetInterfaceBlockRegister(const ShHandle handle,
TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle); TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
ASSERT(translator); ASSERT(translator);
if (!translator->hasInterfaceBlock(interfaceBlockName)) if (!translator->hasUniformBlock(uniformBlockName))
{ {
return false; return false;
} }
*indexOut = translator->getInterfaceBlockRegister(interfaceBlockName); *indexOut = translator->getUniformBlockRegister(uniformBlockName);
return true; return true;
#else #else
return false; return false;
......
...@@ -374,7 +374,8 @@ InterfaceBlock::InterfaceBlock() ...@@ -374,7 +374,8 @@ InterfaceBlock::InterfaceBlock()
layout(BLOCKLAYOUT_PACKED), layout(BLOCKLAYOUT_PACKED),
isRowMajorLayout(false), isRowMajorLayout(false),
binding(-1), binding(-1),
staticUse(false) staticUse(false),
blockType(BlockType::BLOCK_UNIFORM)
{ {
} }
...@@ -391,6 +392,7 @@ InterfaceBlock::InterfaceBlock(const InterfaceBlock &other) ...@@ -391,6 +392,7 @@ InterfaceBlock::InterfaceBlock(const InterfaceBlock &other)
isRowMajorLayout(other.isRowMajorLayout), isRowMajorLayout(other.isRowMajorLayout),
binding(other.binding), binding(other.binding),
staticUse(other.staticUse), staticUse(other.staticUse),
blockType(other.blockType),
fields(other.fields) fields(other.fields)
{ {
} }
...@@ -405,6 +407,7 @@ InterfaceBlock &InterfaceBlock::operator=(const InterfaceBlock &other) ...@@ -405,6 +407,7 @@ InterfaceBlock &InterfaceBlock::operator=(const InterfaceBlock &other)
isRowMajorLayout = other.isRowMajorLayout; isRowMajorLayout = other.isRowMajorLayout;
binding = other.binding; binding = other.binding;
staticUse = other.staticUse; staticUse = other.staticUse;
blockType = other.blockType;
fields = other.fields; fields = other.fields;
return *this; return *this;
} }
...@@ -418,7 +421,8 @@ bool InterfaceBlock::isSameInterfaceBlockAtLinkTime(const InterfaceBlock &other) ...@@ -418,7 +421,8 @@ bool InterfaceBlock::isSameInterfaceBlockAtLinkTime(const InterfaceBlock &other)
{ {
if (name != other.name || mappedName != other.mappedName || arraySize != other.arraySize || if (name != other.name || mappedName != other.mappedName || arraySize != other.arraySize ||
layout != other.layout || isRowMajorLayout != other.isRowMajorLayout || layout != other.layout || isRowMajorLayout != other.isRowMajorLayout ||
binding != other.binding || fields.size() != other.fields.size()) binding != other.binding || blockType != other.blockType ||
fields.size() != other.fields.size())
{ {
return false; return false;
} }
......
...@@ -123,7 +123,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -123,7 +123,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
outputHLSL.output(root, getInfoSink().obj); outputHLSL.output(root, getInfoSink().obj);
mInterfaceBlockRegisterMap = outputHLSL.getInterfaceBlockRegisterMap(); mUniformBlockRegisterMap = outputHLSL.getUniformBlockRegisterMap();
mUniformRegisterMap = outputHLSL.getUniformRegisterMap(); mUniformRegisterMap = outputHLSL.getUniformRegisterMap();
} }
...@@ -133,15 +133,15 @@ bool TranslatorHLSL::shouldFlattenPragmaStdglInvariantAll() ...@@ -133,15 +133,15 @@ bool TranslatorHLSL::shouldFlattenPragmaStdglInvariantAll()
return false; return false;
} }
bool TranslatorHLSL::hasInterfaceBlock(const std::string &interfaceBlockName) const bool TranslatorHLSL::hasUniformBlock(const std::string &uniformBlockName) const
{ {
return (mInterfaceBlockRegisterMap.count(interfaceBlockName) > 0); return (mUniformBlockRegisterMap.count(uniformBlockName) > 0);
} }
unsigned int TranslatorHLSL::getInterfaceBlockRegister(const std::string &interfaceBlockName) const unsigned int TranslatorHLSL::getUniformBlockRegister(const std::string &uniformBlockName) const
{ {
ASSERT(hasInterfaceBlock(interfaceBlockName)); ASSERT(hasUniformBlock(uniformBlockName));
return mInterfaceBlockRegisterMap.find(interfaceBlockName)->second; return mUniformBlockRegisterMap.find(uniformBlockName)->second;
} }
const std::map<std::string, unsigned int> *TranslatorHLSL::getUniformRegisterMap() const const std::map<std::string, unsigned int> *TranslatorHLSL::getUniformRegisterMap() const
......
...@@ -18,8 +18,8 @@ class TranslatorHLSL : public TCompiler ...@@ -18,8 +18,8 @@ class TranslatorHLSL : public TCompiler
TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output); TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output);
TranslatorHLSL *getAsTranslatorHLSL() override { return this; } TranslatorHLSL *getAsTranslatorHLSL() override { return this; }
bool hasInterfaceBlock(const std::string &interfaceBlockName) const; bool hasUniformBlock(const std::string &interfaceBlockName) const;
unsigned int getInterfaceBlockRegister(const std::string &interfaceBlockName) const; unsigned int getUniformBlockRegister(const std::string &interfaceBlockName) const;
const std::map<std::string, unsigned int> *getUniformRegisterMap() const; const std::map<std::string, unsigned int> *getUniformRegisterMap() const;
...@@ -33,7 +33,7 @@ class TranslatorHLSL : public TCompiler ...@@ -33,7 +33,7 @@ class TranslatorHLSL : public TCompiler
// Globals are initialized in output so it is redundant to initialize them in the AST. // Globals are initialized in output so it is redundant to initialize them in the AST.
bool needToInitializeGlobalsInAST() const override { return false; } bool needToInitializeGlobalsInAST() const override { return false; }
std::map<std::string, unsigned int> mInterfaceBlockRegisterMap; std::map<std::string, unsigned int> mUniformBlockRegisterMap;
std::map<std::string, unsigned int> mUniformRegisterMap; std::map<std::string, unsigned int> mUniformRegisterMap;
}; };
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
// found in the LICENSE file. // found in the LICENSE file.
// //
// UniformHLSL.cpp: // UniformHLSL.cpp:
// Methods for GLSL to HLSL translation for uniforms and interface blocks. // Methods for GLSL to HLSL translation for uniforms and uniform blocks.
// //
#include "compiler/translator/UniformHLSL.h" #include "compiler/translator/UniformHLSL.h"
...@@ -65,7 +65,7 @@ UniformHLSL::UniformHLSL(StructureHLSL *structureHLSL, ...@@ -65,7 +65,7 @@ UniformHLSL::UniformHLSL(StructureHLSL *structureHLSL,
ShShaderOutput outputType, ShShaderOutput outputType,
const std::vector<Uniform> &uniforms) const std::vector<Uniform> &uniforms)
: mUniformRegister(0), : mUniformRegister(0),
mInterfaceBlockRegister(0), mUniformBlockRegister(0),
mSamplerRegister(0), mSamplerRegister(0),
mStructureHLSL(structureHLSL), mStructureHLSL(structureHLSL),
mOutputType(outputType), mOutputType(outputType),
...@@ -78,9 +78,9 @@ void UniformHLSL::reserveUniformRegisters(unsigned int registerCount) ...@@ -78,9 +78,9 @@ void UniformHLSL::reserveUniformRegisters(unsigned int registerCount)
mUniformRegister = registerCount; mUniformRegister = registerCount;
} }
void UniformHLSL::reserveInterfaceBlockRegisters(unsigned int registerCount) void UniformHLSL::reserveUniformBlockRegisters(unsigned int registerCount)
{ {
mInterfaceBlockRegister = registerCount; mUniformBlockRegister = registerCount;
} }
const Uniform *UniformHLSL::findUniformByName(const TString &name) const const Uniform *UniformHLSL::findUniformByName(const TString &name) const
...@@ -354,7 +354,7 @@ void UniformHLSL::samplerMetadataUniforms(TInfoSinkBase &out, const char *reg) ...@@ -354,7 +354,7 @@ void UniformHLSL::samplerMetadataUniforms(TInfoSinkBase &out, const char *reg)
} }
} }
TString UniformHLSL::interfaceBlocksHeader(const ReferencedSymbols &referencedInterfaceBlocks) TString UniformHLSL::uniformBlocksHeader(const ReferencedSymbols &referencedInterfaceBlocks)
{ {
TString interfaceBlocks; TString interfaceBlocks;
...@@ -365,16 +365,16 @@ TString UniformHLSL::interfaceBlocksHeader(const ReferencedSymbols &referencedIn ...@@ -365,16 +365,16 @@ TString UniformHLSL::interfaceBlocksHeader(const ReferencedSymbols &referencedIn
const TInterfaceBlock &interfaceBlock = *nodeType.getInterfaceBlock(); const TInterfaceBlock &interfaceBlock = *nodeType.getInterfaceBlock();
unsigned int arraySize = static_cast<unsigned int>(interfaceBlock.arraySize()); unsigned int arraySize = static_cast<unsigned int>(interfaceBlock.arraySize());
unsigned int activeRegister = mInterfaceBlockRegister; unsigned int activeRegister = mUniformBlockRegister;
mInterfaceBlockRegisterMap[interfaceBlock.name().c_str()] = activeRegister; mUniformBlockRegisterMap[interfaceBlock.name().c_str()] = activeRegister;
mInterfaceBlockRegister += std::max(1u, arraySize); mUniformBlockRegister += std::max(1u, arraySize);
// FIXME: interface block field names // FIXME: interface block field names
if (interfaceBlock.hasInstanceName()) if (interfaceBlock.hasInstanceName())
{ {
interfaceBlocks += interfaceBlockStructString(interfaceBlock); interfaceBlocks += uniformBlockStructString(interfaceBlock);
} }
if (arraySize > 0) if (arraySize > 0)
...@@ -382,20 +382,19 @@ TString UniformHLSL::interfaceBlocksHeader(const ReferencedSymbols &referencedIn ...@@ -382,20 +382,19 @@ TString UniformHLSL::interfaceBlocksHeader(const ReferencedSymbols &referencedIn
for (unsigned int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) for (unsigned int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++)
{ {
interfaceBlocks += interfaceBlocks +=
interfaceBlockString(interfaceBlock, activeRegister + arrayIndex, arrayIndex); uniformBlockString(interfaceBlock, activeRegister + arrayIndex, arrayIndex);
} }
} }
else else
{ {
interfaceBlocks += interfaceBlocks += uniformBlockString(interfaceBlock, activeRegister, GL_INVALID_INDEX);
interfaceBlockString(interfaceBlock, activeRegister, GL_INVALID_INDEX);
} }
} }
return (interfaceBlocks.empty() ? "" : ("// Interface Blocks\n\n" + interfaceBlocks)); return (interfaceBlocks.empty() ? "" : ("// Uniform Blocks\n\n" + interfaceBlocks));
} }
TString UniformHLSL::interfaceBlockString(const TInterfaceBlock &interfaceBlock, TString UniformHLSL::uniformBlockString(const TInterfaceBlock &interfaceBlock,
unsigned int registerIndex, unsigned int registerIndex,
unsigned int arrayIndex) unsigned int arrayIndex)
{ {
...@@ -411,12 +410,12 @@ TString UniformHLSL::interfaceBlockString(const TInterfaceBlock &interfaceBlock, ...@@ -411,12 +410,12 @@ TString UniformHLSL::interfaceBlockString(const TInterfaceBlock &interfaceBlock,
if (interfaceBlock.hasInstanceName()) if (interfaceBlock.hasInstanceName())
{ {
hlsl += " " + InterfaceBlockStructName(interfaceBlock) + " " + hlsl += " " + InterfaceBlockStructName(interfaceBlock) + " " +
interfaceBlockInstanceString(interfaceBlock, arrayIndex) + ";\n"; uniformBlockInstanceString(interfaceBlock, arrayIndex) + ";\n";
} }
else else
{ {
const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage(); const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage();
hlsl += interfaceBlockMembersString(interfaceBlock, blockStorage); hlsl += uniformBlockMembersString(interfaceBlock, blockStorage);
} }
hlsl += "};\n\n"; hlsl += "};\n\n";
...@@ -424,7 +423,7 @@ TString UniformHLSL::interfaceBlockString(const TInterfaceBlock &interfaceBlock, ...@@ -424,7 +423,7 @@ TString UniformHLSL::interfaceBlockString(const TInterfaceBlock &interfaceBlock,
return hlsl; return hlsl;
} }
TString UniformHLSL::interfaceBlockInstanceString(const TInterfaceBlock &interfaceBlock, TString UniformHLSL::uniformBlockInstanceString(const TInterfaceBlock &interfaceBlock,
unsigned int arrayIndex) unsigned int arrayIndex)
{ {
if (!interfaceBlock.hasInstanceName()) if (!interfaceBlock.hasInstanceName())
...@@ -441,7 +440,7 @@ TString UniformHLSL::interfaceBlockInstanceString(const TInterfaceBlock &interfa ...@@ -441,7 +440,7 @@ TString UniformHLSL::interfaceBlockInstanceString(const TInterfaceBlock &interfa
} }
} }
TString UniformHLSL::interfaceBlockMembersString(const TInterfaceBlock &interfaceBlock, TString UniformHLSL::uniformBlockMembersString(const TInterfaceBlock &interfaceBlock,
TLayoutBlockStorage blockStorage) TLayoutBlockStorage blockStorage)
{ {
TString hlsl; TString hlsl;
...@@ -475,13 +474,13 @@ TString UniformHLSL::interfaceBlockMembersString(const TInterfaceBlock &interfac ...@@ -475,13 +474,13 @@ TString UniformHLSL::interfaceBlockMembersString(const TInterfaceBlock &interfac
return hlsl; return hlsl;
} }
TString UniformHLSL::interfaceBlockStructString(const TInterfaceBlock &interfaceBlock) TString UniformHLSL::uniformBlockStructString(const TInterfaceBlock &interfaceBlock)
{ {
const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage(); const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage();
return "struct " + InterfaceBlockStructName(interfaceBlock) + return "struct " + InterfaceBlockStructName(interfaceBlock) +
"\n" "\n"
"{\n" + "{\n" +
interfaceBlockMembersString(interfaceBlock, blockStorage) + "};\n\n"; uniformBlockMembersString(interfaceBlock, blockStorage) + "};\n\n";
} }
} }
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
// found in the LICENSE file. // found in the LICENSE file.
// //
// UniformHLSL.h: // UniformHLSL.h:
// Methods for GLSL to HLSL translation for uniforms and interface blocks. // Methods for GLSL to HLSL translation for uniforms and uniform blocks.
// //
#ifndef COMPILER_TRANSLATOR_UNIFORMHLSL_H_ #ifndef COMPILER_TRANSLATOR_UNIFORMHLSL_H_
...@@ -25,7 +25,7 @@ class UniformHLSL : angle::NonCopyable ...@@ -25,7 +25,7 @@ class UniformHLSL : angle::NonCopyable
const std::vector<Uniform> &uniforms); const std::vector<Uniform> &uniforms);
void reserveUniformRegisters(unsigned int registerCount); void reserveUniformRegisters(unsigned int registerCount);
void reserveInterfaceBlockRegisters(unsigned int registerCount); void reserveUniformBlockRegisters(unsigned int registerCount);
void uniformsHeader(TInfoSinkBase &out, void uniformsHeader(TInfoSinkBase &out,
ShShaderOutput outputType, ShShaderOutput outputType,
const ReferencedSymbols &referencedUniforms); const ReferencedSymbols &referencedUniforms);
...@@ -33,15 +33,15 @@ class UniformHLSL : angle::NonCopyable ...@@ -33,15 +33,15 @@ class UniformHLSL : angle::NonCopyable
// Must be called after uniformsHeader // Must be called after uniformsHeader
void samplerMetadataUniforms(TInfoSinkBase &out, const char *reg); void samplerMetadataUniforms(TInfoSinkBase &out, const char *reg);
TString interfaceBlocksHeader(const ReferencedSymbols &referencedInterfaceBlocks); TString uniformBlocksHeader(const ReferencedSymbols &referencedInterfaceBlocks);
// Used for direct index references // Used for direct index references
static TString interfaceBlockInstanceString(const TInterfaceBlock &interfaceBlock, static TString uniformBlockInstanceString(const TInterfaceBlock &interfaceBlock,
unsigned int arrayIndex); unsigned int arrayIndex);
const std::map<std::string, unsigned int> &getInterfaceBlockRegisterMap() const const std::map<std::string, unsigned int> &getUniformBlockRegisterMap() const
{ {
return mInterfaceBlockRegisterMap; return mUniformBlockRegisterMap;
} }
const std::map<std::string, unsigned int> &getUniformRegisterMap() const const std::map<std::string, unsigned int> &getUniformRegisterMap() const
{ {
...@@ -49,12 +49,12 @@ class UniformHLSL : angle::NonCopyable ...@@ -49,12 +49,12 @@ class UniformHLSL : angle::NonCopyable
} }
private: private:
TString interfaceBlockString(const TInterfaceBlock &interfaceBlock, TString uniformBlockString(const TInterfaceBlock &interfaceBlock,
unsigned int registerIndex, unsigned int registerIndex,
unsigned int arrayIndex); unsigned int arrayIndex);
TString interfaceBlockMembersString(const TInterfaceBlock &interfaceBlock, TString uniformBlockMembersString(const TInterfaceBlock &interfaceBlock,
TLayoutBlockStorage blockStorage); TLayoutBlockStorage blockStorage);
TString interfaceBlockStructString(const TInterfaceBlock &interfaceBlock); TString uniformBlockStructString(const TInterfaceBlock &interfaceBlock);
const Uniform *findUniformByName(const TString &name) const; const Uniform *findUniformByName(const TString &name) const;
void outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out, void outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out,
...@@ -83,13 +83,13 @@ class UniformHLSL : angle::NonCopyable ...@@ -83,13 +83,13 @@ class UniformHLSL : angle::NonCopyable
unsigned int *groupTextureRegisterIndex); unsigned int *groupTextureRegisterIndex);
unsigned int mUniformRegister; unsigned int mUniformRegister;
unsigned int mInterfaceBlockRegister; unsigned int mUniformBlockRegister;
unsigned int mSamplerRegister; unsigned int mSamplerRegister;
StructureHLSL *mStructureHLSL; StructureHLSL *mStructureHLSL;
ShShaderOutput mOutputType; ShShaderOutput mOutputType;
const std::vector<Uniform> &mUniforms; const std::vector<Uniform> &mUniforms;
std::map<std::string, unsigned int> mInterfaceBlockRegisterMap; std::map<std::string, unsigned int> mUniformBlockRegisterMap;
std::map<std::string, unsigned int> mUniformRegisterMap; std::map<std::string, unsigned int> mUniformRegisterMap;
}; };
} }
......
...@@ -35,6 +35,20 @@ BlockLayoutType GetBlockLayoutType(TLayoutBlockStorage blockStorage) ...@@ -35,6 +35,20 @@ BlockLayoutType GetBlockLayoutType(TLayoutBlockStorage blockStorage)
} }
} }
BlockType GetBlockType(TQualifier qualifier)
{
switch (qualifier)
{
case EvqUniform:
return BlockType::BLOCK_UNIFORM;
case EvqBuffer:
return BlockType::BLOCK_BUFFER;
default:
UNREACHABLE();
return BlockType::BLOCK_UNIFORM;
}
}
void ExpandUserDefinedVariable(const ShaderVariable &variable, void ExpandUserDefinedVariable(const ShaderVariable &variable,
const std::string &name, const std::string &name,
const std::string &mappedName, const std::string &mappedName,
...@@ -94,7 +108,8 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -94,7 +108,8 @@ class CollectVariablesTraverser : public TIntermTraverser
std::vector<Uniform> *uniforms, std::vector<Uniform> *uniforms,
std::vector<Varying> *inputVaryings, std::vector<Varying> *inputVaryings,
std::vector<Varying> *outputVaryings, std::vector<Varying> *outputVaryings,
std::vector<InterfaceBlock> *interfaceBlocks, std::vector<InterfaceBlock> *uniformBlocks,
std::vector<InterfaceBlock> *shaderStorageBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
...@@ -128,7 +143,8 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -128,7 +143,8 @@ class CollectVariablesTraverser : public TIntermTraverser
std::vector<Uniform> *mUniforms; std::vector<Uniform> *mUniforms;
std::vector<Varying> *mInputVaryings; std::vector<Varying> *mInputVaryings;
std::vector<Varying> *mOutputVaryings; std::vector<Varying> *mOutputVaryings;
std::vector<InterfaceBlock> *mInterfaceBlocks; std::vector<InterfaceBlock> *mUniformBlocks;
std::vector<InterfaceBlock> *mShaderStorageBlocks;
std::map<std::string, InterfaceBlockField *> mInterfaceBlockFields; std::map<std::string, InterfaceBlockField *> mInterfaceBlockFields;
...@@ -161,7 +177,8 @@ CollectVariablesTraverser::CollectVariablesTraverser( ...@@ -161,7 +177,8 @@ CollectVariablesTraverser::CollectVariablesTraverser(
std::vector<sh::Uniform> *uniforms, std::vector<sh::Uniform> *uniforms,
std::vector<sh::Varying> *inputVaryings, std::vector<sh::Varying> *inputVaryings,
std::vector<sh::Varying> *outputVaryings, std::vector<sh::Varying> *outputVaryings,
std::vector<sh::InterfaceBlock> *interfaceBlocks, std::vector<sh::InterfaceBlock> *uniformBlocks,
std::vector<sh::InterfaceBlock> *shaderStorageBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
...@@ -172,7 +189,8 @@ CollectVariablesTraverser::CollectVariablesTraverser( ...@@ -172,7 +189,8 @@ CollectVariablesTraverser::CollectVariablesTraverser(
mUniforms(uniforms), mUniforms(uniforms),
mInputVaryings(inputVaryings), mInputVaryings(inputVaryings),
mOutputVaryings(outputVaryings), mOutputVaryings(outputVaryings),
mInterfaceBlocks(interfaceBlocks), mUniformBlocks(uniformBlocks),
mShaderStorageBlocks(shaderStorageBlocks),
mDepthRangeAdded(false), mDepthRangeAdded(false),
mPointCoordAdded(false), mPointCoordAdded(false),
mFrontFacingAdded(false), mFrontFacingAdded(false),
...@@ -347,7 +365,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) ...@@ -347,7 +365,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol)
if (interfaceBlock) if (interfaceBlock)
{ {
InterfaceBlock *namedBlock = InterfaceBlock *namedBlock =
FindVariable(interfaceBlock->name(), mInterfaceBlocks); FindVariable(interfaceBlock->name(), mUniformBlocks);
ASSERT(namedBlock); ASSERT(namedBlock);
var = FindVariable(symbolName, &namedBlock->fields); var = FindVariable(symbolName, &namedBlock->fields);
...@@ -548,6 +566,7 @@ InterfaceBlock CollectVariablesTraverser::recordInterfaceBlock(const TIntermSymb ...@@ -548,6 +566,7 @@ InterfaceBlock CollectVariablesTraverser::recordInterfaceBlock(const TIntermSymb
interfaceBlock.isRowMajorLayout = (blockType->matrixPacking() == EmpRowMajor); interfaceBlock.isRowMajorLayout = (blockType->matrixPacking() == EmpRowMajor);
interfaceBlock.binding = blockType->blockBinding(); interfaceBlock.binding = blockType->blockBinding();
interfaceBlock.layout = GetBlockLayoutType(blockType->blockStorage()); interfaceBlock.layout = GetBlockLayoutType(blockType->blockStorage());
interfaceBlock.blockType = GetBlockType(variable.getType().getQualifier());
// Gather field information // Gather field information
for (const TField *field : blockType->fields()) for (const TField *field : blockType->fields())
...@@ -605,12 +624,13 @@ bool CollectVariablesTraverser::visitDeclaration(Visit, TIntermDeclaration *node ...@@ -605,12 +624,13 @@ bool CollectVariablesTraverser::visitDeclaration(Visit, TIntermDeclaration *node
if (typedNode.getBasicType() == EbtInterfaceBlock) if (typedNode.getBasicType() == EbtInterfaceBlock)
{ {
// TODO(jiajia.qin@intel.com): In order not to affect the old set of mInterfaceBlocks,
// only uniform blocks are added into mInterfaceBlocks. Refactor it to gather
// uniformBlocks and shaderStorageBlocks separately.
if (qualifier == EvqUniform) if (qualifier == EvqUniform)
{ {
mInterfaceBlocks->push_back(recordInterfaceBlock(variable)); mUniformBlocks->push_back(recordInterfaceBlock(variable));
}
else if (qualifier == EvqBuffer)
{
mShaderStorageBlocks->push_back(recordInterfaceBlock(variable));
} }
} }
else else
...@@ -659,16 +679,16 @@ bool CollectVariablesTraverser::visitBinary(Visit, TIntermBinary *binaryNode) ...@@ -659,16 +679,16 @@ bool CollectVariablesTraverser::visitBinary(Visit, TIntermBinary *binaryNode)
ASSERT(constantUnion); ASSERT(constantUnion);
const TInterfaceBlock *interfaceBlock = blockNode->getType().getInterfaceBlock(); const TInterfaceBlock *interfaceBlock = blockNode->getType().getInterfaceBlock();
InterfaceBlock *namedBlock = FindVariable(interfaceBlock->name(), mInterfaceBlocks); InterfaceBlock *namedBlock = FindVariable(interfaceBlock->name(), mUniformBlocks);
// TODO(jiajia.qin@intel.com): Currently, only uniform blocks are added into if (!namedBlock)
// mInterfaceBlocks.
if (namedBlock)
{ {
namedBlock = FindVariable(interfaceBlock->name(), mShaderStorageBlocks);
}
ASSERT(namedBlock);
namedBlock->staticUse = true; namedBlock->staticUse = true;
unsigned int fieldIndex = static_cast<unsigned int>(constantUnion->getIConst(0)); unsigned int fieldIndex = static_cast<unsigned int>(constantUnion->getIConst(0));
ASSERT(fieldIndex < namedBlock->fields.size()); ASSERT(fieldIndex < namedBlock->fields.size());
namedBlock->fields[fieldIndex].staticUse = true; namedBlock->fields[fieldIndex].staticUse = true;
}
return false; return false;
} }
...@@ -683,15 +703,16 @@ void CollectVariables(TIntermBlock *root, ...@@ -683,15 +703,16 @@ void CollectVariables(TIntermBlock *root,
std::vector<Uniform> *uniforms, std::vector<Uniform> *uniforms,
std::vector<Varying> *inputVaryings, std::vector<Varying> *inputVaryings,
std::vector<Varying> *outputVaryings, std::vector<Varying> *outputVaryings,
std::vector<InterfaceBlock> *interfaceBlocks, std::vector<InterfaceBlock> *uniformBlocks,
std::vector<InterfaceBlock> *shaderStorageBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
const TExtensionBehavior &extensionBehavior) const TExtensionBehavior &extensionBehavior)
{ {
CollectVariablesTraverser collect(attributes, outputVariables, uniforms, inputVaryings, CollectVariablesTraverser collect(attributes, outputVariables, uniforms, inputVaryings,
outputVaryings, interfaceBlocks, hashFunction, symbolTable, outputVaryings, uniformBlocks, shaderStorageBlocks,
shaderVersion, extensionBehavior); hashFunction, symbolTable, shaderVersion, extensionBehavior);
root->traverse(&collect); root->traverse(&collect);
} }
......
...@@ -23,7 +23,8 @@ void CollectVariables(TIntermBlock *root, ...@@ -23,7 +23,8 @@ void CollectVariables(TIntermBlock *root,
std::vector<Uniform> *uniforms, std::vector<Uniform> *uniforms,
std::vector<Varying> *inputVaryings, std::vector<Varying> *inputVaryings,
std::vector<Varying> *outputVaryings, std::vector<Varying> *outputVaryings,
std::vector<InterfaceBlock> *interfaceBlocks, std::vector<InterfaceBlock> *uniformBlocks,
std::vector<InterfaceBlock> *shaderStorageBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
......
...@@ -2094,7 +2094,7 @@ bool Program::linkUniformBlocks(const Context *context, InfoLog &infoLog) ...@@ -2094,7 +2094,7 @@ bool Program::linkUniformBlocks(const Context *context, InfoLog &infoLog)
if (mState.mAttachedComputeShader) if (mState.mAttachedComputeShader)
{ {
Shader &computeShader = *mState.mAttachedComputeShader; Shader &computeShader = *mState.mAttachedComputeShader;
const auto &computeInterfaceBlocks = computeShader.getInterfaceBlocks(context); const auto &computeInterfaceBlocks = computeShader.getUniformBlocks(context);
if (!validateUniformBlocksCount( if (!validateUniformBlocksCount(
caps.maxComputeUniformBlocks, computeInterfaceBlocks, caps.maxComputeUniformBlocks, computeInterfaceBlocks,
...@@ -2109,8 +2109,8 @@ bool Program::linkUniformBlocks(const Context *context, InfoLog &infoLog) ...@@ -2109,8 +2109,8 @@ bool Program::linkUniformBlocks(const Context *context, InfoLog &infoLog)
Shader &vertexShader = *mState.mAttachedVertexShader; Shader &vertexShader = *mState.mAttachedVertexShader;
Shader &fragmentShader = *mState.mAttachedFragmentShader; Shader &fragmentShader = *mState.mAttachedFragmentShader;
const auto &vertexInterfaceBlocks = vertexShader.getInterfaceBlocks(context); const auto &vertexInterfaceBlocks = vertexShader.getUniformBlocks(context);
const auto &fragmentInterfaceBlocks = fragmentShader.getInterfaceBlocks(context); const auto &fragmentInterfaceBlocks = fragmentShader.getUniformBlocks(context);
if (!validateUniformBlocksCount( if (!validateUniformBlocksCount(
caps.maxVertexUniformBlocks, vertexInterfaceBlocks, caps.maxVertexUniformBlocks, vertexInterfaceBlocks,
...@@ -2674,7 +2674,7 @@ void Program::gatherInterfaceBlockInfo(const Context *context) ...@@ -2674,7 +2674,7 @@ void Program::gatherInterfaceBlockInfo(const Context *context)
{ {
Shader *computeShader = mState.getAttachedComputeShader(); Shader *computeShader = mState.getAttachedComputeShader();
for (const sh::InterfaceBlock &computeBlock : computeShader->getInterfaceBlocks(context)) for (const sh::InterfaceBlock &computeBlock : computeShader->getUniformBlocks(context))
{ {
// Only 'packed' blocks are allowed to be considered inactive. // Only 'packed' blocks are allowed to be considered inactive.
...@@ -2698,7 +2698,7 @@ void Program::gatherInterfaceBlockInfo(const Context *context) ...@@ -2698,7 +2698,7 @@ void Program::gatherInterfaceBlockInfo(const Context *context)
Shader *vertexShader = mState.getAttachedVertexShader(); Shader *vertexShader = mState.getAttachedVertexShader();
for (const sh::InterfaceBlock &vertexBlock : vertexShader->getInterfaceBlocks(context)) for (const sh::InterfaceBlock &vertexBlock : vertexShader->getUniformBlocks(context))
{ {
// Only 'packed' blocks are allowed to be considered inactive. // Only 'packed' blocks are allowed to be considered inactive.
if (!vertexBlock.staticUse && vertexBlock.layout == sh::BLOCKLAYOUT_PACKED) if (!vertexBlock.staticUse && vertexBlock.layout == sh::BLOCKLAYOUT_PACKED)
...@@ -2713,7 +2713,7 @@ void Program::gatherInterfaceBlockInfo(const Context *context) ...@@ -2713,7 +2713,7 @@ void Program::gatherInterfaceBlockInfo(const Context *context)
Shader *fragmentShader = mState.getAttachedFragmentShader(); Shader *fragmentShader = mState.getAttachedFragmentShader();
for (const sh::InterfaceBlock &fragmentBlock : fragmentShader->getInterfaceBlocks(context)) for (const sh::InterfaceBlock &fragmentBlock : fragmentShader->getUniformBlocks(context))
{ {
// Only 'packed' blocks are allowed to be considered inactive. // Only 'packed' blocks are allowed to be considered inactive.
if (!fragmentBlock.staticUse && fragmentBlock.layout == sh::BLOCKLAYOUT_PACKED) if (!fragmentBlock.staticUse && fragmentBlock.layout == sh::BLOCKLAYOUT_PACKED)
......
...@@ -270,7 +270,8 @@ void Shader::compile(const Context *context) ...@@ -270,7 +270,8 @@ void Shader::compile(const Context *context)
mState.mShaderVersion = 100; mState.mShaderVersion = 100;
mState.mVaryings.clear(); mState.mVaryings.clear();
mState.mUniforms.clear(); mState.mUniforms.clear();
mState.mInterfaceBlocks.clear(); mState.mUniformBlocks.clear();
mState.mShaderStorageBlocks.clear();
mState.mActiveAttributes.clear(); mState.mActiveAttributes.clear();
mState.mActiveOutputVariables.clear(); mState.mActiveOutputVariables.clear();
mState.mNumViews = -1; mState.mNumViews = -1;
...@@ -361,7 +362,8 @@ void Shader::resolveCompile(const Context *context) ...@@ -361,7 +362,8 @@ void Shader::resolveCompile(const Context *context)
mState.mVaryings = GetShaderVariables(sh::GetVaryings(compilerHandle)); mState.mVaryings = GetShaderVariables(sh::GetVaryings(compilerHandle));
mState.mUniforms = GetShaderVariables(sh::GetUniforms(compilerHandle)); mState.mUniforms = GetShaderVariables(sh::GetUniforms(compilerHandle));
mState.mInterfaceBlocks = GetShaderVariables(sh::GetInterfaceBlocks(compilerHandle)); mState.mUniformBlocks = GetShaderVariables(sh::GetUniformBlocks(compilerHandle));
mState.mShaderStorageBlocks = GetShaderVariables(sh::GetShaderStorageBlocks(compilerHandle));
switch (mState.mShaderType) switch (mState.mShaderType)
{ {
...@@ -451,10 +453,16 @@ const std::vector<sh::Uniform> &Shader::getUniforms(const Context *context) ...@@ -451,10 +453,16 @@ const std::vector<sh::Uniform> &Shader::getUniforms(const Context *context)
return mState.getUniforms(); return mState.getUniforms();
} }
const std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks(const Context *context) const std::vector<sh::InterfaceBlock> &Shader::getUniformBlocks(const Context *context)
{ {
resolveCompile(context); resolveCompile(context);
return mState.getInterfaceBlocks(); return mState.getUniformBlocks();
}
const std::vector<sh::InterfaceBlock> &Shader::getShaderStorageBlocks(const Context *context)
{
resolveCompile(context);
return mState.getShaderStorageBlocks();
} }
const std::vector<sh::Attribute> &Shader::getActiveAttributes(const Context *context) const std::vector<sh::Attribute> &Shader::getActiveAttributes(const Context *context)
......
...@@ -64,7 +64,11 @@ class ShaderState final : angle::NonCopyable ...@@ -64,7 +64,11 @@ class ShaderState final : angle::NonCopyable
const std::vector<sh::Varying> &getVaryings() const { return mVaryings; } const std::vector<sh::Varying> &getVaryings() const { return mVaryings; }
const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; } const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; }
const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const { return mInterfaceBlocks; } const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; }
const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const
{
return mShaderStorageBlocks;
}
const std::vector<sh::Attribute> &getActiveAttributes() const { return mActiveAttributes; } const std::vector<sh::Attribute> &getActiveAttributes() const { return mActiveAttributes; }
const std::vector<sh::OutputVariable> &getActiveOutputVariables() const const std::vector<sh::OutputVariable> &getActiveOutputVariables() const
{ {
...@@ -87,7 +91,8 @@ class ShaderState final : angle::NonCopyable ...@@ -87,7 +91,8 @@ class ShaderState final : angle::NonCopyable
std::vector<sh::Varying> mVaryings; std::vector<sh::Varying> mVaryings;
std::vector<sh::Uniform> mUniforms; std::vector<sh::Uniform> mUniforms;
std::vector<sh::InterfaceBlock> mInterfaceBlocks; std::vector<sh::InterfaceBlock> mUniformBlocks;
std::vector<sh::InterfaceBlock> mShaderStorageBlocks;
std::vector<sh::Attribute> mActiveAttributes; std::vector<sh::Attribute> mActiveAttributes;
std::vector<sh::OutputVariable> mActiveOutputVariables; std::vector<sh::OutputVariable> mActiveOutputVariables;
...@@ -148,7 +153,8 @@ class Shader final : angle::NonCopyable, public LabeledObject ...@@ -148,7 +153,8 @@ class Shader final : angle::NonCopyable, public LabeledObject
const std::vector<sh::Varying> &getVaryings(const Context *context); const std::vector<sh::Varying> &getVaryings(const Context *context);
const std::vector<sh::Uniform> &getUniforms(const Context *context); const std::vector<sh::Uniform> &getUniforms(const Context *context);
const std::vector<sh::InterfaceBlock> &getInterfaceBlocks(const Context *context); const std::vector<sh::InterfaceBlock> &getUniformBlocks(const Context *context);
const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks(const Context *context);
const std::vector<sh::Attribute> &getActiveAttributes(const Context *context); const std::vector<sh::Attribute> &getActiveAttributes(const Context *context);
const std::vector<sh::OutputVariable> &getActiveOutputVariables(const Context *context); const std::vector<sh::OutputVariable> &getActiveOutputVariables(const Context *context);
......
...@@ -1603,7 +1603,7 @@ GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLo ...@@ -1603,7 +1603,7 @@ GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLo
void ProgramD3D::initUniformBlockInfo(const gl::Context *context, gl::Shader *shader) void ProgramD3D::initUniformBlockInfo(const gl::Context *context, gl::Shader *shader)
{ {
for (const sh::InterfaceBlock &interfaceBlock : shader->getInterfaceBlocks(context)) for (const sh::InterfaceBlock &interfaceBlock : shader->getUniformBlocks(context))
{ {
if (!interfaceBlock.staticUse && interfaceBlock.layout == sh::BLOCKLAYOUT_PACKED) if (!interfaceBlock.staticUse && interfaceBlock.layout == sh::BLOCKLAYOUT_PACKED)
continue; continue;
...@@ -1639,8 +1639,7 @@ void ProgramD3D::ensureUniformBlocksInitialized() ...@@ -1639,8 +1639,7 @@ void ProgramD3D::ensureUniformBlocksInitialized()
if (uniformBlock.vertexStaticUse) if (uniformBlock.vertexStaticUse)
{ {
ASSERT(vertexShaderD3D != nullptr); ASSERT(vertexShaderD3D != nullptr);
unsigned int baseRegister = unsigned int baseRegister = vertexShaderD3D->getUniformBlockRegister(uniformBlock.name);
vertexShaderD3D->getInterfaceBlockRegister(uniformBlock.name);
d3dUniformBlock.vsRegisterIndex = baseRegister + uniformBlockElement; d3dUniformBlock.vsRegisterIndex = baseRegister + uniformBlockElement;
} }
...@@ -1648,7 +1647,7 @@ void ProgramD3D::ensureUniformBlocksInitialized() ...@@ -1648,7 +1647,7 @@ void ProgramD3D::ensureUniformBlocksInitialized()
{ {
ASSERT(fragmentShaderD3D != nullptr); ASSERT(fragmentShaderD3D != nullptr);
unsigned int baseRegister = unsigned int baseRegister =
fragmentShaderD3D->getInterfaceBlockRegister(uniformBlock.name); fragmentShaderD3D->getUniformBlockRegister(uniformBlock.name);
d3dUniformBlock.psRegisterIndex = baseRegister + uniformBlockElement; d3dUniformBlock.psRegisterIndex = baseRegister + uniformBlockElement;
} }
...@@ -1656,7 +1655,7 @@ void ProgramD3D::ensureUniformBlocksInitialized() ...@@ -1656,7 +1655,7 @@ void ProgramD3D::ensureUniformBlocksInitialized()
{ {
ASSERT(computeShaderD3D != nullptr); ASSERT(computeShaderD3D != nullptr);
unsigned int baseRegister = unsigned int baseRegister =
computeShaderD3D->getInterfaceBlockRegister(uniformBlock.name); computeShaderD3D->getUniformBlockRegister(uniformBlock.name);
d3dUniformBlock.csRegisterIndex = baseRegister + uniformBlockElement; d3dUniformBlock.csRegisterIndex = baseRegister + uniformBlockElement;
} }
......
...@@ -138,10 +138,10 @@ unsigned int ShaderD3D::getUniformRegister(const std::string &uniformName) const ...@@ -138,10 +138,10 @@ unsigned int ShaderD3D::getUniformRegister(const std::string &uniformName) const
return mUniformRegisterMap.find(uniformName)->second; return mUniformRegisterMap.find(uniformName)->second;
} }
unsigned int ShaderD3D::getInterfaceBlockRegister(const std::string &blockName) const unsigned int ShaderD3D::getUniformBlockRegister(const std::string &blockName) const
{ {
ASSERT(mInterfaceBlockRegisterMap.count(blockName) > 0); ASSERT(mUniformBlockRegisterMap.count(blockName) > 0);
return mInterfaceBlockRegisterMap.find(blockName)->second; return mUniformBlockRegisterMap.find(blockName)->second;
} }
ShShaderOutput ShaderD3D::getCompilerOutputType() const ShShaderOutput ShaderD3D::getCompilerOutputType() const
...@@ -211,16 +211,16 @@ bool ShaderD3D::postTranslateCompile(gl::Compiler *compiler, std::string *infoLo ...@@ -211,16 +211,16 @@ bool ShaderD3D::postTranslateCompile(gl::Compiler *compiler, std::string *infoLo
mUniformRegisterMap = GetUniformRegisterMap(sh::GetUniformRegisterMap(compilerHandle)); mUniformRegisterMap = GetUniformRegisterMap(sh::GetUniformRegisterMap(compilerHandle));
for (const sh::InterfaceBlock &interfaceBlock : mData.getInterfaceBlocks()) for (const sh::InterfaceBlock &interfaceBlock : mData.getUniformBlocks())
{ {
if (interfaceBlock.staticUse) if (interfaceBlock.staticUse)
{ {
unsigned int index = static_cast<unsigned int>(-1); unsigned int index = static_cast<unsigned int>(-1);
bool blockRegisterResult = bool blockRegisterResult =
sh::GetInterfaceBlockRegister(compilerHandle, interfaceBlock.name, &index); sh::GetUniformBlockRegister(compilerHandle, interfaceBlock.name, &index);
ASSERT(blockRegisterResult); ASSERT(blockRegisterResult);
mInterfaceBlockRegisterMap[interfaceBlock.name] = index; mUniformBlockRegisterMap[interfaceBlock.name] = index;
} }
} }
......
...@@ -46,7 +46,7 @@ class ShaderD3D : public ShaderImpl ...@@ -46,7 +46,7 @@ class ShaderD3D : public ShaderImpl
// using dot (.) operator. // using dot (.) operator.
unsigned int getUniformRegister(const std::string &uniformName) const; unsigned int getUniformRegister(const std::string &uniformName) const;
unsigned int getInterfaceBlockRegister(const std::string &blockName) const; unsigned int getUniformBlockRegister(const std::string &blockName) const;
void appendDebugInfo(const std::string &info) const { mDebugInfo += info; } void appendDebugInfo(const std::string &info) const { mDebugInfo += info; }
void generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const; void generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const;
...@@ -80,7 +80,7 @@ class ShaderD3D : public ShaderImpl ...@@ -80,7 +80,7 @@ class ShaderD3D : public ShaderImpl
ShShaderOutput mCompilerOutputType; ShShaderOutput mCompilerOutputType;
mutable std::string mDebugInfo; mutable std::string mDebugInfo;
std::map<std::string, unsigned int> mUniformRegisterMap; std::map<std::string, unsigned int> mUniformRegisterMap;
std::map<std::string, unsigned int> mInterfaceBlockRegisterMap; std::map<std::string, unsigned int> mUniformBlockRegisterMap;
ShCompileOptions mAdditionalOptions; ShCompileOptions mAdditionalOptions;
}; };
} // namespace rx } // namespace rx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment