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 @@
namespace gl
{
namespace
{
constexpr angle::SubjectIndex kImplementationSubjectIndex = 0;
} // anonymous namespace
BufferState::BufferState()
: mLabel(),
......@@ -38,8 +42,11 @@ BufferState::~BufferState()
}
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()
......@@ -90,7 +97,7 @@ Error Buffer::bufferData(Context *context,
mState.mSize = size;
// Notify when storage changes.
mImpl->onStateChange(context, angle::SubjectMessage::STORAGE_CHANGED);
onStateChange(context, angle::SubjectMessage::STORAGE_CHANGED);
return NoError();
}
......@@ -106,7 +113,7 @@ Error Buffer::bufferSubData(const Context *context,
mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size));
// Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
return NoError();
}
......@@ -123,7 +130,7 @@ Error Buffer::copyBufferSubData(const Context *context,
mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size));
// Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
return NoError();
}
......@@ -145,7 +152,7 @@ Error Buffer::map(const Context *context, GLenum access)
mIndexRangeCache.clear();
// Notify when state changes.
mImpl->onStateChange(context, angle::SubjectMessage::RESOURCE_MAPPED);
onStateChange(context, angle::SubjectMessage::RESOURCE_MAPPED);
return NoError();
}
......@@ -178,7 +185,7 @@ Error Buffer::mapRange(const Context *context,
}
// Notify when state changes.
mImpl->onStateChange(context, angle::SubjectMessage::RESOURCE_MAPPED);
onStateChange(context, angle::SubjectMessage::RESOURCE_MAPPED);
return NoError();
}
......@@ -198,7 +205,7 @@ Error Buffer::unmap(const Context *context, GLboolean *result)
mState.mAccessFlags = 0;
// Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::RESOURCE_UNMAPPED);
onStateChange(context, angle::SubjectMessage::RESOURCE_UNMAPPED);
return NoError();
}
......@@ -208,7 +215,7 @@ void Buffer::onTransformFeedback(const Context *context)
mIndexRangeCache.clear();
// Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
}
void Buffer::onPixelPack(const Context *context)
......@@ -216,7 +223,7 @@ void Buffer::onPixelPack(const Context *context)
mIndexRangeCache.clear();
// Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
}
Error Buffer::getIndexRange(const gl::Context *context,
......@@ -270,11 +277,20 @@ void Buffer::onTFBindingChanged(const Context *context, bool bound, bool indexed
ASSERT(bound || mState.mTransformFeedbackIndexedBindingCount > 0);
mState.mTransformFeedbackIndexedBindingCount += bound ? 1 : -1;
mImpl->onStateChange(context, angle::SubjectMessage::BINDING_CHANGED);
onStateChange(context, angle::SubjectMessage::BINDING_CHANGED);
}
else
{
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
......@@ -16,6 +16,7 @@
#include "libANGLE/Debug.h"
#include "libANGLE/Error.h"
#include "libANGLE/IndexRangeCache.h"
#include "libANGLE/Observer.h"
#include "libANGLE/RefCountObject.h"
namespace rx
......@@ -64,7 +65,10 @@ class BufferState final : angle::NonCopyable
int mTransformFeedbackGenericBindingCount;
};
class Buffer final : public RefCountObject, public LabeledObject
class Buffer final : public RefCountObject,
public LabeledObject,
public angle::ObserverInterface,
public angle::Subject
{
public:
Buffer(rx::GLImplFactory *factory, GLuint id);
......@@ -121,9 +125,15 @@ class Buffer final : public RefCountObject, public LabeledObject
void onTFBindingChanged(const Context *context, bool bound, bool indexed);
void onNonTFBindingChanged(int incr) { mState.mBindingCount += incr; }
// angle::ObserverInterface implementation.
void onSubjectStateChange(const gl::Context *context,
angle::SubjectIndex index,
angle::SubjectMessage message) override;
private:
BufferState mState;
rx::BufferImpl *mImpl;
angle::ObserverBinding mImplObserver;
mutable IndexRangeCache mIndexRangeCache;
};
......
......@@ -5138,7 +5138,7 @@ void Context::bindBufferRange(BufferBinding target,
mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
if (target == BufferBinding::Uniform)
{
mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
mUniformBufferObserverBindings[index].bind(object);
mStateCache.onUniformBufferStateChange(this);
}
else
......
......@@ -24,7 +24,6 @@
#include "libANGLE/formatutils.h"
#include "libANGLE/queryconversions.h"
#include "libANGLE/queryutils.h"
#include "libANGLE/renderer/BufferImpl.h"
#include "libANGLE/renderer/ContextImpl.h"
#include "libANGLE/renderer/TextureImpl.h"
......@@ -167,16 +166,12 @@ void State::setGenericBufferBinding<BufferBinding::ElementArray>(const Context *
oldBuffer->release(context);
}
mVertexArray->mState.mElementArrayBuffer.assign(buffer);
mVertexArray->mElementArrayBufferObserverBinding.bind(buffer);
if (buffer)
{
mVertexArray->mElementArrayBufferObserverBinding.bind(buffer->getImplementation());
buffer->onNonTFBindingChanged(1);
buffer->addRef();
}
else
{
mVertexArray->mElementArrayBufferObserverBinding.bind(nullptr);
}
mVertexArray->mDirtyBits.set(VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER);
mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
}
......
......@@ -467,8 +467,7 @@ void VertexArray::setDependentDirtyBit(const gl::Context *context,
void VertexArray::updateObserverBinding(size_t bindingIndex)
{
Buffer *boundBuffer = mState.mVertexBindings[bindingIndex].getBuffer().get();
mArrayBufferObserverBindings[bindingIndex].bind(boundBuffer ? boundBuffer->getImplementation()
: nullptr);
mArrayBufferObserverBindings[bindingIndex].bind(boundBuffer);
}
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