Commit 0018c85e by Jamie Madill

Store the applied element array buffer as a binding pointer.

to be consistent with how we start vertex attributes. A null pointer indicates we're using the streaming buffer. Will also aid the dirty state bits refactor. BUG=angleproject:1040 TEST=WebGL CTS, end2end_tests, unittests Change-Id: I7a9167282b60dbe0cbb9f0e5d9e3770890ffeb71 Reviewed-on: https://chromium-review.googlesource.com/284619Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 13e7c7e6
...@@ -54,14 +54,12 @@ void VertexArray::detachBuffer(GLuint bufferName) ...@@ -54,14 +54,12 @@ void VertexArray::detachBuffer(GLuint bufferName)
if (mData.mVertexAttributes[attribute].buffer.id() == bufferName) if (mData.mVertexAttributes[attribute].buffer.id() == bufferName)
{ {
mData.mVertexAttributes[attribute].buffer.set(nullptr); mData.mVertexAttributes[attribute].buffer.set(nullptr);
mVertexArray->setAttribute(attribute, mData.mVertexAttributes[attribute]);
} }
} }
if (mData.mElementArrayBuffer.id() == bufferName) if (mData.mElementArrayBuffer.id() == bufferName)
{ {
mData.mElementArrayBuffer.set(nullptr); mData.mElementArrayBuffer.set(nullptr);
mVertexArray->setElementArrayBuffer(nullptr);
} }
} }
...@@ -75,14 +73,12 @@ void VertexArray::setVertexAttribDivisor(size_t index, GLuint divisor) ...@@ -75,14 +73,12 @@ void VertexArray::setVertexAttribDivisor(size_t index, GLuint divisor)
{ {
ASSERT(index < getMaxAttribs()); ASSERT(index < getMaxAttribs());
mData.mVertexAttributes[index].divisor = divisor; mData.mVertexAttributes[index].divisor = divisor;
mVertexArray->setAttributeDivisor(index, divisor);
} }
void VertexArray::enableAttribute(size_t attributeIndex, bool enabledState) void VertexArray::enableAttribute(size_t attributeIndex, bool enabledState)
{ {
ASSERT(attributeIndex < getMaxAttribs()); ASSERT(attributeIndex < getMaxAttribs());
mData.mVertexAttributes[attributeIndex].enabled = enabledState; mData.mVertexAttributes[attributeIndex].enabled = enabledState;
mVertexArray->enableAttribute(attributeIndex, enabledState);
// Update state cache // Update state cache
if (enabledState) if (enabledState)
...@@ -113,14 +109,11 @@ void VertexArray::setAttributeState(size_t attributeIndex, gl::Buffer *boundBuff ...@@ -113,14 +109,11 @@ void VertexArray::setAttributeState(size_t attributeIndex, gl::Buffer *boundBuff
attrib->pureInteger = pureInteger; attrib->pureInteger = pureInteger;
attrib->stride = stride; attrib->stride = stride;
attrib->pointer = pointer; attrib->pointer = pointer;
mVertexArray->setAttribute(attributeIndex, *attrib);
} }
void VertexArray::setElementArrayBuffer(Buffer *buffer) void VertexArray::setElementArrayBuffer(Buffer *buffer)
{ {
mData.mElementArrayBuffer.set(buffer); mData.mElementArrayBuffer.set(buffer);
mVertexArray->setElementArrayBuffer(buffer);
} }
} }
...@@ -22,11 +22,6 @@ class VertexArrayImpl : angle::NonCopyable ...@@ -22,11 +22,6 @@ class VertexArrayImpl : angle::NonCopyable
VertexArrayImpl(const gl::VertexArray::Data &data) : mData(data) { } VertexArrayImpl(const gl::VertexArray::Data &data) : mData(data) { }
virtual ~VertexArrayImpl() { } virtual ~VertexArrayImpl() { }
virtual void setElementArrayBuffer(const gl::Buffer *buffer) = 0;
virtual void setAttribute(size_t idx, const gl::VertexAttribute &attr) = 0;
virtual void setAttributeDivisor(size_t idx, GLuint divisor) = 0;
virtual void enableAttribute(size_t idx, bool enabledState) = 0;
protected: protected:
const gl::VertexArray::Data &mData; const gl::VertexArray::Data &mData;
}; };
......
...@@ -23,12 +23,7 @@ class VertexArray11 : public VertexArrayImpl ...@@ -23,12 +23,7 @@ class VertexArray11 : public VertexArrayImpl
: VertexArrayImpl(data) : VertexArrayImpl(data)
{ {
} }
virtual ~VertexArray11() { } virtual ~VertexArray11() {}
virtual void setElementArrayBuffer(const gl::Buffer *buffer) { }
virtual void setAttribute(size_t idx, const gl::VertexAttribute &attr) { }
virtual void setAttributeDivisor(size_t idx, GLuint divisor) { }
virtual void enableAttribute(size_t idx, bool enabledState) { }
}; };
} }
......
...@@ -25,11 +25,6 @@ class VertexArray9 : public VertexArrayImpl ...@@ -25,11 +25,6 @@ class VertexArray9 : public VertexArrayImpl
} }
virtual ~VertexArray9() { } virtual ~VertexArray9() { }
virtual void setElementArrayBuffer(const gl::Buffer *buffer) { }
virtual void setAttribute(size_t idx, const gl::VertexAttribute &attr) { }
virtual void setAttributeDivisor(size_t idx, GLuint divisor) { }
virtual void enableAttribute(size_t idx, bool enabledState) { }
}; };
} }
......
...@@ -26,7 +26,7 @@ VertexArrayGL::VertexArrayGL(const gl::VertexArray::Data &data, const FunctionsG ...@@ -26,7 +26,7 @@ VertexArrayGL::VertexArrayGL(const gl::VertexArray::Data &data, const FunctionsG
mFunctions(functions), mFunctions(functions),
mStateManager(stateManager), mStateManager(stateManager),
mVertexArrayID(0), mVertexArrayID(0),
mAppliedElementArrayBuffer(0), mAppliedElementArrayBuffer(),
mStreamingElementArrayBufferSize(0), mStreamingElementArrayBufferSize(0),
mStreamingElementArrayBuffer(0), mStreamingElementArrayBuffer(0),
mStreamingArrayBufferSize(0), mStreamingArrayBufferSize(0),
...@@ -55,34 +55,13 @@ VertexArrayGL::~VertexArrayGL() ...@@ -55,34 +55,13 @@ VertexArrayGL::~VertexArrayGL()
mStreamingArrayBufferSize = 0; mStreamingArrayBufferSize = 0;
mStreamingArrayBuffer = 0; mStreamingArrayBuffer = 0;
mAppliedElementArrayBuffer.set(nullptr);
for (size_t idx = 0; idx < mAppliedAttributes.size(); idx++) for (size_t idx = 0; idx < mAppliedAttributes.size(); idx++)
{ {
mAppliedAttributes[idx].buffer.set(nullptr); mAppliedAttributes[idx].buffer.set(nullptr);
} }
} }
void VertexArrayGL::setElementArrayBuffer(const gl::Buffer *buffer)
{
// If the buffer is being unbound/deleted, reset the currently applied buffer ID
// so that even if a new buffer is generated with the same ID, it will be re-bound.
if (buffer == nullptr && mAppliedElementArrayBuffer != mStreamingElementArrayBuffer)
{
mAppliedElementArrayBuffer = 0;
}
}
void VertexArrayGL::setAttribute(size_t idx, const gl::VertexAttribute &attr)
{
}
void VertexArrayGL::setAttributeDivisor(size_t idx, GLuint divisor)
{
}
void VertexArrayGL::enableAttribute(size_t idx, bool enabledState)
{
}
gl::Error VertexArrayGL::syncDrawArraysState(const std::vector<GLuint> &activeAttribLocations, GLint first, GLsizei count) const gl::Error VertexArrayGL::syncDrawArraysState(const std::vector<GLuint> &activeAttribLocations, GLint first, GLsizei count) const
{ {
return syncDrawState(activeAttribLocations, first, count, GL_NONE, nullptr, nullptr); return syncDrawState(activeAttribLocations, first, count, GL_NONE, nullptr, nullptr);
...@@ -96,7 +75,7 @@ gl::Error VertexArrayGL::syncDrawElementsState(const std::vector<GLuint> &active ...@@ -96,7 +75,7 @@ gl::Error VertexArrayGL::syncDrawElementsState(const std::vector<GLuint> &active
gl::Error VertexArrayGL::syncDrawState(const std::vector<GLuint> &activeAttribLocations, GLint first, GLsizei count, GLenum type, const GLvoid *indices, const GLvoid **outIndices) const gl::Error VertexArrayGL::syncDrawState(const std::vector<GLuint> &activeAttribLocations, GLint first, GLsizei count, GLenum type, const GLvoid *indices, const GLvoid **outIndices) const
{ {
mStateManager->bindVertexArray(mVertexArrayID, mAppliedElementArrayBuffer); mStateManager->bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
// Check if any attributes need to be streamed, determines if the index range needs to be computed // Check if any attributes need to be streamed, determines if the index range needs to be computed
bool attributesNeedStreaming = doAttributesNeedStreaming(activeAttribLocations); bool attributesNeedStreaming = doAttributesNeedStreaming(activeAttribLocations);
...@@ -250,12 +229,11 @@ gl::Error VertexArrayGL::syncIndexData(GLsizei count, GLenum type, const GLvoid ...@@ -250,12 +229,11 @@ gl::Error VertexArrayGL::syncIndexData(GLsizei count, GLenum type, const GLvoid
// Need to check the range of indices if attributes need to be streamed // Need to check the range of indices if attributes need to be streamed
if (elementArrayBuffer != nullptr) if (elementArrayBuffer != nullptr)
{ {
const BufferGL *bufferGL = GetImplAs<BufferGL>(elementArrayBuffer); if (elementArrayBuffer != mAppliedElementArrayBuffer.get())
GLuint elementArrayBufferID = bufferGL->getBufferID();
if (elementArrayBufferID != mAppliedElementArrayBuffer)
{ {
mStateManager->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBufferID); const BufferGL *bufferGL = GetImplAs<BufferGL>(elementArrayBuffer);
mAppliedElementArrayBuffer = elementArrayBufferID; mStateManager->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferGL->getBufferID());
mAppliedElementArrayBuffer.set(elementArrayBuffer);
} }
// Only compute the index range if the attributes also need to be streamed // Only compute the index range if the attributes also need to be streamed
...@@ -291,7 +269,7 @@ gl::Error VertexArrayGL::syncIndexData(GLsizei count, GLenum type, const GLvoid ...@@ -291,7 +269,7 @@ gl::Error VertexArrayGL::syncIndexData(GLsizei count, GLenum type, const GLvoid
} }
mStateManager->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, mStreamingElementArrayBuffer); mStateManager->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, mStreamingElementArrayBuffer);
mAppliedElementArrayBuffer = mStreamingElementArrayBuffer; mAppliedElementArrayBuffer.set(nullptr);
// Make sure the element array buffer is large enough // Make sure the element array buffer is large enough
const gl::Type &indexTypeInfo = gl::GetTypeInfo(type); const gl::Type &indexTypeInfo = gl::GetTypeInfo(type);
...@@ -414,7 +392,8 @@ GLuint VertexArrayGL::getVertexArrayID() const ...@@ -414,7 +392,8 @@ GLuint VertexArrayGL::getVertexArrayID() const
GLuint VertexArrayGL::getAppliedElementArrayBufferID() const GLuint VertexArrayGL::getAppliedElementArrayBufferID() const
{ {
return mAppliedElementArrayBuffer; return mAppliedElementArrayBuffer.get() == nullptr ? mStreamingElementArrayBuffer
: mAppliedElementArrayBuffer.id();
} }
} }
...@@ -23,11 +23,6 @@ class VertexArrayGL : public VertexArrayImpl ...@@ -23,11 +23,6 @@ class VertexArrayGL : public VertexArrayImpl
VertexArrayGL(const gl::VertexArray::Data &data, const FunctionsGL *functions, StateManagerGL *stateManager); VertexArrayGL(const gl::VertexArray::Data &data, const FunctionsGL *functions, StateManagerGL *stateManager);
~VertexArrayGL() override; ~VertexArrayGL() override;
void setElementArrayBuffer(const gl::Buffer *buffer) override;
void setAttribute(size_t idx, const gl::VertexAttribute &attr) override;
void setAttributeDivisor(size_t idx, GLuint divisor) override;
void enableAttribute(size_t idx, bool enabledState) override;
gl::Error syncDrawArraysState(const std::vector<GLuint> &activeAttribLoations, GLint first, GLsizei count) const; gl::Error syncDrawArraysState(const std::vector<GLuint> &activeAttribLoations, GLint first, GLsizei count) const;
gl::Error syncDrawElementsState(const std::vector<GLuint> &activeAttribLoations, GLsizei count, GLenum type, gl::Error syncDrawElementsState(const std::vector<GLuint> &activeAttribLoations, GLsizei count, GLenum type,
const GLvoid *indices, const GLvoid **outIndices) const; const GLvoid *indices, const GLvoid **outIndices) const;
...@@ -61,7 +56,7 @@ class VertexArrayGL : public VertexArrayImpl ...@@ -61,7 +56,7 @@ class VertexArrayGL : public VertexArrayImpl
GLuint mVertexArrayID; GLuint mVertexArrayID;
mutable GLuint mAppliedElementArrayBuffer; mutable BindingPointer<gl::Buffer> mAppliedElementArrayBuffer;
mutable std::vector<gl::VertexAttribute> mAppliedAttributes; mutable std::vector<gl::VertexAttribute> mAppliedAttributes;
mutable size_t mStreamingElementArrayBufferSize; mutable size_t mStreamingElementArrayBufferSize;
......
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