Commit ac4e9c3f by Jamie Madill Committed by Commit Bot

Micro-optimize Uniform updates.

This saves a few re-computations of the same stuff. BUG=angleproject:1671 Change-Id: I28f955cd880366a86c0bb22285a119e97661e2cb Reviewed-on: https://chromium-review.googlesource.com/427326 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent f695a3a1
...@@ -1405,19 +1405,27 @@ bool Program::isValidUniformLocation(GLint location) const ...@@ -1405,19 +1405,27 @@ bool Program::isValidUniformLocation(GLint location) const
mState.mUniformLocations[static_cast<size_t>(location)].used); mState.mUniformLocations[static_cast<size_t>(location)].used);
} }
bool Program::isIgnoredUniformLocation(GLint location) const const LinkedUniform &Program::getUniformByLocation(GLint location) const
{ {
// Location is ignored if it is -1 or it was bound but non-existant in the shader or optimized ASSERT(location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size());
// out return mState.mUniforms[mState.getUniformIndexFromLocation(location)];
return location == -1 ||
(location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size() &&
mState.mUniformLocations[static_cast<size_t>(location)].ignored);
} }
const LinkedUniform &Program::getUniformByLocation(GLint location) const const VariableLocation &Program::getUniformLocation(GLint location) const
{ {
ASSERT(location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size()); ASSERT(location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size());
return mState.mUniforms[mState.getUniformIndexFromLocation(location)]; return mState.mUniformLocations[location];
}
const std::vector<VariableLocation> &Program::getUniformLocations() const
{
return mState.mUniformLocations;
}
const LinkedUniform &Program::getUniformByIndex(GLuint index) const
{
ASSERT(index < static_cast<size_t>(mState.mUniforms.size()));
return mState.mUniforms[index];
} }
GLint Program::getUniformLocation(const std::string &name) const GLint Program::getUniformLocation(const std::string &name) const
......
...@@ -330,8 +330,10 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -330,8 +330,10 @@ class Program final : angle::NonCopyable, public LabeledObject
GLint getActiveUniformMaxLength() const; GLint getActiveUniformMaxLength() const;
GLint getActiveUniformi(GLuint index, GLenum pname) const; GLint getActiveUniformi(GLuint index, GLenum pname) const;
bool isValidUniformLocation(GLint location) const; bool isValidUniformLocation(GLint location) const;
bool isIgnoredUniformLocation(GLint location) const;
const LinkedUniform &getUniformByLocation(GLint location) const; const LinkedUniform &getUniformByLocation(GLint location) const;
const VariableLocation &getUniformLocation(GLint location) const;
const std::vector<VariableLocation> &getUniformLocations() const;
const LinkedUniform &getUniformByIndex(GLuint index) const;
GLint getUniformLocation(const std::string &name) const; GLint getUniformLocation(const std::string &name) const;
GLuint getUniformIndex(const std::string &name) const; GLuint getUniformIndex(const std::string &name) const;
...@@ -464,8 +466,6 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -464,8 +466,6 @@ class Program final : angle::NonCopyable, public LabeledObject
const Caps &caps) const; const Caps &caps) const;
void gatherTransformFeedbackVaryings(const MergedVaryings &varyings); void gatherTransformFeedbackVaryings(const MergedVaryings &varyings);
bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps);
void defineOutputVariables(Shader *fragmentShader);
MergedVaryings getMergedVaryings() const; MergedVaryings getMergedVaryings() const;
std::vector<PackedVarying> getPackedVaryings(const MergedVaryings &mergedVaryings) const; std::vector<PackedVarying> getPackedVaryings(const MergedVaryings &mergedVaryings) const;
......
...@@ -117,7 +117,7 @@ size_t LinkedUniform::getElementComponents() const ...@@ -117,7 +117,7 @@ size_t LinkedUniform::getElementComponents() const
uint8_t *LinkedUniform::getDataPtrToElement(size_t elementIndex) uint8_t *LinkedUniform::getDataPtrToElement(size_t elementIndex)
{ {
ASSERT((!isArray() && elementIndex == 0) || (isArray() && elementIndex < arraySize)); ASSERT((!isArray() && elementIndex == 0) || (isArray() && elementIndex < arraySize));
return data() + getElementSize() * elementIndex; return data() + (elementIndex > 0 ? (getElementSize() * elementIndex) : 0u);
} }
const uint8_t *LinkedUniform::getDataPtrToElement(size_t elementIndex) const const uint8_t *LinkedUniform::getDataPtrToElement(size_t elementIndex) const
......
...@@ -2700,19 +2700,34 @@ static bool ValidateUniformCommonBase(gl::Context *context, ...@@ -2700,19 +2700,34 @@ static bool ValidateUniformCommonBase(gl::Context *context,
return false; return false;
} }
if (program->isIgnoredUniformLocation(location)) if (location == -1)
{ {
// Silently ignore the uniform command // Silently ignore the uniform command
return false; return false;
} }
if (!program->isValidUniformLocation(location)) const auto &uniformLocations = program->getUniformLocations();
size_t castedLocation = static_cast<size_t>(location);
if (castedLocation >= uniformLocations.size())
{
context->handleError(Error(GL_INVALID_OPERATION, "Invalid uniform location"));
return false;
}
const auto &uniformLocation = uniformLocations[castedLocation];
if (uniformLocation.ignored)
{
// Silently ignore the uniform command
return false;
}
if (!uniformLocation.used)
{ {
context->handleError(Error(GL_INVALID_OPERATION)); context->handleError(Error(GL_INVALID_OPERATION));
return false; return false;
} }
const LinkedUniform &uniform = program->getUniformByLocation(location); const auto &uniform = program->getUniformByIndex(uniformLocation.index);
// attempting to write an array to a non-array uniform is an INVALID_OPERATION // attempting to write an array to a non-array uniform is an INVALID_OPERATION
if (!uniform.isArray() && count > 1) if (!uniform.isArray() && count > 1)
......
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