Commit df73a8e5 by Qin Jiajia Committed by Commit Bot

ES31: Use std::map<const TField *, BlockMemberInfo> to save ssbo info

Bug: angleproject:1951 Change-Id: I9d6a19c0d63065db69985845a1cd68cfd4b99d1f Reviewed-on: https://chromium-review.googlesource.com/c/1298913 Commit-Queue: Jiajia Qin <jiajia.qin@intel.com> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent bfe31c42
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include "compiler/translator/ShaderStorageBlockOutputHLSL.h" #include "compiler/translator/ShaderStorageBlockOutputHLSL.h"
#include "compiler/translator/ResourcesHLSL.h" #include "compiler/translator/ResourcesHLSL.h"
#include "compiler/translator/blocklayout.h"
#include "compiler/translator/blocklayoutHLSL.h" #include "compiler/translator/blocklayoutHLSL.h"
#include "compiler/translator/util.h" #include "compiler/translator/util.h"
...@@ -49,12 +48,14 @@ const TField *GetFieldMemberInShaderStorageBlock(const TInterfaceBlock *interfac ...@@ -49,12 +48,14 @@ const TField *GetFieldMemberInShaderStorageBlock(const TInterfaceBlock *interfac
return nullptr; return nullptr;
} }
void SetShaderStorageBlockFieldMemberInfo(const TFieldList &fields, void GetShaderStorageBlockFieldMemberInfo(const TFieldList &fields,
sh::BlockLayoutEncoder *encoder, sh::BlockLayoutEncoder *encoder,
TLayoutBlockStorage storage); TLayoutBlockStorage storage,
BlockMemberInfoMap *blockInfoOut);
size_t SetBlockFieldMemberInfoAndReturnBlockSize(const TFieldList &fields, size_t GetBlockFieldMemberInfoAndReturnBlockSize(const TFieldList &fields,
TLayoutBlockStorage storage) TLayoutBlockStorage storage,
BlockMemberInfoMap *blockInfoOut)
{ {
sh::Std140BlockEncoder std140Encoder; sh::Std140BlockEncoder std140Encoder;
sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED, false); sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED, false);
...@@ -70,31 +71,31 @@ size_t SetBlockFieldMemberInfoAndReturnBlockSize(const TFieldList &fields, ...@@ -70,31 +71,31 @@ size_t SetBlockFieldMemberInfoAndReturnBlockSize(const TFieldList &fields,
structureEncoder = &hlslEncoder; structureEncoder = &hlslEncoder;
} }
SetShaderStorageBlockFieldMemberInfo(fields, structureEncoder, storage); GetShaderStorageBlockFieldMemberInfo(fields, structureEncoder, storage, blockInfoOut);
structureEncoder->exitAggregateType(); structureEncoder->exitAggregateType();
return structureEncoder->getBlockSize(); return structureEncoder->getBlockSize();
} }
// TODO(jiajia.qin@intel.com): Save the offset/arrystride into a std::map<const TField *, // TODO(jiajia.qin@intel.com): use correct row major attribute for structure field member.
// BlockMemberInfo> BlockLayoutMap instead of adding offset/arrayStride to the TField.
// http://anglebug.com/1951 // http://anglebug.com/1951
void SetShaderStorageBlockFieldMemberInfo(const TFieldList &fields, void GetShaderStorageBlockFieldMemberInfo(const TFieldList &fields,
sh::BlockLayoutEncoder *encoder, sh::BlockLayoutEncoder *encoder,
TLayoutBlockStorage storage) TLayoutBlockStorage storage,
BlockMemberInfoMap *blockInfoOut)
{ {
for (TField *field : fields) for (const TField *field : fields)
{ {
const TType &fieldType = *field->type(); const TType &fieldType = *field->type();
if (fieldType.getStruct()) if (fieldType.getStruct())
{ {
encoder->enterAggregateType(); encoder->enterAggregateType();
field->setOffset(encoder->getBlockSize());
// This is to set structure member offset and array stride using a new encoder to ensure // This is to set structure member offset and array stride using a new encoder to ensure
// that the first field member offset in structure is always zero. // that the first field member offset in structure is always zero.
size_t structureStride = size_t structureStride = GetBlockFieldMemberInfoAndReturnBlockSize(
SetBlockFieldMemberInfoAndReturnBlockSize(fieldType.getStruct()->fields(), storage); fieldType.getStruct()->fields(), storage, blockInfoOut);
field->setArrayStride(structureStride); const BlockMemberInfo memberInfo(static_cast<int>(encoder->getBlockSize()),
static_cast<int>(structureStride), 0, false);
(*blockInfoOut)[field] = memberInfo;
// Below if-else is in order to get correct offset for the field members after structure // Below if-else is in order to get correct offset for the field members after structure
// field. // field.
...@@ -124,13 +125,13 @@ void SetShaderStorageBlockFieldMemberInfo(const TFieldList &fields, ...@@ -124,13 +125,13 @@ void SetShaderStorageBlockFieldMemberInfo(const TFieldList &fields,
const BlockMemberInfo &memberInfo = const BlockMemberInfo &memberInfo =
encoder->encodeType(GLVariableType(fieldType), fieldArraySizes, encoder->encodeType(GLVariableType(fieldType), fieldArraySizes,
isRowMajorLayout && fieldType.isMatrix()); isRowMajorLayout && fieldType.isMatrix());
field->setOffset(memberInfo.offset); (*blockInfoOut)[field] = memberInfo;
field->setArrayStride(memberInfo.arrayStride);
} }
} }
} }
void SetShaderStorageBlockMembersOffset(const TInterfaceBlock *interfaceBlock) void GetShaderStorageBlockMembersInfo(const TInterfaceBlock *interfaceBlock,
BlockMemberInfoMap *blockInfoOut)
{ {
sh::Std140BlockEncoder std140Encoder; sh::Std140BlockEncoder std140Encoder;
sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED, false); sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED, false);
...@@ -146,8 +147,8 @@ void SetShaderStorageBlockMembersOffset(const TInterfaceBlock *interfaceBlock) ...@@ -146,8 +147,8 @@ void SetShaderStorageBlockMembersOffset(const TInterfaceBlock *interfaceBlock)
encoder = &hlslEncoder; encoder = &hlslEncoder;
} }
SetShaderStorageBlockFieldMemberInfo(interfaceBlock->fields(), encoder, GetShaderStorageBlockFieldMemberInfo(interfaceBlock->fields(), encoder,
interfaceBlock->blockStorage()); interfaceBlock->blockStorage(), blockInfoOut);
} }
bool IsInArrayOfArraysChain(TIntermTyped *node) bool IsInArrayOfArraysChain(TIntermTyped *node)
...@@ -262,7 +263,7 @@ void ShaderStorageBlockOutputHLSL::visitSymbol(TIntermSymbol *node) ...@@ -262,7 +263,7 @@ void ShaderStorageBlockOutputHLSL::visitSymbol(TIntermSymbol *node)
} }
mReferencedShaderStorageBlocks[interfaceBlock->uniqueId().get()] = mReferencedShaderStorageBlocks[interfaceBlock->uniqueId().get()] =
new TReferencedBlock(interfaceBlock, instanceVariable); new TReferencedBlock(interfaceBlock, instanceVariable);
SetShaderStorageBlockMembersOffset(interfaceBlock); GetShaderStorageBlockMembersInfo(interfaceBlock, &mBlockMemberInfoMap);
} }
if (variableType.isInterfaceBlock()) if (variableType.isInterfaceBlock())
{ {
...@@ -349,7 +350,7 @@ bool ShaderStorageBlockOutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -349,7 +350,7 @@ bool ShaderStorageBlockOutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
{ {
mReferencedShaderStorageBlocks[interfaceBlock->uniqueId().get()] = mReferencedShaderStorageBlocks[interfaceBlock->uniqueId().get()] =
new TReferencedBlock(interfaceBlock, &instanceArraySymbol->variable()); new TReferencedBlock(interfaceBlock, &instanceArraySymbol->variable());
SetShaderStorageBlockMembersOffset(interfaceBlock); GetShaderStorageBlockMembersInfo(interfaceBlock, &mBlockMemberInfoMap);
} }
const int arrayIndex = node->getRight()->getAsConstantUnion()->getIConst(0); const int arrayIndex = node->getRight()->getAsConstantUnion()->getIConst(0);
...@@ -482,13 +483,16 @@ void ShaderStorageBlockOutputHLSL::writeEOpIndexDirectOrIndirectOutput(TInfoSink ...@@ -482,13 +483,16 @@ void ShaderStorageBlockOutputHLSL::writeEOpIndexDirectOrIndirectOutput(TInfoSink
void ShaderStorageBlockOutputHLSL::writeDotOperatorOutput(TInfoSinkBase &out, const TField *field) void ShaderStorageBlockOutputHLSL::writeDotOperatorOutput(TInfoSinkBase &out, const TField *field)
{ {
out << str(field->getOffset()); auto fieldInfoIter = mBlockMemberInfoMap.find(field);
ASSERT(fieldInfoIter != mBlockMemberInfoMap.end());
const BlockMemberInfo &memberInfo = fieldInfoIter->second;
out << memberInfo.offset;
const TType &fieldType = *field->type(); const TType &fieldType = *field->type();
if (fieldType.isArray() && !isEndOfSSBOAccessChain()) if (fieldType.isArray() && !isEndOfSSBOAccessChain())
{ {
out << " + "; out << " + ";
out << field->getArrayStride(); out << memberInfo.arrayStride;
if (fieldType.isArrayOfArrays()) if (fieldType.isArrayOfArrays())
{ {
out << " * ("; out << " * (";
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_ #define COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_
#include "compiler/translator/ShaderStorageBlockFunctionHLSL.h" #include "compiler/translator/ShaderStorageBlockFunctionHLSL.h"
#include "compiler/translator/blocklayout.h"
#include "compiler/translator/tree_util/IntermTraverse.h" #include "compiler/translator/tree_util/IntermTraverse.h"
namespace sh namespace sh
...@@ -30,6 +31,9 @@ struct TReferencedBlock : angle::NonCopyable ...@@ -30,6 +31,9 @@ struct TReferencedBlock : angle::NonCopyable
// Maps from uniqueId to a variable. // Maps from uniqueId to a variable.
using ReferencedInterfaceBlocks = std::map<int, const TReferencedBlock *>; using ReferencedInterfaceBlocks = std::map<int, const TReferencedBlock *>;
// Used to save shader storage block field member information.
using BlockMemberInfoMap = std::map<const TField *, BlockMemberInfo>;
class ShaderStorageBlockOutputHLSL : public TIntermTraverser class ShaderStorageBlockOutputHLSL : public TIntermTraverser
{ {
public: public:
...@@ -69,6 +73,8 @@ class ShaderStorageBlockOutputHLSL : public TIntermTraverser ...@@ -69,6 +73,8 @@ class ShaderStorageBlockOutputHLSL : public TIntermTraverser
ShaderStorageBlockFunctionHLSL *mSSBOFunctionHLSL; ShaderStorageBlockFunctionHLSL *mSSBOFunctionHLSL;
ResourcesHLSL *mResourcesHLSL; ResourcesHLSL *mResourcesHLSL;
ReferencedInterfaceBlocks mReferencedShaderStorageBlocks; ReferencedInterfaceBlocks mReferencedShaderStorageBlocks;
BlockMemberInfoMap mBlockMemberInfoMap;
}; };
} }
......
...@@ -32,12 +32,7 @@ class TField : angle::NonCopyable ...@@ -32,12 +32,7 @@ class TField : angle::NonCopyable
public: public:
POOL_ALLOCATOR_NEW_DELETE(); POOL_ALLOCATOR_NEW_DELETE();
TField(TType *type, const ImmutableString &name, const TSourceLoc &line, SymbolType symbolType) TField(TType *type, const ImmutableString &name, const TSourceLoc &line, SymbolType symbolType)
: mType(type), : mType(type), mName(name), mLine(line), mSymbolType(symbolType)
mName(name),
mLine(line),
mSymbolType(symbolType),
mOffset(0),
mArrayStride(0)
{ {
ASSERT(mSymbolType != SymbolType::Empty); ASSERT(mSymbolType != SymbolType::Empty);
} }
...@@ -49,18 +44,12 @@ class TField : angle::NonCopyable ...@@ -49,18 +44,12 @@ class TField : angle::NonCopyable
const ImmutableString &name() const { return mName; } const ImmutableString &name() const { return mName; }
const TSourceLoc &line() const { return mLine; } const TSourceLoc &line() const { return mLine; }
SymbolType symbolType() const { return mSymbolType; } SymbolType symbolType() const { return mSymbolType; }
unsigned int getOffset() const { return mOffset; }
unsigned int getArrayStride() const { return mArrayStride; }
void setOffset(unsigned int offset) { mOffset = offset; }
void setArrayStride(int arrayStride) { mArrayStride = arrayStride; }
private: private:
TType *mType; TType *mType;
const ImmutableString mName; const ImmutableString mName;
const TSourceLoc mLine; const TSourceLoc mLine;
const SymbolType mSymbolType; const SymbolType mSymbolType;
unsigned int mOffset;
unsigned int mArrayStride;
}; };
typedef TVector<TField *> TFieldList; typedef TVector<TField *> TFieldList;
......
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