Commit 599555b5 by Olli Etuaho Committed by Commit Bot

Clean up createSamplerSymbols

The arrayOfStructsSize parameter can always be determined from the TType object, so there's no need to pass it to TType::createSamplerSymbols. Furthermore, it's more natural to do the processing for arrays of structs in TType::createSamplerSymbols, rather than in the TStructure::createSamplerSymbols helper it is using. Also rename some parameter names, and move createSamplerSymbols implementation to Types.cpp. This refactoring change prepares for implementing arrays of arrays. BUG=angleproject:2125 TEST=angle_end2end_tests Change-Id: I3f8bec711c0434677ebcf3741abb4f910c36dba3 Reviewed-on: https://chromium-review.googlesource.com/614883 Commit-Queue: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 28839f03
...@@ -1829,7 +1829,6 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -1829,7 +1829,6 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
TVector<TIntermSymbol *> samplerSymbols; TVector<TIntermSymbol *> samplerSymbols;
TString structName = samplerNamePrefixFromStruct(typedArg); TString structName = samplerNamePrefixFromStruct(typedArg);
argType.createSamplerSymbols("angle_" + structName, "", argType.createSamplerSymbols("angle_" + structName, "",
argType.isArray() ? argType.getArraySize() : 0u,
&samplerSymbols, nullptr); &samplerSymbols, nullptr);
for (const TIntermSymbol *sampler : samplerSymbols) for (const TIntermSymbol *sampler : samplerSymbols)
{ {
...@@ -2575,8 +2574,7 @@ TString OutputHLSL::argumentString(const TIntermSymbol *symbol) ...@@ -2575,8 +2574,7 @@ TString OutputHLSL::argumentString(const TIntermSymbol *symbol)
{ {
ASSERT(qualifier != EvqOut && qualifier != EvqInOut); ASSERT(qualifier != EvqOut && qualifier != EvqInOut);
TVector<TIntermSymbol *> samplerSymbols; TVector<TIntermSymbol *> samplerSymbols;
type.createSamplerSymbols("angle" + nameStr, "", type.isArray() ? type.getArraySize() : 0u, type.createSamplerSymbols("angle" + nameStr, "", &samplerSymbols, nullptr);
&samplerSymbols, nullptr);
for (const TIntermSymbol *sampler : samplerSymbols) for (const TIntermSymbol *sampler : samplerSymbols)
{ {
const TType &samplerType = sampler->getType(); const TType &samplerType = sampler->getType();
......
...@@ -548,73 +548,58 @@ bool TStructure::containsSamplers() const ...@@ -548,73 +548,58 @@ bool TStructure::containsSamplers() const
return false; return false;
} }
void TStructure::createSamplerSymbols(const TString &structName, void TType::createSamplerSymbols(const TString &namePrefix,
const TString &structAPIName, const TString &apiNamePrefix,
const unsigned int arrayOfStructsSize, TVector<TIntermSymbol *> *outputSymbols,
TVector<TIntermSymbol *> *outputSymbols, TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const
{ {
for (auto &field : *mFields) if (isStructureContainingSamplers())
{ {
const TType *fieldType = field->type(); if (isArray())
if (IsSampler(fieldType->getBasicType()))
{ {
if (arrayOfStructsSize > 0u) TType elementType(*this);
{ elementType.clearArrayness();
for (unsigned int arrayIndex = 0u; arrayIndex < arrayOfStructsSize; ++arrayIndex) for (unsigned int arrayIndex = 0u; arrayIndex < getArraySize(); ++arrayIndex)
{
TStringStream name;
name << structName << "_" << arrayIndex << "_" << field->name();
TIntermSymbol *symbol = new TIntermSymbol(0, name.str(), *fieldType);
outputSymbols->push_back(symbol);
if (outputSymbolsToAPINames)
{
TStringStream apiName;
apiName << structAPIName << "[" << arrayIndex << "]." << field->name();
(*outputSymbolsToAPINames)[symbol] = apiName.str();
}
}
}
else
{ {
TString symbolName = structName + "_" + field->name(); TStringStream elementName;
TIntermSymbol *symbol = new TIntermSymbol(0, symbolName, *fieldType); elementName << namePrefix << "_" << arrayIndex;
outputSymbols->push_back(symbol); TStringStream elementApiName;
elementApiName << apiNamePrefix << "[" << arrayIndex << "]";
if (outputSymbolsToAPINames) elementType.createSamplerSymbols(elementName.str(), elementApiName.str(),
{ outputSymbols, outputSymbolsToAPINames);
TString apiName = structAPIName + "." + field->name();
(*outputSymbolsToAPINames)[symbol] = apiName;
}
} }
} }
else if (fieldType->isStructureContainingSamplers()) else
{ {
unsigned int nestedArrayOfStructsSize = structure->createSamplerSymbols(namePrefix, apiNamePrefix, outputSymbols,
fieldType->isArray() ? fieldType->getArraySize() : 0u; outputSymbolsToAPINames);
if (arrayOfStructsSize > 0) }
{ return;
for (unsigned int arrayIndex = 0u; arrayIndex < arrayOfStructsSize; ++arrayIndex) }
{ ASSERT(IsSampler(type));
TStringStream fieldName; TIntermSymbol *symbol = new TIntermSymbol(0, namePrefix, *this);
fieldName << structName << "_" << arrayIndex << "_" << field->name(); outputSymbols->push_back(symbol);
TStringStream fieldAPIName; if (outputSymbolsToAPINames)
if (outputSymbolsToAPINames) {
{ (*outputSymbolsToAPINames)[symbol] = apiNamePrefix;
fieldAPIName << structAPIName << "[" << arrayIndex << "]." << field->name(); }
} }
fieldType->createSamplerSymbols(fieldName.str(), fieldAPIName.str(),
nestedArrayOfStructsSize, outputSymbols, void TStructure::createSamplerSymbols(const TString &namePrefix,
outputSymbolsToAPINames); const TString &apiNamePrefix,
} TVector<TIntermSymbol *> *outputSymbols,
} TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const
else {
{ ASSERT(containsSamplers());
fieldType->createSamplerSymbols( for (auto &field : *mFields)
structName + "_" + field->name(), structAPIName + "." + field->name(), {
nestedArrayOfStructsSize, outputSymbols, outputSymbolsToAPINames); const TType *fieldType = field->type();
} if (IsSampler(fieldType->getBasicType()) || fieldType->isStructureContainingSamplers())
{
TString fieldName = namePrefix + "_" + field->name();
TString fieldApiName = apiNamePrefix + "." + field->name();
fieldType->createSamplerSymbols(fieldName, fieldApiName, outputSymbols,
outputSymbolsToAPINames);
} }
} }
} }
......
...@@ -100,9 +100,8 @@ class TStructure : public TFieldListCollection ...@@ -100,9 +100,8 @@ class TStructure : public TFieldListCollection
bool containsType(TBasicType t) const; bool containsType(TBasicType t) const;
bool containsSamplers() const; bool containsSamplers() const;
void createSamplerSymbols(const TString &structName, void createSamplerSymbols(const TString &namePrefix,
const TString &structAPIName, const TString &apiNamePrefix,
const unsigned int arrayOfStructsSize,
TVector<TIntermSymbol *> *outputSymbols, TVector<TIntermSymbol *> *outputSymbols,
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const; TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const;
...@@ -473,16 +472,10 @@ class TType ...@@ -473,16 +472,10 @@ class TType
return structure ? structure->containsSamplers() : false; return structure ? structure->containsSamplers() : false;
} }
void createSamplerSymbols(const TString &structName, void createSamplerSymbols(const TString &namePrefix,
const TString &structAPIName, const TString &apiNamePrefix,
const unsigned int arrayOfStructsSize,
TVector<TIntermSymbol *> *outputSymbols, TVector<TIntermSymbol *> *outputSymbols,
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const;
{
ASSERT(structure != nullptr && structure->containsSamplers());
structure->createSamplerSymbols(structName, structAPIName, arrayOfStructsSize,
outputSymbols, outputSymbolsToAPINames);
}
// Initializes all lazily-initialized members. // Initializes all lazily-initialized members.
void realize() { getMangledName(); } void realize() { getMangledName(); }
......
...@@ -286,9 +286,8 @@ void UniformHLSL::uniformsHeader(TInfoSinkBase &out, ...@@ -286,9 +286,8 @@ void UniformHLSL::uniformsHeader(TInfoSinkBase &out,
{ {
TVector<TIntermSymbol *> samplerSymbols; TVector<TIntermSymbol *> samplerSymbols;
TMap<TIntermSymbol *, TString> symbolsToAPINames; TMap<TIntermSymbol *, TString> symbolsToAPINames;
unsigned int arrayOfStructsSize = type.isArray() ? type.getArraySize() : 0u;
type.createSamplerSymbols("angle_" + name.getString(), name.getString(), type.createSamplerSymbols("angle_" + name.getString(), name.getString(),
arrayOfStructsSize, &samplerSymbols, &symbolsToAPINames); &samplerSymbols, &symbolsToAPINames);
for (TIntermSymbol *sampler : samplerSymbols) for (TIntermSymbol *sampler : samplerSymbols)
{ {
const TType &samplerType = sampler->getType(); const TType &samplerType = sampler->getType();
......
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