Commit 472ddc82 by Jamie Madill Committed by Commit Bot

Make gl::Buffer an angle::Subject.

This will allow us to share the BindingPointer and ObserverBinding. It also cleans up the code a little bit. Bug: angleproject:2891 Change-Id: Ib8e2c34ccd379dc5b5648bac324fa4ff22a5a1a0 Reviewed-on: https://chromium-review.googlesource.com/c/1270216 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarFrank Henigman <fjhenigman@chromium.org>
parent ca8eda41
...@@ -16,6 +16,10 @@ ...@@ -16,6 +16,10 @@
namespace gl namespace gl
{ {
namespace
{
constexpr angle::SubjectIndex kImplementationSubjectIndex = 0;
} // anonymous namespace
BufferState::BufferState() BufferState::BufferState()
: mLabel(), : mLabel(),
...@@ -38,8 +42,11 @@ BufferState::~BufferState() ...@@ -38,8 +42,11 @@ BufferState::~BufferState()
} }
Buffer::Buffer(rx::GLImplFactory *factory, GLuint id) Buffer::Buffer(rx::GLImplFactory *factory, GLuint id)
: RefCountObject(id), mImpl(factory->createBuffer(mState)) : RefCountObject(id),
mImpl(factory->createBuffer(mState)),
mImplObserver(this, kImplementationSubjectIndex)
{ {
mImplObserver.bind(mImpl);
} }
Buffer::~Buffer() Buffer::~Buffer()
...@@ -90,7 +97,7 @@ Error Buffer::bufferData(Context *context, ...@@ -90,7 +97,7 @@ Error Buffer::bufferData(Context *context,
mState.mSize = size; mState.mSize = size;
// Notify when storage changes. // Notify when storage changes.
mImpl->onStateChange(context, angle::SubjectMessage::STORAGE_CHANGED); onStateChange(context, angle::SubjectMessage::STORAGE_CHANGED);
return NoError(); return NoError();
} }
...@@ -106,7 +113,7 @@ Error Buffer::bufferSubData(const Context *context, ...@@ -106,7 +113,7 @@ Error Buffer::bufferSubData(const Context *context,
mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size)); mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size));
// Notify when data changes. // Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED); onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
return NoError(); return NoError();
} }
...@@ -123,7 +130,7 @@ Error Buffer::copyBufferSubData(const Context *context, ...@@ -123,7 +130,7 @@ Error Buffer::copyBufferSubData(const Context *context,
mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size)); mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size));
// Notify when data changes. // Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED); onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
return NoError(); return NoError();
} }
...@@ -145,7 +152,7 @@ Error Buffer::map(const Context *context, GLenum access) ...@@ -145,7 +152,7 @@ Error Buffer::map(const Context *context, GLenum access)
mIndexRangeCache.clear(); mIndexRangeCache.clear();
// Notify when state changes. // Notify when state changes.
mImpl->onStateChange(context, angle::SubjectMessage::RESOURCE_MAPPED); onStateChange(context, angle::SubjectMessage::RESOURCE_MAPPED);
return NoError(); return NoError();
} }
...@@ -178,7 +185,7 @@ Error Buffer::mapRange(const Context *context, ...@@ -178,7 +185,7 @@ Error Buffer::mapRange(const Context *context,
} }
// Notify when state changes. // Notify when state changes.
mImpl->onStateChange(context, angle::SubjectMessage::RESOURCE_MAPPED); onStateChange(context, angle::SubjectMessage::RESOURCE_MAPPED);
return NoError(); return NoError();
} }
...@@ -198,7 +205,7 @@ Error Buffer::unmap(const Context *context, GLboolean *result) ...@@ -198,7 +205,7 @@ Error Buffer::unmap(const Context *context, GLboolean *result)
mState.mAccessFlags = 0; mState.mAccessFlags = 0;
// Notify when data changes. // Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::RESOURCE_UNMAPPED); onStateChange(context, angle::SubjectMessage::RESOURCE_UNMAPPED);
return NoError(); return NoError();
} }
...@@ -208,7 +215,7 @@ void Buffer::onTransformFeedback(const Context *context) ...@@ -208,7 +215,7 @@ void Buffer::onTransformFeedback(const Context *context)
mIndexRangeCache.clear(); mIndexRangeCache.clear();
// Notify when data changes. // Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED); onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
} }
void Buffer::onPixelPack(const Context *context) void Buffer::onPixelPack(const Context *context)
...@@ -216,7 +223,7 @@ void Buffer::onPixelPack(const Context *context) ...@@ -216,7 +223,7 @@ void Buffer::onPixelPack(const Context *context)
mIndexRangeCache.clear(); mIndexRangeCache.clear();
// Notify when data changes. // Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED); onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
} }
Error Buffer::getIndexRange(const gl::Context *context, Error Buffer::getIndexRange(const gl::Context *context,
...@@ -270,11 +277,20 @@ void Buffer::onTFBindingChanged(const Context *context, bool bound, bool indexed ...@@ -270,11 +277,20 @@ void Buffer::onTFBindingChanged(const Context *context, bool bound, bool indexed
ASSERT(bound || mState.mTransformFeedbackIndexedBindingCount > 0); ASSERT(bound || mState.mTransformFeedbackIndexedBindingCount > 0);
mState.mTransformFeedbackIndexedBindingCount += bound ? 1 : -1; mState.mTransformFeedbackIndexedBindingCount += bound ? 1 : -1;
mImpl->onStateChange(context, angle::SubjectMessage::BINDING_CHANGED); onStateChange(context, angle::SubjectMessage::BINDING_CHANGED);
} }
else else
{ {
mState.mTransformFeedbackGenericBindingCount += bound ? 1 : -1; mState.mTransformFeedbackGenericBindingCount += bound ? 1 : -1;
} }
} }
void Buffer::onSubjectStateChange(const gl::Context *context,
angle::SubjectIndex index,
angle::SubjectMessage message)
{
// Pass it along!
ASSERT(index == kImplementationSubjectIndex);
onStateChange(context, message);
}
} // namespace gl } // namespace gl
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "libANGLE/Debug.h" #include "libANGLE/Debug.h"
#include "libANGLE/Error.h" #include "libANGLE/Error.h"
#include "libANGLE/IndexRangeCache.h" #include "libANGLE/IndexRangeCache.h"
#include "libANGLE/Observer.h"
#include "libANGLE/RefCountObject.h" #include "libANGLE/RefCountObject.h"
namespace rx namespace rx
...@@ -64,7 +65,10 @@ class BufferState final : angle::NonCopyable ...@@ -64,7 +65,10 @@ class BufferState final : angle::NonCopyable
int mTransformFeedbackGenericBindingCount; int mTransformFeedbackGenericBindingCount;
}; };
class Buffer final : public RefCountObject, public LabeledObject class Buffer final : public RefCountObject,
public LabeledObject,
public angle::ObserverInterface,
public angle::Subject
{ {
public: public:
Buffer(rx::GLImplFactory *factory, GLuint id); Buffer(rx::GLImplFactory *factory, GLuint id);
...@@ -121,9 +125,15 @@ class Buffer final : public RefCountObject, public LabeledObject ...@@ -121,9 +125,15 @@ class Buffer final : public RefCountObject, public LabeledObject
void onTFBindingChanged(const Context *context, bool bound, bool indexed); void onTFBindingChanged(const Context *context, bool bound, bool indexed);
void onNonTFBindingChanged(int incr) { mState.mBindingCount += incr; } void onNonTFBindingChanged(int incr) { mState.mBindingCount += incr; }
// angle::ObserverInterface implementation.
void onSubjectStateChange(const gl::Context *context,
angle::SubjectIndex index,
angle::SubjectMessage message) override;
private: private:
BufferState mState; BufferState mState;
rx::BufferImpl *mImpl; rx::BufferImpl *mImpl;
angle::ObserverBinding mImplObserver;
mutable IndexRangeCache mIndexRangeCache; mutable IndexRangeCache mIndexRangeCache;
}; };
......
...@@ -5138,7 +5138,7 @@ void Context::bindBufferRange(BufferBinding target, ...@@ -5138,7 +5138,7 @@ void Context::bindBufferRange(BufferBinding target,
mGLState.setIndexedBufferBinding(this, target, index, object, offset, size); mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
if (target == BufferBinding::Uniform) if (target == BufferBinding::Uniform)
{ {
mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr); mUniformBufferObserverBindings[index].bind(object);
mStateCache.onUniformBufferStateChange(this); mStateCache.onUniformBufferStateChange(this);
} }
else else
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#include "libANGLE/formatutils.h" #include "libANGLE/formatutils.h"
#include "libANGLE/queryconversions.h" #include "libANGLE/queryconversions.h"
#include "libANGLE/queryutils.h" #include "libANGLE/queryutils.h"
#include "libANGLE/renderer/BufferImpl.h"
#include "libANGLE/renderer/ContextImpl.h" #include "libANGLE/renderer/ContextImpl.h"
#include "libANGLE/renderer/TextureImpl.h" #include "libANGLE/renderer/TextureImpl.h"
...@@ -167,16 +166,12 @@ void State::setGenericBufferBinding<BufferBinding::ElementArray>(const Context * ...@@ -167,16 +166,12 @@ void State::setGenericBufferBinding<BufferBinding::ElementArray>(const Context *
oldBuffer->release(context); oldBuffer->release(context);
} }
mVertexArray->mState.mElementArrayBuffer.assign(buffer); mVertexArray->mState.mElementArrayBuffer.assign(buffer);
mVertexArray->mElementArrayBufferObserverBinding.bind(buffer);
if (buffer) if (buffer)
{ {
mVertexArray->mElementArrayBufferObserverBinding.bind(buffer->getImplementation());
buffer->onNonTFBindingChanged(1); buffer->onNonTFBindingChanged(1);
buffer->addRef(); buffer->addRef();
} }
else
{
mVertexArray->mElementArrayBufferObserverBinding.bind(nullptr);
}
mVertexArray->mDirtyBits.set(VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER); mVertexArray->mDirtyBits.set(VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER);
mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY); mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
} }
......
...@@ -467,8 +467,7 @@ void VertexArray::setDependentDirtyBit(const gl::Context *context, ...@@ -467,8 +467,7 @@ void VertexArray::setDependentDirtyBit(const gl::Context *context,
void VertexArray::updateObserverBinding(size_t bindingIndex) void VertexArray::updateObserverBinding(size_t bindingIndex)
{ {
Buffer *boundBuffer = mState.mVertexBindings[bindingIndex].getBuffer().get(); Buffer *boundBuffer = mState.mVertexBindings[bindingIndex].getBuffer().get();
mArrayBufferObserverBindings[bindingIndex].bind(boundBuffer ? boundBuffer->getImplementation() mArrayBufferObserverBindings[bindingIndex].bind(boundBuffer);
: nullptr);
} }
void VertexArray::updateCachedBufferBindingSize(VertexBinding *binding) void VertexArray::updateCachedBufferBindingSize(VertexBinding *binding)
......
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