Edit

kc3-lang/angle/src/libANGLE/VertexArray.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2015-03-25 12:27:43
    Hash : 5ead927f
    Message : Don't use a helper function to get the vertex attributes. The overhead of the function call ended up being a hot spot for draw calls since the attributes are iterated over many times in VertexDataManager. BUG=angleproject:959 Change-Id: I9bbfcbd115661ad629db9ed93d683cd8d0dc9a78 Reviewed-on: https://chromium-review.googlesource.com/263102 Tested-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/VertexArray.cpp
  • //
    // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // Implementation of the state class for mananging GLES 3 Vertex Array Objects.
    //
    
    #include "libANGLE/VertexArray.h"
    #include "libANGLE/Buffer.h"
    #include "libANGLE/renderer/VertexArrayImpl.h"
    
    namespace gl
    {
    
    VertexArray::VertexArray(rx::VertexArrayImpl *impl, GLuint id, size_t maxAttribs)
        : mId(id),
          mVertexArray(impl),
          mVertexAttributes(maxAttribs)
    {
        ASSERT(impl != NULL);
    }
    
    VertexArray::~VertexArray()
    {
        SafeDelete(mVertexArray);
    
        for (size_t i = 0; i < getMaxAttribs(); i++)
        {
            mVertexAttributes[i].buffer.set(NULL);
        }
        mElementArrayBuffer.set(NULL);
    }
    
    GLuint VertexArray::id() const
    {
        return mId;
    }
    
    void VertexArray::detachBuffer(GLuint bufferName)
    {
        for (size_t attribute = 0; attribute < getMaxAttribs(); attribute++)
        {
            if (mVertexAttributes[attribute].buffer.id() == bufferName)
            {
                mVertexAttributes[attribute].buffer.set(NULL);
            }
        }
    
        if (mElementArrayBuffer.id() == bufferName)
        {
            mElementArrayBuffer.set(NULL);
        }
    }
    
    const VertexAttribute& VertexArray::getVertexAttribute(size_t attributeIndex) const
    {
        ASSERT(attributeIndex < getMaxAttribs());
        return mVertexAttributes[attributeIndex];
    }
    
    const std::vector<VertexAttribute> &VertexArray::getVertexAttributes() const
    {
        return mVertexAttributes;
    }
    
    void VertexArray::setVertexAttribDivisor(GLuint index, GLuint divisor)
    {
        ASSERT(index < getMaxAttribs());
        mVertexAttributes[index].divisor = divisor;
        mVertexArray->setAttributeDivisor(index, divisor);
    }
    
    void VertexArray::enableAttribute(unsigned int attributeIndex, bool enabledState)
    {
        ASSERT(attributeIndex < getMaxAttribs());
        mVertexAttributes[attributeIndex].enabled = enabledState;
        mVertexArray->enableAttribute(attributeIndex, enabledState);
    }
    
    void VertexArray::setAttributeState(unsigned int attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type,
                                        bool normalized, bool pureInteger, GLsizei stride, const void *pointer)
    {
        ASSERT(attributeIndex < getMaxAttribs());
        mVertexAttributes[attributeIndex].buffer.set(boundBuffer);
        mVertexAttributes[attributeIndex].size = size;
        mVertexAttributes[attributeIndex].type = type;
        mVertexAttributes[attributeIndex].normalized = normalized;
        mVertexAttributes[attributeIndex].pureInteger = pureInteger;
        mVertexAttributes[attributeIndex].stride = stride;
        mVertexAttributes[attributeIndex].pointer = pointer;
        mVertexArray->setAttribute(attributeIndex, mVertexAttributes[attributeIndex]);
    }
    
    void VertexArray::setElementArrayBuffer(Buffer *buffer)
    {
        mElementArrayBuffer.set(buffer);
        mVertexArray->setElementArrayBuffer(buffer);
    }
    
    }