Commit fb997ec1 by Jamie Madill Committed by Commit Bot

Removed "name" and "used" from variable location.

The used flag was redundant with the index (which used MAXUINT). The name was redundant with the stored uniform. Removing these gives a very minor performance speed up when iterating and retrieving uniform locations. BUG=angleproject:1390 Change-Id: Ieeccdff7c131e1359e754e246d3648b73aad5baf Reviewed-on: https://chromium-review.googlesource.com/659224 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 805d281a
...@@ -238,10 +238,8 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context, ...@@ -238,10 +238,8 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context,
uniformIndexIndex++) uniformIndexIndex++)
{ {
VariableLocation variable; VariableLocation variable;
stream.readString(&variable.name);
stream.readInt(&variable.element); stream.readInt(&variable.element);
stream.readInt(&variable.index); stream.readInt(&variable.index);
stream.readBool(&variable.used);
stream.readBool(&variable.ignored); stream.readBool(&variable.ignored);
state->mUniformLocations.push_back(variable); state->mUniformLocations.push_back(variable);
...@@ -323,7 +321,7 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context, ...@@ -323,7 +321,7 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context,
VariableLocation locationData; VariableLocation locationData;
stream.readInt(&locationData.element); stream.readInt(&locationData.element);
stream.readInt(&locationData.index); stream.readInt(&locationData.index);
stream.readString(&locationData.name); stream.readBool(&locationData.ignored);
state->mOutputLocations[locationIndex] = locationData; state->mOutputLocations[locationIndex] = locationData;
} }
...@@ -429,10 +427,8 @@ void MemoryProgramCache::Serialize(const Context *context, ...@@ -429,10 +427,8 @@ void MemoryProgramCache::Serialize(const Context *context,
stream.writeInt(state.getUniformLocations().size()); stream.writeInt(state.getUniformLocations().size());
for (const auto &variable : state.getUniformLocations()) for (const auto &variable : state.getUniformLocations())
{ {
stream.writeString(variable.name);
stream.writeInt(variable.element); stream.writeInt(variable.element);
stream.writeInt(variable.index); stream.writeIntOrNegOne(variable.index);
stream.writeInt(variable.used);
stream.writeInt(variable.ignored); stream.writeInt(variable.ignored);
} }
...@@ -486,8 +482,8 @@ void MemoryProgramCache::Serialize(const Context *context, ...@@ -486,8 +482,8 @@ void MemoryProgramCache::Serialize(const Context *context,
{ {
stream.writeInt(outputPair.first); stream.writeInt(outputPair.first);
stream.writeIntOrNegOne(outputPair.second.element); stream.writeIntOrNegOne(outputPair.second.element);
stream.writeInt(outputPair.second.index); stream.writeIntOrNegOne(outputPair.second.index);
stream.writeString(outputPair.second.name); stream.writeInt(outputPair.second.ignored);
} }
stream.writeInt(state.mOutputVariableTypes.size()); stream.writeInt(state.mOutputVariableTypes.size());
......
...@@ -287,15 +287,12 @@ void InfoLog::reset() ...@@ -287,15 +287,12 @@ void InfoLog::reset()
{ {
} }
VariableLocation::VariableLocation() VariableLocation::VariableLocation() : element(0), index(kUnused), ignored(false)
: name(), element(0), index(GL_INVALID_INDEX), used(false), ignored(false)
{ {
} }
VariableLocation::VariableLocation(const std::string &name, VariableLocation::VariableLocation(unsigned int element, unsigned int index)
unsigned int element, : element(element), index(index), ignored(false)
unsigned int index)
: name(name), element(element), index(index), used(true), ignored(false)
{ {
} }
...@@ -353,7 +350,7 @@ GLint ProgramState::getUniformLocation(const std::string &name) const ...@@ -353,7 +350,7 @@ GLint ProgramState::getUniformLocation(const std::string &name) const
for (size_t location = 0; location < mUniformLocations.size(); ++location) for (size_t location = 0; location < mUniformLocations.size(); ++location)
{ {
const VariableLocation &uniformLocation = mUniformLocations[location]; const VariableLocation &uniformLocation = mUniformLocations[location];
if (!uniformLocation.used) if (!uniformLocation.used())
{ {
continue; continue;
} }
...@@ -811,17 +808,7 @@ Error Program::link(const gl::Context *context) ...@@ -811,17 +808,7 @@ Error Program::link(const gl::Context *context)
setUniformValuesFromBindingQualifiers(); setUniformValuesFromBindingQualifiers();
// Mark implementation-specific unreferenced uniforms as ignored. // Mark implementation-specific unreferenced uniforms as ignored.
mProgram->markUnusedUniformLocations(&mState.mUniformLocations); mProgram->markUnusedUniformLocations(&mState.mUniformLocations, &mState.mSamplerBindings);
// Update sampler bindings with unreferenced uniforms.
for (const auto &location : mState.mUniformLocations)
{
if (!location.used && mState.isSamplerUniformIndex(location.index))
{
GLuint samplerIndex = mState.getSamplerIndexFromUniformIndex(location.index);
mState.mSamplerBindings[samplerIndex].unreferenced = true;
}
}
// Save to the program cache. // Save to the program cache.
if (cache && (mState.mLinkedTransformFeedbackVaryings.empty() || if (cache && (mState.mLinkedTransformFeedbackVaryings.empty() ||
...@@ -1204,8 +1191,10 @@ GLint Program::getFragDataLocation(const std::string &name) const ...@@ -1204,8 +1191,10 @@ GLint Program::getFragDataLocation(const std::string &name) const
unsigned int arrayIndex = ParseAndStripArrayIndex(&baseName); unsigned int arrayIndex = ParseAndStripArrayIndex(&baseName);
for (auto outputPair : mState.mOutputLocations) for (auto outputPair : mState.mOutputLocations)
{ {
const VariableLocation &outputVariable = outputPair.second; const VariableLocation &locationInfo = outputPair.second;
if (outputVariable.name == baseName && (arrayIndex == GL_INVALID_INDEX || arrayIndex == outputVariable.element)) const sh::OutputVariable &outputVariable = mState.mOutputVariables[locationInfo.index];
if (outputVariable.name == baseName &&
(arrayIndex == GL_INVALID_INDEX || arrayIndex == locationInfo.element))
{ {
return static_cast<GLint>(outputPair.first); return static_cast<GLint>(outputPair.first);
} }
...@@ -1317,7 +1306,7 @@ bool Program::isValidUniformLocation(GLint location) const ...@@ -1317,7 +1306,7 @@ bool Program::isValidUniformLocation(GLint location) const
{ {
ASSERT(angle::IsValueInRangeForNumericType<GLint>(mState.mUniformLocations.size())); ASSERT(angle::IsValueInRangeForNumericType<GLint>(mState.mUniformLocations.size()));
return (location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size() && return (location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size() &&
mState.mUniformLocations[static_cast<size_t>(location)].used); mState.mUniformLocations[static_cast<size_t>(location)].used());
} }
const LinkedUniform &Program::getUniformByLocation(GLint location) const const LinkedUniform &Program::getUniformByLocation(GLint location) const
...@@ -2760,8 +2749,7 @@ void Program::linkOutputVariables(const Context *context) ...@@ -2760,8 +2749,7 @@ void Program::linkOutputVariables(const Context *context)
const int location = baseLocation + elementIndex; const int location = baseLocation + elementIndex;
ASSERT(mState.mOutputLocations.count(location) == 0); ASSERT(mState.mOutputLocations.count(location) == 0);
unsigned int element = outputVariable.isArray() ? elementIndex : GL_INVALID_INDEX; unsigned int element = outputVariable.isArray() ? elementIndex : GL_INVALID_INDEX;
mState.mOutputLocations[location] = mState.mOutputLocations[location] = VariableLocation(element, outputVariableIndex);
VariableLocation(outputVariable.name, element, outputVariableIndex);
} }
} }
} }
......
...@@ -135,17 +135,20 @@ class InfoLog : angle::NonCopyable ...@@ -135,17 +135,20 @@ class InfoLog : angle::NonCopyable
// Struct used for correlating uniforms/elements of uniform arrays to handles // Struct used for correlating uniforms/elements of uniform arrays to handles
struct VariableLocation struct VariableLocation
{ {
VariableLocation(); static constexpr unsigned int kUnused = GL_INVALID_INDEX;
VariableLocation(const std::string &name, unsigned int element, unsigned int index);
std::string name; VariableLocation();
unsigned int element; VariableLocation(unsigned int element, unsigned int index);
unsigned int index;
// If used is false, it means this location is only used to fill an empty space in an array, // If used is false, it means this location is only used to fill an empty space in an array,
// and there is no corresponding uniform variable for this location. It can also mean the // and there is no corresponding uniform variable for this location. It can also mean the
// uniform was optimized out by the implementation. // uniform was optimized out by the implementation.
bool used; bool used() const { return (index != kUnused); }
void markUnused() { index = kUnused; }
void markIgnored() { ignored = true; }
unsigned int element;
unsigned int index;
// If this location was bound to an unreferenced uniform. Setting data on this uniform is a // If this location was bound to an unreferenced uniform. Setting data on this uniform is a
// no-op. // no-op.
...@@ -342,7 +345,6 @@ class ProgramState final : angle::NonCopyable ...@@ -342,7 +345,6 @@ class ProgramState final : angle::NonCopyable
std::vector<gl::ImageBinding> mImageBindings; std::vector<gl::ImageBinding> mImageBindings;
std::vector<sh::OutputVariable> mOutputVariables; std::vector<sh::OutputVariable> mOutputVariables;
// TODO(jmadill): use unordered/hash map when available
std::map<int, VariableLocation> mOutputLocations; std::map<int, VariableLocation> mOutputLocations;
DrawBufferMask mActiveOutputVariables; DrawBufferMask mActiveOutputVariables;
......
...@@ -201,8 +201,7 @@ bool UniformLinker::indexUniforms(InfoLog &infoLog, ...@@ -201,8 +201,7 @@ bool UniformLinker::indexUniforms(InfoLog &infoLog,
for (unsigned int arrayIndex = 0; arrayIndex < uniform.elementCount(); arrayIndex++) for (unsigned int arrayIndex = 0; arrayIndex < uniform.elementCount(); arrayIndex++)
{ {
VariableLocation location(uniform.name, arrayIndex, VariableLocation location(arrayIndex, static_cast<unsigned int>(uniformIndex));
static_cast<unsigned int>(uniformIndex));
if ((arrayIndex == 0 && preSetLocation != -1) || shaderLocation != -1) if ((arrayIndex == 0 && preSetLocation != -1) || shaderLocation != -1)
{ {
...@@ -230,14 +229,14 @@ bool UniformLinker::indexUniforms(InfoLog &infoLog, ...@@ -230,14 +229,14 @@ bool UniformLinker::indexUniforms(InfoLog &infoLog,
// Assign ignored uniforms // Assign ignored uniforms
for (const auto &ignoredLocation : ignoredLocations) for (const auto &ignoredLocation : ignoredLocations)
{ {
mUniformLocations[ignoredLocation].ignored = true; mUniformLocations[ignoredLocation].markIgnored();
} }
// Automatically assign locations for the rest of the uniforms // Automatically assign locations for the rest of the uniforms
size_t nextUniformLocation = 0; size_t nextUniformLocation = 0;
for (const auto &unlocatedUniform : unlocatedUniforms) for (const auto &unlocatedUniform : unlocatedUniforms)
{ {
while (mUniformLocations[nextUniformLocation].used || while (mUniformLocations[nextUniformLocation].used() ||
mUniformLocations[nextUniformLocation].ignored) mUniformLocations[nextUniformLocation].ignored)
{ {
nextUniformLocation++; nextUniformLocation++;
......
...@@ -105,7 +105,10 @@ class ProgramImpl : angle::NonCopyable ...@@ -105,7 +105,10 @@ class ProgramImpl : angle::NonCopyable
// Implementation-specific method for ignoring unreferenced uniforms. Some implementations may // Implementation-specific method for ignoring unreferenced uniforms. Some implementations may
// perform more extensive analysis and ignore some locations that ANGLE doesn't detect as // perform more extensive analysis and ignore some locations that ANGLE doesn't detect as
// unreferenced. This method is not required to be overriden by a back-end. // unreferenced. This method is not required to be overriden by a back-end.
virtual void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations) {} virtual void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations,
std::vector<gl::SamplerBinding> *samplerBindings)
{
}
protected: protected:
const gl::ProgramState &mState; const gl::ProgramState &mState;
......
...@@ -1267,7 +1267,7 @@ void DynamicHLSL::getPixelShaderOutputKey(const gl::ContextState &data, ...@@ -1267,7 +1267,7 @@ void DynamicHLSL::getPixelShaderOutputKey(const gl::ContextState &data,
{ {
const VariableLocation &outputLocation = outputPair.second; const VariableLocation &outputLocation = outputPair.second;
const sh::ShaderVariable &outputVariable = shaderOutputVars[outputLocation.index]; const sh::ShaderVariable &outputVariable = shaderOutputVars[outputLocation.index];
const std::string &variableName = "out_" + outputLocation.name; const std::string &variableName = "out_" + outputVariable.name;
const std::string &elementString = const std::string &elementString =
(outputLocation.element == GL_INVALID_INDEX ? "" : Str(outputLocation.element)); (outputLocation.element == GL_INVALID_INDEX ? "" : Str(outputLocation.element));
......
...@@ -654,7 +654,7 @@ void ProgramGL::postLink() ...@@ -654,7 +654,7 @@ void ProgramGL::postLink()
for (size_t uniformLocation = 0; uniformLocation < uniformLocations.size(); uniformLocation++) for (size_t uniformLocation = 0; uniformLocation < uniformLocations.size(); uniformLocation++)
{ {
const auto &entry = uniformLocations[uniformLocation]; const auto &entry = uniformLocations[uniformLocation];
if (!entry.used) if (!entry.used())
{ {
continue; continue;
} }
...@@ -781,14 +781,21 @@ void ProgramGL::getUniformuiv(const gl::Context *context, GLint location, GLuint ...@@ -781,14 +781,21 @@ void ProgramGL::getUniformuiv(const gl::Context *context, GLint location, GLuint
mFunctions->getUniformuiv(mProgramID, uniLoc(location), params); mFunctions->getUniformuiv(mProgramID, uniLoc(location), params);
} }
void ProgramGL::markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations) void ProgramGL::markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations,
std::vector<gl::SamplerBinding> *samplerBindings)
{ {
GLint maxLocation = static_cast<GLint>(uniformLocations->size()); GLint maxLocation = static_cast<GLint>(uniformLocations->size());
for (GLint location = 0; location < maxLocation; ++location) for (GLint location = 0; location < maxLocation; ++location)
{ {
if (uniLoc(location) == -1) if (uniLoc(location) == -1)
{ {
(*uniformLocations)[location].used = false; auto &locationRef = (*uniformLocations)[location];
if (mState.isSamplerUniformIndex(locationRef.index))
{
GLuint samplerIndex = mState.getSamplerIndexFromUniformIndex(locationRef.index);
(*samplerBindings)[samplerIndex].unreferenced = true;
}
locationRef.markUnused();
} }
} }
} }
......
...@@ -83,7 +83,8 @@ class ProgramGL : public ProgramImpl ...@@ -83,7 +83,8 @@ class ProgramGL : public ProgramImpl
GLint components, GLint components,
const GLfloat *coeffs) override; const GLfloat *coeffs) override;
void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations) override; void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations,
std::vector<gl::SamplerBinding> *samplerBindings) override;
GLuint getProgramID() const; GLuint getProgramID() const;
......
...@@ -437,7 +437,7 @@ bool ValidateUniformCommonBase(ValidationContext *context, ...@@ -437,7 +437,7 @@ bool ValidateUniformCommonBase(ValidationContext *context,
return false; return false;
} }
if (!uniformLocation.used) if (!uniformLocation.used())
{ {
context->handleError(InvalidOperation()); context->handleError(InvalidOperation());
return false; return false;
......
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