Commit 2fc0806f by Jamie Madill Committed by Commit Bot

Micro-optimize uniform updates.

This CL is adapted from work by matavenrath@nvidia.com. It does the following small optimizations: * inlines a bunch of accessors. * reorders checks to hit the cache more often Also some small style updates. Bug: angleproject:1671 Change-Id: I8f21318e6644dcfe1f99c98f7f377742fcad78d3 Reviewed-on: https://chromium-review.googlesource.com/1054367 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 61859817
...@@ -1318,11 +1318,6 @@ void Program::unlink() ...@@ -1318,11 +1318,6 @@ void Program::unlink()
mInfoLog.reset(); mInfoLog.reset();
} }
bool Program::isLinked() const
{
return mLinked;
}
bool Program::hasLinkedShaderStage(ShaderType shaderType) const bool Program::hasLinkedShaderStage(ShaderType shaderType) const
{ {
ASSERT(shaderType != ShaderType::InvalidEnum); ASSERT(shaderType != ShaderType::InvalidEnum);
...@@ -1759,17 +1754,6 @@ const VariableLocation &Program::getUniformLocation(GLint location) const ...@@ -1759,17 +1754,6 @@ const VariableLocation &Program::getUniformLocation(GLint location) const
return mState.mUniformLocations[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];
}
const BufferVariable &Program::getBufferVariableByIndex(GLuint index) const const BufferVariable &Program::getBufferVariableByIndex(GLuint index) const
{ {
ASSERT(index < static_cast<size_t>(mState.mBufferVariables.size())); ASSERT(index < static_cast<size_t>(mState.mBufferVariables.size()));
......
...@@ -404,10 +404,10 @@ class ProgramState final : angle::NonCopyable ...@@ -404,10 +404,10 @@ class ProgramState final : angle::NonCopyable
RangeUI mAtomicCounterUniformRange; RangeUI mAtomicCounterUniformRange;
// An array of the samplers that are used by the program // An array of the samplers that are used by the program
std::vector<gl::SamplerBinding> mSamplerBindings; std::vector<SamplerBinding> mSamplerBindings;
// An array of the images that are used by the program // An array of the images that are used by the program
std::vector<gl::ImageBinding> mImageBindings; std::vector<ImageBinding> mImageBindings;
// Names and mapped names of output variables that are arrays include [0] in the end, similarly // Names and mapped names of output variables that are arrays include [0] in the end, similarly
// to uniforms. // to uniforms.
...@@ -494,8 +494,8 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -494,8 +494,8 @@ class Program final : angle::NonCopyable, public LabeledObject
GLint components, GLint components,
const GLfloat *coeffs); const GLfloat *coeffs);
Error link(const gl::Context *context); Error link(const Context *context);
bool isLinked() const; bool isLinked() const { return mLinked; }
bool hasLinkedShaderStage(ShaderType shaderType) const; bool hasLinkedShaderStage(ShaderType shaderType) const;
...@@ -552,8 +552,16 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -552,8 +552,16 @@ class Program final : angle::NonCopyable, public LabeledObject
bool isValidUniformLocation(GLint location) const; bool isValidUniformLocation(GLint location) const;
const LinkedUniform &getUniformByLocation(GLint location) const; const LinkedUniform &getUniformByLocation(GLint location) const;
const VariableLocation &getUniformLocation(GLint location) const; const VariableLocation &getUniformLocation(GLint location) const;
const std::vector<VariableLocation> &getUniformLocations() const; const std::vector<VariableLocation> &getUniformLocations() const
const LinkedUniform &getUniformByIndex(GLuint index) const; {
return mState.mUniformLocations;
}
const LinkedUniform &getUniformByIndex(GLuint index) const
{
ASSERT(index < static_cast<size_t>(mState.mUniforms.size()));
return mState.mUniforms[index];
}
const BufferVariable &getBufferVariableByIndex(GLuint index) const; const BufferVariable &getBufferVariableByIndex(GLuint index) const;
...@@ -632,7 +640,7 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -632,7 +640,7 @@ class Program final : angle::NonCopyable, public LabeledObject
void validate(const Caps &caps); void validate(const Caps &caps);
bool validateSamplers(InfoLog *infoLog, const Caps &caps); bool validateSamplers(InfoLog *infoLog, const Caps &caps);
bool isValidated() const; bool isValidated() const;
bool samplesFromTexture(const gl::State &state, GLuint textureID) const; bool samplesFromTexture(const State &state, GLuint textureID) const;
const AttributesMask &getActiveAttribLocationsMask() const const AttributesMask &getActiveAttribLocationsMask() const
{ {
...@@ -735,7 +743,7 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -735,7 +743,7 @@ class Program final : angle::NonCopyable, public LabeledObject
bool linkValidateFragmentInputBindings(const Context *context, InfoLog &infoLog) const; bool linkValidateFragmentInputBindings(const Context *context, InfoLog &infoLog) const;
bool linkValidateBuiltInVaryings(const Context *context, InfoLog &infoLog) const; bool linkValidateBuiltInVaryings(const Context *context, InfoLog &infoLog) const;
bool linkValidateTransformFeedback(const gl::Context *context, bool linkValidateTransformFeedback(const Context *context,
InfoLog &infoLog, InfoLog &infoLog,
const ProgramMergedVaryings &linkedVaryings, const ProgramMergedVaryings &linkedVaryings,
const Caps &caps) const; const Caps &caps) const;
......
...@@ -49,7 +49,7 @@ void VertexBinding::setBuffer(const gl::Context *context, Buffer *bufferIn, bool ...@@ -49,7 +49,7 @@ void VertexBinding::setBuffer(const gl::Context *context, Buffer *bufferIn, bool
mBuffer->onBindingChanged(context, true, BufferBinding::Array); mBuffer->onBindingChanged(context, true, BufferBinding::Array);
} }
void VertexBinding::onContainerBindingChanged(const Context *context, bool bound) void VertexBinding::onContainerBindingChanged(const Context *context, bool bound) const
{ {
if (mBuffer.get()) if (mBuffer.get())
mBuffer->onBindingChanged(context, bound, BufferBinding::Array); mBuffer->onBindingChanged(context, bound, BufferBinding::Array);
...@@ -71,11 +71,6 @@ void VertexBinding::updateCachedBufferSizeMinusOffset() ...@@ -71,11 +71,6 @@ void VertexBinding::updateCachedBufferSizeMinusOffset()
} }
} }
GLuint64 VertexBinding::getCachedBufferSizeMinusOffset() const
{
return mCachedBufferSizeMinusOffset;
}
VertexAttribute::VertexAttribute(GLuint bindingIndex) VertexAttribute::VertexAttribute(GLuint bindingIndex)
: enabled(false), : enabled(false),
type(GL_FLOAT), type(GL_FLOAT),
......
...@@ -39,11 +39,15 @@ class VertexBinding final : angle::NonCopyable ...@@ -39,11 +39,15 @@ class VertexBinding final : angle::NonCopyable
const BindingPointer<Buffer> &getBuffer() const { return mBuffer; } const BindingPointer<Buffer> &getBuffer() const { return mBuffer; }
void setBuffer(const gl::Context *context, Buffer *bufferIn, bool containerIsBound); void setBuffer(const gl::Context *context, Buffer *bufferIn, bool containerIsBound);
void onContainerBindingChanged(const Context *context, bool bound); void onContainerBindingChanged(const Context *context, bool bound) const;
GLuint64 getCachedBufferSizeMinusOffset() const
{
return mCachedBufferSizeMinusOffset;
}
// Called from VertexArray. // Called from VertexArray.
void updateCachedBufferSizeMinusOffset(); void updateCachedBufferSizeMinusOffset();
GLuint64 getCachedBufferSizeMinusOffset() const;
private: private:
GLuint mStride; GLuint mStride;
......
...@@ -2096,7 +2096,7 @@ bool ValidateUniformCommonBase(Context *context, ...@@ -2096,7 +2096,7 @@ bool ValidateUniformCommonBase(Context *context,
const auto &uniform = program->getUniformByIndex(uniformLocation.index); 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 (count > 1 && !uniform.isArray())
{ {
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