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,26 +59,39 @@ void Subject::addObserver(ObserverBinding *observer) ...@@ -59,26 +59,39 @@ void Subject::addObserver(ObserverBinding *observer)
} }
} }
void Subject::removeObserver(ObserverBinding *observer) ANGLE_INLINE void Subject::removeObserver(ObserverBinding *observer)
{ {
auto iter = std::find(mFastObservers.begin(), mFastObservers.end(), observer); // TODO(jmadill): De-duplicate remove code. http://anglebug.com/2763
if (iter != mFastObservers.end()) if (mSlowObservers.empty())
{ {
size_t index = iter - mFastObservers.begin(); size_t fastLen = mFastObservers.size();
std::swap(mFastObservers[index], mFastObservers[mFastObservers.size() - 1]); for (size_t index = 0; index < fastLen; ++index)
mFastObservers.resize(mFastObservers.size() - 1);
if (!mSlowObservers.empty())
{ {
mFastObservers.push_back(mSlowObservers.back()); if (mFastObservers[index] == observer)
mSlowObservers.pop_back(); {
ASSERT(mFastObservers.full()); mFastObservers[index] = mFastObservers[fastLen - 1];
mFastObservers.pop_back();
}
} }
} }
else else
{ {
auto slowIter = std::find(mSlowObservers.begin(), mSlowObservers.end(), observer); auto iter = std::find(mFastObservers.begin(), mFastObservers.end(), observer);
ASSERT(slowIter != mSlowObservers.end()); if (iter != mFastObservers.end())
mSlowObservers.erase(slowIter); {
size_t index = iter - mFastObservers.begin();
std::swap(mFastObservers[index], mFastObservers[mFastObservers.size() - 1]);
mFastObservers.resize(mFastObservers.size() - 1);
mFastObservers.push_back(mSlowObservers.back());
mSlowObservers.pop_back();
ASSERT(mFastObservers.full());
}
else
{
auto slowIter = std::find(mSlowObservers.begin(), mSlowObservers.end(), observer);
ASSERT(slowIter != mSlowObservers.end());
mSlowObservers.erase(slowIter);
}
} }
} }
......
...@@ -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