Home | History | Annotate | Download | only in libGLESv2
      1 //
      2 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 // Implementation of the state class for mananging GLES 3 Vertex Array Objects.
      7 //
      8 
      9 #include "libGLESv2/VertexArray.h"
     10 #include "libGLESv2/Buffer.h"
     11 #include "libGLESv2/renderer/VertexArrayImpl.h"
     12 
     13 namespace gl
     14 {
     15 
     16 VertexArray::VertexArray(rx::VertexArrayImpl *impl, GLuint id, size_t maxAttribs)
     17     : mId(id),
     18       mVertexArray(impl),
     19       mVertexAttributes(maxAttribs)
     20 {
     21     ASSERT(impl != NULL);
     22 }
     23 
     24 VertexArray::~VertexArray()
     25 {
     26     SafeDelete(mVertexArray);
     27 
     28     for (size_t i = 0; i < getMaxAttribs(); i++)
     29     {
     30         mVertexAttributes[i].buffer.set(NULL);
     31     }
     32     mElementArrayBuffer.set(NULL);
     33 }
     34 
     35 GLuint VertexArray::id() const
     36 {
     37     return mId;
     38 }
     39 
     40 void VertexArray::detachBuffer(GLuint bufferName)
     41 {
     42     for (size_t attribute = 0; attribute < getMaxAttribs(); attribute++)
     43     {
     44         if (mVertexAttributes[attribute].buffer.id() == bufferName)
     45         {
     46             mVertexAttributes[attribute].buffer.set(NULL);
     47         }
     48     }
     49 
     50     if (mElementArrayBuffer.id() == bufferName)
     51     {
     52         mElementArrayBuffer.set(NULL);
     53     }
     54 }
     55 
     56 const VertexAttribute& VertexArray::getVertexAttribute(size_t attributeIndex) const
     57 {
     58     ASSERT(attributeIndex < getMaxAttribs());
     59     return mVertexAttributes[attributeIndex];
     60 }
     61 
     62 void VertexArray::setVertexAttribDivisor(GLuint index, GLuint divisor)
     63 {
     64     ASSERT(index < getMaxAttribs());
     65     mVertexAttributes[index].divisor = divisor;
     66     mVertexArray->setAttributeDivisor(index, divisor);
     67 }
     68 
     69 void VertexArray::enableAttribute(unsigned int attributeIndex, bool enabledState)
     70 {
     71     ASSERT(attributeIndex < getMaxAttribs());
     72     mVertexAttributes[attributeIndex].enabled = enabledState;
     73     mVertexArray->enableAttribute(attributeIndex, enabledState);
     74 }
     75 
     76 void VertexArray::setAttributeState(unsigned int attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type,
     77                                     bool normalized, bool pureInteger, GLsizei stride, const void *pointer)
     78 {
     79     ASSERT(attributeIndex < getMaxAttribs());
     80     mVertexAttributes[attributeIndex].buffer.set(boundBuffer);
     81     mVertexAttributes[attributeIndex].size = size;
     82     mVertexAttributes[attributeIndex].type = type;
     83     mVertexAttributes[attributeIndex].normalized = normalized;
     84     mVertexAttributes[attributeIndex].pureInteger = pureInteger;
     85     mVertexAttributes[attributeIndex].stride = stride;
     86     mVertexAttributes[attributeIndex].pointer = pointer;
     87     mVertexArray->setAttribute(attributeIndex, mVertexAttributes[attributeIndex]);
     88 }
     89 
     90 void VertexArray::setElementArrayBuffer(Buffer *buffer)
     91 {
     92     mElementArrayBuffer.set(buffer);
     93     mVertexArray->setElementArrayBuffer(buffer);
     94 }
     95 
     96 }