Commit fcfd3382 by Jamie Madill Committed by Commit Bot

More binding inlining.

Slight performance increase in binding related tests. Bug: angleproject:2763 Change-Id: I4d14177adab678d596cd34b8f1b99f5309f017f0 Reviewed-on: https://chromium-review.googlesource.com/1227793 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 0fdb956d
...@@ -45,7 +45,7 @@ bool Subject::hasObservers() const ...@@ -45,7 +45,7 @@ bool Subject::hasObservers() const
return !mFastObservers.empty(); return !mFastObservers.empty();
} }
void Subject::addObserver(ObserverBinding *observer) ANGLE_INLINE void Subject::addObserver(ObserverBinding *observer)
{ {
ASSERT(!IsInContainer(mFastObservers, observer) && !IsInContainer(mSlowObservers, observer)); ASSERT(!IsInContainer(mFastObservers, observer) && !IsInContainer(mSlowObservers, observer));
...@@ -59,27 +59,40 @@ void Subject::addObserver(ObserverBinding *observer) ...@@ -59,27 +59,40 @@ void Subject::addObserver(ObserverBinding *observer)
} }
} }
void Subject::removeObserver(ObserverBinding *observer) ANGLE_INLINE void Subject::removeObserver(ObserverBinding *observer)
{ {
// TODO(jmadill): De-duplicate remove code. http://anglebug.com/2763
if (mSlowObservers.empty())
{
size_t fastLen = mFastObservers.size();
for (size_t index = 0; index < fastLen; ++index)
{
if (mFastObservers[index] == observer)
{
mFastObservers[index] = mFastObservers[fastLen - 1];
mFastObservers.pop_back();
}
}
}
else
{
auto iter = std::find(mFastObservers.begin(), mFastObservers.end(), observer); auto iter = std::find(mFastObservers.begin(), mFastObservers.end(), observer);
if (iter != mFastObservers.end()) if (iter != mFastObservers.end())
{ {
size_t index = iter - mFastObservers.begin(); size_t index = iter - mFastObservers.begin();
std::swap(mFastObservers[index], mFastObservers[mFastObservers.size() - 1]); std::swap(mFastObservers[index], mFastObservers[mFastObservers.size() - 1]);
mFastObservers.resize(mFastObservers.size() - 1); mFastObservers.resize(mFastObservers.size() - 1);
if (!mSlowObservers.empty())
{
mFastObservers.push_back(mSlowObservers.back()); mFastObservers.push_back(mSlowObservers.back());
mSlowObservers.pop_back(); mSlowObservers.pop_back();
ASSERT(mFastObservers.full()); ASSERT(mFastObservers.full());
} }
}
else else
{ {
auto slowIter = std::find(mSlowObservers.begin(), mSlowObservers.end(), observer); auto slowIter = std::find(mSlowObservers.begin(), mSlowObservers.end(), observer);
ASSERT(slowIter != mSlowObservers.end()); ASSERT(slowIter != mSlowObservers.end());
mSlowObservers.erase(slowIter); mSlowObservers.erase(slowIter);
} }
}
} }
void Subject::onStateChange(const gl::Context *context, SubjectMessage message) const void Subject::onStateChange(const gl::Context *context, SubjectMessage message) const
......
...@@ -1444,19 +1444,19 @@ void State::setBufferBinding(const Context *context, BufferBinding target, Buffe ...@@ -1444,19 +1444,19 @@ void State::setBufferBinding(const Context *context, BufferBinding target, Buffe
switch (target) switch (target)
{ {
case BufferBinding::PixelPack: case BufferBinding::PixelPack:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target); UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING); mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
break; break;
case BufferBinding::PixelUnpack: case BufferBinding::PixelUnpack:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target); UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING); mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
break; break;
case BufferBinding::DrawIndirect: case BufferBinding::DrawIndirect:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target); UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING); mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
break; break;
case BufferBinding::DispatchIndirect: case BufferBinding::DispatchIndirect:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target); UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING); mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
break; break;
case BufferBinding::ElementArray: case BufferBinding::ElementArray:
...@@ -1464,7 +1464,7 @@ void State::setBufferBinding(const Context *context, BufferBinding target, Buffe ...@@ -1464,7 +1464,7 @@ void State::setBufferBinding(const Context *context, BufferBinding target, Buffe
mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY); mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
break; break;
case BufferBinding::ShaderStorage: case BufferBinding::ShaderStorage:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target); UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING); mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
break; break;
default: default:
......
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