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
return !mFastObservers.empty();
}
void Subject::addObserver(ObserverBinding *observer)
ANGLE_INLINE void Subject::addObserver(ObserverBinding *observer)
{
ASSERT(!IsInContainer(mFastObservers, observer) && !IsInContainer(mSlowObservers, 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);
if (iter != mFastObservers.end())
// TODO(jmadill): De-duplicate remove code. http://anglebug.com/2763
if (mSlowObservers.empty())
{
size_t index = iter - mFastObservers.begin();
std::swap(mFastObservers[index], mFastObservers[mFastObservers.size() - 1]);
mFastObservers.resize(mFastObservers.size() - 1);
if (!mSlowObservers.empty())
size_t fastLen = mFastObservers.size();
for (size_t index = 0; index < fastLen; ++index)
{
mFastObservers.push_back(mSlowObservers.back());
mSlowObservers.pop_back();
ASSERT(mFastObservers.full());
if (mFastObservers[index] == observer)
{
mFastObservers[index] = mFastObservers[fastLen - 1];
mFastObservers.pop_back();
}
}
}
else
{
auto slowIter = std::find(mSlowObservers.begin(), mSlowObservers.end(), observer);
ASSERT(slowIter != mSlowObservers.end());
mSlowObservers.erase(slowIter);
auto iter = std::find(mFastObservers.begin(), mFastObservers.end(), observer);
if (iter != mFastObservers.end())
{
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
switch (target)
{
case BufferBinding::PixelPack:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
break;
case BufferBinding::PixelUnpack:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
break;
case BufferBinding::DrawIndirect:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
break;
case BufferBinding::DispatchIndirect:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
break;
case BufferBinding::ElementArray:
......@@ -1464,7 +1464,7 @@ void State::setBufferBinding(const Context *context, BufferBinding target, Buffe
mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
break;
case BufferBinding::ShaderStorage:
UpdateBufferBinding(context, &mBoundBuffers[target], buffer, target);
UpdateNonTFBufferBinding(context, &mBoundBuffers[target], buffer);
mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
break;
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