Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit df73a8e

Browse files
qjia7Commit Bot
authored andcommitted
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: Geoff Lang <geofflang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
1 parent bfe31c4 commit df73a8e

3 files changed

Lines changed: 36 additions & 37 deletions

File tree

src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
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

153154
bool 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

483484
void 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 << " * (";

src/compiler/translator/ShaderStorageBlockOutputHLSL.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#define COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_
1212

1313
#include "compiler/translator/ShaderStorageBlockFunctionHLSL.h"
14+
#include "compiler/translator/blocklayout.h"
1415
#include "compiler/translator/tree_util/IntermTraverse.h"
1516

1617
namespace sh
@@ -30,6 +31,9 @@ struct TReferencedBlock : angle::NonCopyable
3031
// Maps from uniqueId to a variable.
3132
using ReferencedInterfaceBlocks = std::map<int, const TReferencedBlock *>;
3233

34+
// Used to save shader storage block field member information.
35+
using BlockMemberInfoMap = std::map<const TField *, BlockMemberInfo>;
36+
3337
class ShaderStorageBlockOutputHLSL : public TIntermTraverser
3438
{
3539
public:
@@ -69,6 +73,8 @@ class ShaderStorageBlockOutputHLSL : public TIntermTraverser
6973
ShaderStorageBlockFunctionHLSL *mSSBOFunctionHLSL;
7074
ResourcesHLSL *mResourcesHLSL;
7175
ReferencedInterfaceBlocks mReferencedShaderStorageBlocks;
76+
77+
BlockMemberInfoMap mBlockMemberInfoMap;
7278
};
7379
}
7480

src/compiler/translator/Types.h

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,7 @@ class TField : angle::NonCopyable
3232
public:
3333
POOL_ALLOCATOR_NEW_DELETE();
3434
TField(TType *type, const ImmutableString &name, const TSourceLoc &line, SymbolType symbolType)
35-
: mType(type),
36-
mName(name),
37-
mLine(line),
38-
mSymbolType(symbolType),
39-
mOffset(0),
40-
mArrayStride(0)
35+
: mType(type), mName(name), mLine(line), mSymbolType(symbolType)
4136
{
4237
ASSERT(mSymbolType != SymbolType::Empty);
4338
}
@@ -49,18 +44,12 @@ class TField : angle::NonCopyable
4944
const ImmutableString &name() const { return mName; }
5045
const TSourceLoc &line() const { return mLine; }
5146
SymbolType symbolType() const { return mSymbolType; }
52-
unsigned int getOffset() const { return mOffset; }
53-
unsigned int getArrayStride() const { return mArrayStride; }
54-
void setOffset(unsigned int offset) { mOffset = offset; }
55-
void setArrayStride(int arrayStride) { mArrayStride = arrayStride; }
5647

5748
private:
5849
TType *mType;
5950
const ImmutableString mName;
6051
const TSourceLoc mLine;
6152
const SymbolType mSymbolType;
62-
unsigned int mOffset;
63-
unsigned int mArrayStride;
6453
};
6554

6655
typedef TVector<TField *> TFieldList;

0 commit comments

Comments
 (0)