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,
uniformIndexIndex++)
{
VariableLocation variable;
stream.readString(&variable.name);
stream.readInt(&variable.element);
stream.readInt(&variable.index);
stream.readBool(&variable.used);
stream.readBool(&variable.ignored);
state->mUniformLocations.push_back(variable);
......@@ -323,7 +321,7 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context,
VariableLocation locationData;
stream.readInt(&locationData.element);
stream.readInt(&locationData.index);
stream.readString(&locationData.name);
stream.readBool(&locationData.ignored);
state->mOutputLocations[locationIndex] = locationData;
}
......@@ -429,10 +427,8 @@ void MemoryProgramCache::Serialize(const Context *context,
stream.writeInt(state.getUniformLocations().size());
for (const auto &variable : state.getUniformLocations())
{
stream.writeString(variable.name);
stream.writeInt(variable.element);
stream.writeInt(variable.index);
stream.writeInt(variable.used);
stream.writeIntOrNegOne(variable.index);
stream.writeInt(variable.ignored);
}
......@@ -486,8 +482,8 @@ void MemoryProgramCache::Serialize(const Context *context,
{
stream.writeInt(outputPair.first);
stream.writeIntOrNegOne(outputPair.second.element);
stream.writeInt(outputPair.second.index);
stream.writeString(outputPair.second.name);
stream.writeIntOrNegOne(outputPair.second.index);
stream.writeInt(outputPair.second.ignored);
}
stream.writeInt(state.mOutputVariableTypes.size());
......
......@@ -287,15 +287,12 @@ void InfoLog::reset()
{
}
VariableLocation::VariableLocation()
: name(), element(0), index(GL_INVALID_INDEX), used(false), ignored(false)
VariableLocation::VariableLocation() : element(0), index(kUnused), ignored(false)
{
}
VariableLocation::VariableLocation(const std::string &name,
unsigned int element,
unsigned int index)
: name(name), element(element), index(index), used(true), ignored(false)
VariableLocation::VariableLocation(unsigned int element, unsigned int index)
: element(element), index(index), ignored(false)
{
}
......@@ -353,7 +350,7 @@ GLint ProgramState::getUniformLocation(const std::string &name) const
for (size_t location = 0; location < mUniformLocations.size(); ++location)
{
const VariableLocation &uniformLocation = mUniformLocations[location];
if (!uniformLocation.used)
if (!uniformLocation.used())
{
continue;
}
......@@ -811,17 +808,7 @@ Error Program::link(const gl::Context *context)
setUniformValuesFromBindingQualifiers();
// Mark implementation-specific unreferenced uniforms as ignored.
mProgram->markUnusedUniformLocations(&mState.mUniformLocations);
// 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;
}
}
mProgram->markUnusedUniformLocations(&mState.mUniformLocations, &mState.mSamplerBindings);
// Save to the program cache.
if (cache && (mState.mLinkedTransformFeedbackVaryings.empty() ||
......@@ -1204,8 +1191,10 @@ GLint Program::getFragDataLocation(const std::string &name) const
unsigned int arrayIndex = ParseAndStripArrayIndex(&baseName);
for (auto outputPair : mState.mOutputLocations)
{
const VariableLocation &outputVariable = outputPair.second;
if (outputVariable.name == baseName && (arrayIndex == GL_INVALID_INDEX || arrayIndex == outputVariable.element))
const VariableLocation &locationInfo = outputPair.second;
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);
}
......@@ -1317,7 +1306,7 @@ bool Program::isValidUniformLocation(GLint location) const
{
ASSERT(angle::IsValueInRangeForNumericType<GLint>(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
......@@ -2760,8 +2749,7 @@ void Program::linkOutputVariables(const Context *context)
const int location = baseLocation + elementIndex;
ASSERT(mState.mOutputLocations.count(location) == 0);
unsigned int element = outputVariable.isArray() ? elementIndex : GL_INVALID_INDEX;
mState.mOutputLocations[location] =
VariableLocation(outputVariable.name, element, outputVariableIndex);
mState.mOutputLocations[location] = VariableLocation(element, outputVariableIndex);
}
}
}
......
......@@ -135,17 +135,20 @@ class InfoLog : angle::NonCopyable
// Struct used for correlating uniforms/elements of uniform arrays to handles
struct VariableLocation
{
VariableLocation();
VariableLocation(const std::string &name, unsigned int element, unsigned int index);
static constexpr unsigned int kUnused = GL_INVALID_INDEX;
std::string name;
unsigned int element;
unsigned int index;
VariableLocation();
VariableLocation(unsigned int element, unsigned int index);
// 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
// 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
// no-op.
......@@ -342,7 +345,6 @@ class ProgramState final : angle::NonCopyable
std::vector<gl::ImageBinding> mImageBindings;
std::vector<sh::OutputVariable> mOutputVariables;
// TODO(jmadill): use unordered/hash map when available
std::map<int, VariableLocation> mOutputLocations;
DrawBufferMask mActiveOutputVariables;
......
......@@ -201,8 +201,7 @@ bool UniformLinker::indexUniforms(InfoLog &infoLog,
for (unsigned int arrayIndex = 0; arrayIndex < uniform.elementCount(); arrayIndex++)
{
VariableLocation location(uniform.name, arrayIndex,
static_cast<unsigned int>(uniformIndex));
VariableLocation location(arrayIndex, static_cast<unsigned int>(uniformIndex));
if ((arrayIndex == 0 && preSetLocation != -1) || shaderLocation != -1)
{
......@@ -230,14 +229,14 @@ bool UniformLinker::indexUniforms(InfoLog &infoLog,
// Assign ignored uniforms
for (const auto &ignoredLocation : ignoredLocations)
{
mUniformLocations[ignoredLocation].ignored = true;
mUniformLocations[ignoredLocation].markIgnored();
}
// Automatically assign locations for the rest of the uniforms
size_t nextUniformLocation = 0;
for (const auto &unlocatedUniform : unlocatedUniforms)
{
while (mUniformLocations[nextUniformLocation].used ||
while (mUniformLocations[nextUniformLocation].used() ||
mUniformLocations[nextUniformLocation].ignored)
{
nextUniformLocation++;
......
......@@ -105,7 +105,10 @@ class ProgramImpl : angle::NonCopyable
// Implementation-specific method for ignoring unreferenced uniforms. Some implementations may
// 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.
virtual void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations) {}
virtual void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations,
std::vector<gl::SamplerBinding> *samplerBindings)
{
}
protected:
const gl::ProgramState &mState;
......
......@@ -1267,7 +1267,7 @@ void DynamicHLSL::getPixelShaderOutputKey(const gl::ContextState &data,
{
const VariableLocation &outputLocation = outputPair.second;
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 =
(outputLocation.element == GL_INVALID_INDEX ? "" : Str(outputLocation.element));
......
......@@ -654,7 +654,7 @@ void ProgramGL::postLink()
for (size_t uniformLocation = 0; uniformLocation < uniformLocations.size(); uniformLocation++)
{
const auto &entry = uniformLocations[uniformLocation];
if (!entry.used)
if (!entry.used())
{
continue;
}
......@@ -781,14 +781,21 @@ void ProgramGL::getUniformuiv(const gl::Context *context, GLint location, GLuint
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());
for (GLint location = 0; location < maxLocation; ++location)
{
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
GLint components,
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;
......
......@@ -437,7 +437,7 @@ bool ValidateUniformCommonBase(ValidationContext *context,
return false;
}
if (!uniformLocation.used)
if (!uniformLocation.used())
{
context->handleError(InvalidOperation());
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