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)
TVector<TIntermSymbol *> samplerSymbols;
TString structName = samplerNamePrefixFromStruct(typedArg);
argType.createSamplerSymbols("angle_" + structName, "",
argType.isArray() ? argType.getArraySize() : 0u,
&samplerSymbols, nullptr);
for (const TIntermSymbol *sampler : samplerSymbols)
{
......@@ -2575,8 +2574,7 @@ TString OutputHLSL::argumentString(const TIntermSymbol *symbol)
{
ASSERT(qualifier != EvqOut && qualifier != EvqInOut);
TVector<TIntermSymbol *> samplerSymbols;
type.createSamplerSymbols("angle" + nameStr, "", type.isArray() ? type.getArraySize() : 0u,
&samplerSymbols, nullptr);
type.createSamplerSymbols("angle" + nameStr, "", &samplerSymbols, nullptr);
for (const TIntermSymbol *sampler : samplerSymbols)
{
const TType &samplerType = sampler->getType();
......
......@@ -548,73 +548,58 @@ bool TStructure::containsSamplers() const
return false;
}
void TStructure::createSamplerSymbols(const TString &structName,
const TString &structAPIName,
const unsigned int arrayOfStructsSize,
TVector<TIntermSymbol *> *outputSymbols,
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const
void TType::createSamplerSymbols(const TString &namePrefix,
const TString &apiNamePrefix,
TVector<TIntermSymbol *> *outputSymbols,
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const
{
for (auto &field : *mFields)
if (isStructureContainingSamplers())
{
const TType *fieldType = field->type();
if (IsSampler(fieldType->getBasicType()))
if (isArray())
{
if (arrayOfStructsSize > 0u)
{
for (unsigned int arrayIndex = 0u; arrayIndex < arrayOfStructsSize; ++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
TType elementType(*this);
elementType.clearArrayness();
for (unsigned int arrayIndex = 0u; arrayIndex < getArraySize(); ++arrayIndex)
{
TString symbolName = structName + "_" + field->name();
TIntermSymbol *symbol = new TIntermSymbol(0, symbolName, *fieldType);
outputSymbols->push_back(symbol);
if (outputSymbolsToAPINames)
{
TString apiName = structAPIName + "." + field->name();
(*outputSymbolsToAPINames)[symbol] = apiName;
}
TStringStream elementName;
elementName << namePrefix << "_" << arrayIndex;
TStringStream elementApiName;
elementApiName << apiNamePrefix << "[" << arrayIndex << "]";
elementType.createSamplerSymbols(elementName.str(), elementApiName.str(),
outputSymbols, outputSymbolsToAPINames);
}
}
else if (fieldType->isStructureContainingSamplers())
else
{
unsigned int nestedArrayOfStructsSize =
fieldType->isArray() ? fieldType->getArraySize() : 0u;
if (arrayOfStructsSize > 0)
{
for (unsigned int arrayIndex = 0u; arrayIndex < arrayOfStructsSize; ++arrayIndex)
{
TStringStream fieldName;
fieldName << structName << "_" << arrayIndex << "_" << field->name();
TStringStream fieldAPIName;
if (outputSymbolsToAPINames)
{
fieldAPIName << structAPIName << "[" << arrayIndex << "]." << field->name();
}
fieldType->createSamplerSymbols(fieldName.str(), fieldAPIName.str(),
nestedArrayOfStructsSize, outputSymbols,
outputSymbolsToAPINames);
}
}
else
{
fieldType->createSamplerSymbols(
structName + "_" + field->name(), structAPIName + "." + field->name(),
nestedArrayOfStructsSize, outputSymbols, outputSymbolsToAPINames);
}
structure->createSamplerSymbols(namePrefix, apiNamePrefix, outputSymbols,
outputSymbolsToAPINames);
}
return;
}
ASSERT(IsSampler(type));
TIntermSymbol *symbol = new TIntermSymbol(0, namePrefix, *this);
outputSymbols->push_back(symbol);
if (outputSymbolsToAPINames)
{
(*outputSymbolsToAPINames)[symbol] = apiNamePrefix;
}
}
void TStructure::createSamplerSymbols(const TString &namePrefix,
const TString &apiNamePrefix,
TVector<TIntermSymbol *> *outputSymbols,
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const
{
ASSERT(containsSamplers());
for (auto &field : *mFields)
{
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
bool containsType(TBasicType t) const;
bool containsSamplers() const;
void createSamplerSymbols(const TString &structName,
const TString &structAPIName,
const unsigned int arrayOfStructsSize,
void createSamplerSymbols(const TString &namePrefix,
const TString &apiNamePrefix,
TVector<TIntermSymbol *> *outputSymbols,
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const;
......@@ -473,16 +472,10 @@ class TType
return structure ? structure->containsSamplers() : false;
}
void createSamplerSymbols(const TString &structName,
const TString &structAPIName,
const unsigned int arrayOfStructsSize,
void createSamplerSymbols(const TString &namePrefix,
const TString &apiNamePrefix,
TVector<TIntermSymbol *> *outputSymbols,
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const
{
ASSERT(structure != nullptr && structure->containsSamplers());
structure->createSamplerSymbols(structName, structAPIName, arrayOfStructsSize,
outputSymbols, outputSymbolsToAPINames);
}
TMap<TIntermSymbol *, TString> *outputSymbolsToAPINames) const;
// Initializes all lazily-initialized members.
void realize() { getMangledName(); }
......
......@@ -286,9 +286,8 @@ void UniformHLSL::uniformsHeader(TInfoSinkBase &out,
{
TVector<TIntermSymbol *> samplerSymbols;
TMap<TIntermSymbol *, TString> symbolsToAPINames;
unsigned int arrayOfStructsSize = type.isArray() ? type.getArraySize() : 0u;
type.createSamplerSymbols("angle_" + name.getString(), name.getString(),
arrayOfStructsSize, &samplerSymbols, &symbolsToAPINames);
&samplerSymbols, &symbolsToAPINames);
for (TIntermSymbol *sampler : samplerSymbols)
{
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