Skip to content

Commit 41e4458

Browse files
cclaoAngle LUCI CQ
authored andcommitted
BufferBindingMask in VertexArray::onBufferChanged are same buffer
The bufferBiningMask bits received from VertexArray::onBufferChanged() must point to the same buffer, in case of one buffer is bound to multiple binding points. We can do some minor optimization here when we loop the BufferBindingMask bits: We only need to calculate hasConflict once when we call updateCachedTransformFeedbackBindingValidation(). Bug: b/433331119 Change-Id: I9f7cfa543deb46cd369915293b97f5d3122e1708 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6826782 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
1 parent d63cff3 commit 41e4458

4 files changed

Lines changed: 39 additions & 17 deletions

File tree

src/libANGLE/Buffer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ void Buffer::onStateChange(const Context *context, angle::SubjectMessage message
549549

550550
// Apply the change directly on current context's current vertex array. All other vertex arrays
551551
// requires a buffer rebind in order to pick up the change.
552-
context->onBufferChanged(message,
552+
context->onBufferChanged(this, message,
553553
mVertexArrayBufferBindingMaskAndContext.getBufferBindingMask(context));
554554
}
555555

@@ -561,7 +561,7 @@ void Buffer::onContentsChange(const Context *context)
561561
static_cast<Texture *>(contentsObserver.observer)->onBufferContentsChange();
562562
}
563563

564-
context->onBufferChanged(angle::SubjectMessage::ContentsChanged,
564+
context->onBufferChanged(this, angle::SubjectMessage::ContentsChanged,
565565
mVertexArrayBufferBindingMaskAndContext.getBufferBindingMask(context));
566566
}
567567

src/libANGLE/Context.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,8 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
952952

953953
// Only used by vulkan backend.
954954
void onSwapChainImageChanged() const { mDefaultFramebuffer->onSwapChainImageChanged(); }
955-
void onBufferChanged(const angle::SubjectMessage message,
955+
void onBufferChanged(const Buffer *buffer,
956+
const angle::SubjectMessage message,
956957
VertexArrayBufferBindingMask vertexArrayBufferBindingMask) const
957958
{
958959
// Notify current vertex array of the buffer changed. Note that other vertex arrays of this
@@ -961,7 +962,8 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
961962
if (vertexArrayBufferBindingMask.any())
962963
{
963964
ASSERT(mState.mVertexArray != nullptr);
964-
mState.mVertexArray->onBufferChanged(this, message, vertexArrayBufferBindingMask);
965+
mState.mVertexArray->onBufferChanged(this, buffer, message,
966+
vertexArrayBufferBindingMask);
965967
}
966968
}
967969

src/libANGLE/VertexArray.cpp

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -315,14 +315,6 @@ ANGLE_INLINE void VertexArray::updateCachedMappedArrayBuffersBinding(size_t bind
315315
binding.getBoundAttributesMask());
316316
}
317317

318-
ANGLE_INLINE void VertexArray::updateCachedTransformFeedbackBindingValidation(size_t bindingIndex)
319-
{
320-
const Buffer *buffer = mVertexArrayBuffers[bindingIndex].get();
321-
ASSERT(buffer != nullptr);
322-
const bool hasConflict = buffer->hasWebGLXFBBindingConflict(true);
323-
mCachedBufferPropertyTransformFeedbackConflict.set(bindingIndex, hasConflict);
324-
}
325-
326318
void VertexArray::bindElementBuffer(const Context *context, Buffer *boundBuffer)
327319
{
328320
Buffer *oldBuffer = getElementArrayBuffer();
@@ -660,6 +652,24 @@ angle::Result VertexArray::syncState(const Context *context)
660652
return angle::Result::Continue;
661653
}
662654

655+
bool VertexArray::bufferMaskBitsPointToTheSameBuffer(
656+
VertexArrayBufferBindingMask bufferBindingMask) const
657+
{
658+
const Buffer *buffer = nullptr;
659+
for (size_t bindingIndex : bufferBindingMask)
660+
{
661+
if (buffer == nullptr)
662+
{
663+
buffer = mVertexArrayBuffers[bindingIndex].get();
664+
}
665+
else if (buffer != mVertexArrayBuffers[bindingIndex].get())
666+
{
667+
return false;
668+
}
669+
}
670+
return true;
671+
}
672+
663673
// This becomes current vertex array on the context
664674
void VertexArray::onBind(const Context *context)
665675
{
@@ -704,7 +714,8 @@ void VertexArray::onBind(const Context *context)
704714
{
705715
for (size_t bindingIndex : bufferBindingMask)
706716
{
707-
updateCachedTransformFeedbackBindingValidation(bindingIndex);
717+
bool hasConflict = mVertexArrayBuffers[bindingIndex]->hasWebGLXFBBindingConflict(true);
718+
mCachedBufferPropertyTransformFeedbackConflict.set(bindingIndex, hasConflict);
708719
}
709720
}
710721

@@ -845,12 +856,15 @@ void VertexArray::onSharedBufferBind(const Context *context,
845856
}
846857

847858
void VertexArray::onBufferChanged(const Context *context,
859+
const Buffer *buffer,
848860
angle::SubjectMessage message,
849861
VertexArrayBufferBindingMask vertexArrayBufferBindingMask)
850862
{
851863
VertexArrayBufferBindingMask bufferBindingMask =
852864
vertexArrayBufferBindingMask & mBufferBindingMask;
865+
ASSERT(buffer);
853866
ASSERT(bufferBindingMask.any());
867+
ASSERT(bufferMaskBitsPointToTheSameBuffer(bufferBindingMask));
854868

855869
switch (message)
856870
{
@@ -861,7 +875,6 @@ void VertexArray::onBufferChanged(const Context *context,
861875
VertexBufferBindingMask.reset(kElementArrayBufferIndex);
862876
for (size_t bindingIndex : VertexBufferBindingMask)
863877
{
864-
const Buffer *buffer = mVertexArrayBuffers[bindingIndex].get();
865878
mCachedBufferSize[bindingIndex] = buffer->getSize();
866879
updateCachedElementLimit(mState.mVertexBindings[bindingIndex],
867880
mCachedBufferSize[bindingIndex]);
@@ -876,9 +889,15 @@ void VertexArray::onBufferChanged(const Context *context,
876889
if (context->isWebGL())
877890
{
878891
bufferBindingMask.reset(kElementArrayBufferIndex);
879-
for (size_t bindingIndex : bufferBindingMask)
892+
893+
bool hasConflict = buffer->hasWebGLXFBBindingConflict(true);
894+
if (hasConflict)
895+
{
896+
mCachedBufferPropertyTransformFeedbackConflict |= bufferBindingMask;
897+
}
898+
else
880899
{
881-
updateCachedTransformFeedbackBindingValidation(bindingIndex);
900+
mCachedBufferPropertyTransformFeedbackConflict &= ~bufferBindingMask;
882901
}
883902
}
884903
break;

src/libANGLE/VertexArray.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ class VertexArray final : public VertexArrayPrivate, public LabeledObject, publi
382382
IndexRange *indexRangeOut) const;
383383

384384
void onBufferChanged(const Context *context,
385+
const Buffer *buffer,
385386
angle::SubjectMessage message,
386387
VertexArrayBufferBindingMask bufferBindingMask);
387388

@@ -420,7 +421,7 @@ class VertexArray final : public VertexArrayPrivate, public LabeledObject, publi
420421
void setDependentDirtyBits(bool contentsChanged,
421422
VertexArrayBufferBindingMask bufferBindingMask);
422423
void updateCachedMappedArrayBuffersBinding(size_t bindingIndex);
423-
void updateCachedTransformFeedbackBindingValidation(size_t bindingIndex);
424+
bool bufferMaskBitsPointToTheSameBuffer(VertexArrayBufferBindingMask bufferBindingMask) const;
424425

425426
VertexArrayBuffers mVertexArrayBuffers;
426427
rx::VertexArrayImpl *mVertexArray;

0 commit comments

Comments
 (0)