void VertexArrayGL::syncState(const gl::Context *context, const VertexArray::DirtyBits &dirtyBits) { mStateManager->bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID()); for (size_t dirtyBit : dirtyBits) { if (dirtyBit == VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER) { // TODO(jmadill): Element array buffer bindings continue; } size_t index = VertexArray::GetVertexIndexFromDirtyBit(dirtyBit); if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED && dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_ENABLED) { updateAttribEnabled(index); } else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_POINTER && dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_POINTER) { updateAttribPointer(context, index); } else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_FORMAT && dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_FORMAT) { ASSERT(supportVertexAttribBinding()); updateAttribFormat(index); } else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_BINDING && dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_BINDING) { ASSERT(supportVertexAttribBinding()); updateAttribBinding(index); } else if (dirtyBit >= VertexArray::DIRTY_BIT_BINDING_0_BUFFER && dirtyBit < VertexArray::DIRTY_BIT_BINDING_MAX_BUFFER) { ASSERT(supportVertexAttribBinding()); updateBindingBuffer(context, index); } else if (dirtyBit >= VertexArray::DIRTY_BIT_BINDING_0_DIVISOR && dirtyBit < VertexArray::DIRTY_BIT_BINDING_MAX_DIVISOR) { updateBindingDivisor(index); } else UNREACHABLE(); } }
void VertexArrayGL::syncState(const VertexArray::DirtyBits &dirtyBits) { for (unsigned long dirtyBit : angle::IterateBitSet(dirtyBits)) { if (dirtyBit == VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER) { // TODO(jmadill): Element array buffer bindings } else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED && dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_ENABLED) { size_t attribIndex = static_cast<size_t>(dirtyBit) - VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED; updateAttribEnabled(attribIndex); } else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_POINTER && dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_POINTER) { size_t attribIndex = static_cast<size_t>(dirtyBit) - VertexArray::DIRTY_BIT_ATTRIB_0_POINTER; updateAttribPointer(attribIndex); } else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_DIVISOR && dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_DIVISOR) { size_t attribIndex = static_cast<size_t>(dirtyBit) - VertexArray::DIRTY_BIT_ATTRIB_0_DIVISOR; const VertexAttribute &attrib = mData.getVertexAttribute(attribIndex); if (mAppliedAttributes[attribIndex].divisor != attrib.divisor) { mStateManager->bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID()); mFunctions->vertexAttribDivisor(static_cast<GLuint>(attribIndex), attrib.divisor); mAppliedAttributes[attribIndex].divisor = attrib.divisor; } } else UNREACHABLE(); } }