Commit 0cc11c68 by Jamie Madill Committed by Commit Bot

StateManagerGL: Remove setGenericShaderState.

We can mutate the BitSetIterator as it clears dirty bits. This removes the risk of doing a double state update. Improves the proformance of the GL back-end state update. Also do an early-out before calling syncDrawArraysState. Bug: angleproject:2763 Change-Id: Idd25bdd67a6aceff05529a533260b661b07c2928 Reviewed-on: https://chromium-review.googlesource.com/c/1262740 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent d4f07760
...@@ -56,6 +56,20 @@ class BitSetT final ...@@ -56,6 +56,20 @@ class BitSetT final
bool operator!=(const Iterator &other) const; bool operator!=(const Iterator &other) const;
ParamT operator*() const; ParamT operator*() const;
// These helper functions allow mutating an iterator in-flight.
// They only operate on later bits to ensure we don't iterate the same bit twice.
void resetLaterBit(std::size_t index)
{
ASSERT(index > mCurrentBit);
mBitsCopy.reset(index);
}
void setLaterBit(std::size_t index)
{
ASSERT(index > mCurrentBit);
mBitsCopy.set(index);
}
private: private:
std::size_t getNextBit(); std::size_t getNextBit();
...@@ -144,6 +158,20 @@ class IterableBitSet : public std::bitset<N> ...@@ -144,6 +158,20 @@ class IterableBitSet : public std::bitset<N>
bool operator!=(const Iterator &other) const; bool operator!=(const Iterator &other) const;
unsigned long operator*() const { return mCurrentBit; } unsigned long operator*() const { return mCurrentBit; }
// These helper functions allow mutating an iterator in-flight.
// They only operate on later bits to ensure we don't iterate the same bit twice.
void resetLaterBit(std::size_t index)
{
ASSERT(index > mCurrentBit);
mBits.reset(index - mOffset);
}
void setLaterBit(std::size_t index)
{
ASSERT(index > mCurrentBit);
mBits.set(index - mOffset);
}
private: private:
unsigned long getNextBit(); unsigned long getNextBit();
......
...@@ -109,4 +109,53 @@ TEST_F(BitSetIteratorTest, BitAssignment) ...@@ -109,4 +109,53 @@ TEST_F(BitSetIteratorTest, BitAssignment)
} }
} }
// Tests adding bits to the iterator during iteration.
TEST_F(BitSetIteratorTest, SetLaterBit)
{
std::set<size_t> expectedValues = {1, 3, 5, 7, 9};
mStateBits.set(1);
std::set<size_t> actualValues;
for (auto iter = mStateBits.begin(), end = mStateBits.end(); iter != end; ++iter)
{
if (*iter == 1)
{
iter.setLaterBit(3);
iter.setLaterBit(5);
iter.setLaterBit(7);
iter.setLaterBit(9);
}
actualValues.insert(*iter);
}
EXPECT_EQ(expectedValues, actualValues);
}
// Tests removing bits from the iterator during iteration.
TEST_F(BitSetIteratorTest, ResetLaterBit)
{
std::set<size_t> expectedValues = {1, 3, 5, 7, 9};
for (size_t index = 1; index <= 9; ++index)
mStateBits.set(index);
std::set<size_t> actualValues;
for (auto iter = mStateBits.begin(), end = mStateBits.end(); iter != end; ++iter)
{
if (*iter == 1)
{
iter.resetLaterBit(2);
iter.resetLaterBit(4);
iter.resetLaterBit(6);
iter.resetLaterBit(8);
}
actualValues.insert(*iter);
}
EXPECT_EQ(expectedValues, actualValues);
}
} // anonymous namespace } // anonymous namespace
...@@ -5296,14 +5296,14 @@ bool Context::getZeroFilledBuffer(size_t requstedSizeBytes, ...@@ -5296,14 +5296,14 @@ bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
Error Context::prepareForDispatch() Error Context::prepareForDispatch()
{ {
ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects)); ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
if (isRobustResourceInitEnabled()) if (isRobustResourceInitEnabled())
{ {
ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this)); ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
} }
return NoError(); return syncDirtyBits(mComputeDirtyBits);
} }
void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
......
...@@ -439,10 +439,7 @@ class State : angle::NonCopyable ...@@ -439,10 +439,7 @@ class State : angle::NonCopyable
DIRTY_BIT_VERTEX_ARRAY_BINDING, DIRTY_BIT_VERTEX_ARRAY_BINDING,
DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING, DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING,
DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING, DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING,
DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING,
DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING,
// TODO(jmadill): Fine-grained dirty bits for each index. // TODO(jmadill): Fine-grained dirty bits for each index.
DIRTY_BIT_UNIFORM_BUFFER_BINDINGS,
DIRTY_BIT_PROGRAM_BINDING, DIRTY_BIT_PROGRAM_BINDING,
DIRTY_BIT_PROGRAM_EXECUTABLE, DIRTY_BIT_PROGRAM_EXECUTABLE,
// TODO(jmadill): Fine-grained dirty bits for each texture/sampler. // TODO(jmadill): Fine-grained dirty bits for each texture/sampler.
...@@ -450,6 +447,9 @@ class State : angle::NonCopyable ...@@ -450,6 +447,9 @@ class State : angle::NonCopyable
DIRTY_BIT_SAMPLER_BINDINGS, DIRTY_BIT_SAMPLER_BINDINGS,
DIRTY_BIT_IMAGE_BINDINGS, DIRTY_BIT_IMAGE_BINDINGS,
DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING, DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING,
DIRTY_BIT_UNIFORM_BUFFER_BINDINGS,
DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING,
DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING,
DIRTY_BIT_MULTISAMPLING, DIRTY_BIT_MULTISAMPLING,
DIRTY_BIT_SAMPLE_ALPHA_TO_ONE, DIRTY_BIT_SAMPLE_ALPHA_TO_ONE,
DIRTY_BIT_COVERAGE_MODULATION, // CHROMIUM_framebuffer_mixed_samples DIRTY_BIT_COVERAGE_MODULATION, // CHROMIUM_framebuffer_mixed_samples
......
...@@ -683,14 +683,12 @@ angle::Result RendererGL::dispatchCompute(const gl::Context *context, ...@@ -683,14 +683,12 @@ angle::Result RendererGL::dispatchCompute(const gl::Context *context,
GLuint numGroupsY, GLuint numGroupsY,
GLuint numGroupsZ) GLuint numGroupsZ)
{ {
ANGLE_TRY(mStateManager->setDispatchComputeState(context));
mFunctions->dispatchCompute(numGroupsX, numGroupsY, numGroupsZ); mFunctions->dispatchCompute(numGroupsX, numGroupsY, numGroupsZ);
return angle::Result::Continue(); return angle::Result::Continue();
} }
angle::Result RendererGL::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) angle::Result RendererGL::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect)
{ {
ANGLE_TRY(mStateManager->setDispatchComputeState(context));
mFunctions->dispatchComputeIndirect(indirect); mFunctions->dispatchComputeIndirect(indirect);
return angle::Result::Continue(); return angle::Result::Continue();
} }
......
...@@ -23,7 +23,7 @@ struct Caps; ...@@ -23,7 +23,7 @@ struct Caps;
class ContextState; class ContextState;
class State; class State;
class FramebufferState; class FramebufferState;
} } // namespace gl
namespace rx namespace rx
{ {
...@@ -165,8 +165,6 @@ class StateManagerGL final : angle::NonCopyable ...@@ -165,8 +165,6 @@ class StateManagerGL final : angle::NonCopyable
const void **outIndices); const void **outIndices);
angle::Result setDrawIndirectState(const gl::Context *context); angle::Result setDrawIndirectState(const gl::Context *context);
angle::Result setDispatchComputeState(const gl::Context *context);
void pauseTransformFeedback(); void pauseTransformFeedback();
angle::Result pauseAllQueries(const gl::Context *context); angle::Result pauseAllQueries(const gl::Context *context);
angle::Result pauseQuery(const gl::Context *context, gl::QueryType type); angle::Result pauseQuery(const gl::Context *context, gl::QueryType type);
...@@ -178,16 +176,19 @@ class StateManagerGL final : angle::NonCopyable ...@@ -178,16 +176,19 @@ class StateManagerGL final : angle::NonCopyable
const gl::State::DirtyBits &glDirtyBits, const gl::State::DirtyBits &glDirtyBits,
const gl::State::DirtyBits &bitMask); const gl::State::DirtyBits &bitMask);
void updateMultiviewBaseViewLayerIndexUniform( ANGLE_INLINE void updateMultiviewBaseViewLayerIndexUniform(
const gl::Program *program, const gl::Program *program,
const gl::FramebufferState &drawFramebufferState) const; const gl::FramebufferState &drawFramebufferState) const
{
if (mIsMultiviewEnabled && program && program->usesMultiview())
{
updateMultiviewBaseViewLayerIndexUniformImpl(program, drawFramebufferState);
}
}
GLuint getVertexArrayID() const { return mVAO; } GLuint getVertexArrayID() const { return mVAO; }
private: private:
// Set state that's common among draw commands and compute invocations.
void setGenericShaderState(const gl::Context *context);
// Set state that's common among draw commands. // Set state that's common among draw commands.
angle::Result setGenericDrawState(const gl::Context *context); angle::Result setGenericDrawState(const gl::Context *context);
...@@ -211,6 +212,10 @@ class StateManagerGL final : angle::NonCopyable ...@@ -211,6 +212,10 @@ class StateManagerGL final : angle::NonCopyable
void syncSamplersState(const gl::Context *context); void syncSamplersState(const gl::Context *context);
void syncTransformFeedbackState(const gl::Context *context); void syncTransformFeedbackState(const gl::Context *context);
void updateMultiviewBaseViewLayerIndexUniformImpl(
const gl::Program *program,
const gl::FramebufferState &drawFramebufferState) const;
enum MultiviewDirtyBitType enum MultiviewDirtyBitType
{ {
MULTIVIEW_DIRTY_BIT_SIDE_BY_SIDE_LAYOUT, MULTIVIEW_DIRTY_BIT_SIDE_BY_SIDE_LAYOUT,
...@@ -368,13 +373,7 @@ class StateManagerGL final : angle::NonCopyable ...@@ -368,13 +373,7 @@ class StateManagerGL final : angle::NonCopyable
// ANGLE_multiview dirty bits. // ANGLE_multiview dirty bits.
angle::BitSet<MULTIVIEW_DIRTY_BIT_MAX> mMultiviewDirtyBits; angle::BitSet<MULTIVIEW_DIRTY_BIT_MAX> mMultiviewDirtyBits;
bool mProgramTexturesDirty;
bool mProgramStorageBuffersDirty;
bool mProgramUniformBuffersDirty;
bool mProgramAtomicCounterBuffersDirty;
bool mProgramImagesDirty;
}; };
} } // namespace rx
#endif // LIBANGLE_RENDERER_GL_STATEMANAGERGL_H_ #endif // LIBANGLE_RENDERER_GL_STATEMANAGERGL_H_
...@@ -104,11 +104,11 @@ void VertexArrayGL::destroy(const gl::Context *context) ...@@ -104,11 +104,11 @@ void VertexArrayGL::destroy(const gl::Context *context)
} }
} }
angle::Result VertexArrayGL::syncDrawArraysState(const gl::Context *context, angle::Result VertexArrayGL::syncClientSideData(const gl::Context *context,
const gl::AttributesMask &activeAttributesMask, const gl::AttributesMask &activeAttributesMask,
GLint first, GLint first,
GLsizei count, GLsizei count,
GLsizei instanceCount) const GLsizei instanceCount) const
{ {
return syncDrawState(context, activeAttributesMask, first, count, GL_NONE, nullptr, return syncDrawState(context, activeAttributesMask, first, count, GL_NONE, nullptr,
instanceCount, false, nullptr); instanceCount, false, nullptr);
......
...@@ -27,11 +27,11 @@ class VertexArrayGL : public VertexArrayImpl ...@@ -27,11 +27,11 @@ class VertexArrayGL : public VertexArrayImpl
void destroy(const gl::Context *context) override; void destroy(const gl::Context *context) override;
angle::Result syncDrawArraysState(const gl::Context *context, angle::Result syncClientSideData(const gl::Context *context,
const gl::AttributesMask &activeAttributesMask, const gl::AttributesMask &activeAttributesMask,
GLint first, GLint first,
GLsizei count, GLsizei count,
GLsizei instanceCount) const; GLsizei instanceCount) const;
angle::Result syncDrawElementsState(const gl::Context *context, angle::Result syncDrawElementsState(const gl::Context *context,
const gl::AttributesMask &activeAttributesMask, const gl::AttributesMask &activeAttributesMask,
GLsizei count, GLsizei count,
......
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