2626#include " compiler/translator/ShaderStorageBlockOutputHLSL.h"
2727
2828#include " compiler/translator/ResourcesHLSL.h"
29- #include " compiler/translator/blocklayout.h"
3029#include " compiler/translator/blocklayoutHLSL.h"
3130#include " compiler/translator/util.h"
3231
@@ -49,12 +48,14 @@ const TField *GetFieldMemberInShaderStorageBlock(const TInterfaceBlock *interfac
4948 return nullptr ;
5049}
5150
52- void SetShaderStorageBlockFieldMemberInfo (const TFieldList &fields,
51+ void GetShaderStorageBlockFieldMemberInfo (const TFieldList &fields,
5352 sh::BlockLayoutEncoder *encoder,
54- TLayoutBlockStorage storage);
53+ TLayoutBlockStorage storage,
54+ BlockMemberInfoMap *blockInfoOut);
5555
56- size_t SetBlockFieldMemberInfoAndReturnBlockSize (const TFieldList &fields,
57- TLayoutBlockStorage storage)
56+ size_t GetBlockFieldMemberInfoAndReturnBlockSize (const TFieldList &fields,
57+ TLayoutBlockStorage storage,
58+ BlockMemberInfoMap *blockInfoOut)
5859{
5960 sh::Std140BlockEncoder std140Encoder;
6061 sh::HLSLBlockEncoder hlslEncoder (sh::HLSLBlockEncoder::ENCODE_PACKED, false );
@@ -70,31 +71,31 @@ size_t SetBlockFieldMemberInfoAndReturnBlockSize(const TFieldList &fields,
7071 structureEncoder = &hlslEncoder;
7172 }
7273
73- SetShaderStorageBlockFieldMemberInfo (fields, structureEncoder, storage);
74+ GetShaderStorageBlockFieldMemberInfo (fields, structureEncoder, storage, blockInfoOut );
7475 structureEncoder->exitAggregateType ();
7576 return structureEncoder->getBlockSize ();
7677}
7778
78- // TODO(jiajia.qin@intel.com): Save the offset/arrystride into a std::map<const TField *,
79- // BlockMemberInfo> BlockLayoutMap instead of adding offset/arrayStride to the TField.
79+ // TODO(jiajia.qin@intel.com): use correct row major attribute for structure field member.
8080// http://anglebug.com/1951
81- void SetShaderStorageBlockFieldMemberInfo (const TFieldList &fields,
81+ void GetShaderStorageBlockFieldMemberInfo (const TFieldList &fields,
8282 sh::BlockLayoutEncoder *encoder,
83- TLayoutBlockStorage storage)
83+ TLayoutBlockStorage storage,
84+ BlockMemberInfoMap *blockInfoOut)
8485{
85- for (TField *field : fields)
86+ for (const TField *field : fields)
8687 {
8788 const TType &fieldType = *field->type ();
8889 if (fieldType.getStruct ())
8990 {
9091 encoder->enterAggregateType ();
91- field->setOffset (encoder->getBlockSize ());
92-
9392 // This is to set structure member offset and array stride using a new encoder to ensure
9493 // that the first field member offset in structure is always zero.
95- size_t structureStride =
96- SetBlockFieldMemberInfoAndReturnBlockSize (fieldType.getStruct ()->fields (), storage);
97- field->setArrayStride (structureStride);
94+ size_t structureStride = GetBlockFieldMemberInfoAndReturnBlockSize (
95+ fieldType.getStruct ()->fields (), storage, blockInfoOut);
96+ const BlockMemberInfo memberInfo (static_cast <int >(encoder->getBlockSize ()),
97+ static_cast <int >(structureStride), 0 , false );
98+ (*blockInfoOut)[field] = memberInfo;
9899
99100 // Below if-else is in order to get correct offset for the field members after structure
100101 // field.
@@ -124,13 +125,13 @@ void SetShaderStorageBlockFieldMemberInfo(const TFieldList &fields,
124125 const BlockMemberInfo &memberInfo =
125126 encoder->encodeType (GLVariableType (fieldType), fieldArraySizes,
126127 isRowMajorLayout && fieldType.isMatrix ());
127- field->setOffset (memberInfo.offset );
128- field->setArrayStride (memberInfo.arrayStride );
128+ (*blockInfoOut)[field] = memberInfo;
129129 }
130130 }
131131}
132132
133- void SetShaderStorageBlockMembersOffset (const TInterfaceBlock *interfaceBlock)
133+ void GetShaderStorageBlockMembersInfo (const TInterfaceBlock *interfaceBlock,
134+ BlockMemberInfoMap *blockInfoOut)
134135{
135136 sh::Std140BlockEncoder std140Encoder;
136137 sh::HLSLBlockEncoder hlslEncoder (sh::HLSLBlockEncoder::ENCODE_PACKED, false );
@@ -146,8 +147,8 @@ void SetShaderStorageBlockMembersOffset(const TInterfaceBlock *interfaceBlock)
146147 encoder = &hlslEncoder;
147148 }
148149
149- SetShaderStorageBlockFieldMemberInfo (interfaceBlock->fields (), encoder,
150- interfaceBlock->blockStorage ());
150+ GetShaderStorageBlockFieldMemberInfo (interfaceBlock->fields (), encoder,
151+ interfaceBlock->blockStorage (), blockInfoOut );
151152}
152153
153154bool IsInArrayOfArraysChain (TIntermTyped *node)
@@ -262,7 +263,7 @@ void ShaderStorageBlockOutputHLSL::visitSymbol(TIntermSymbol *node)
262263 }
263264 mReferencedShaderStorageBlocks [interfaceBlock->uniqueId ().get ()] =
264265 new TReferencedBlock (interfaceBlock, instanceVariable);
265- SetShaderStorageBlockMembersOffset (interfaceBlock);
266+ GetShaderStorageBlockMembersInfo (interfaceBlock, & mBlockMemberInfoMap );
266267 }
267268 if (variableType.isInterfaceBlock ())
268269 {
@@ -349,7 +350,7 @@ bool ShaderStorageBlockOutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
349350 {
350351 mReferencedShaderStorageBlocks [interfaceBlock->uniqueId ().get ()] =
351352 new TReferencedBlock (interfaceBlock, &instanceArraySymbol->variable ());
352- SetShaderStorageBlockMembersOffset (interfaceBlock);
353+ GetShaderStorageBlockMembersInfo (interfaceBlock, & mBlockMemberInfoMap );
353354 }
354355
355356 const int arrayIndex = node->getRight ()->getAsConstantUnion ()->getIConst (0 );
@@ -482,13 +483,16 @@ void ShaderStorageBlockOutputHLSL::writeEOpIndexDirectOrIndirectOutput(TInfoSink
482483
483484void ShaderStorageBlockOutputHLSL::writeDotOperatorOutput (TInfoSinkBase &out, const TField *field)
484485{
485- out << str (field->getOffset ());
486+ auto fieldInfoIter = mBlockMemberInfoMap .find (field);
487+ ASSERT (fieldInfoIter != mBlockMemberInfoMap .end ());
488+ const BlockMemberInfo &memberInfo = fieldInfoIter->second ;
489+ out << memberInfo.offset ;
486490
487491 const TType &fieldType = *field->type ();
488492 if (fieldType.isArray () && !isEndOfSSBOAccessChain ())
489493 {
490494 out << " + " ;
491- out << field-> getArrayStride () ;
495+ out << memberInfo. arrayStride ;
492496 if (fieldType.isArrayOfArrays ())
493497 {
494498 out << " * (" ;
0 commit comments