157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill//
257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill// Use of this source code is governed by a BSD-style license that can be
457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill// found in the LICENSE file.
557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill//
657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill// Implementation of the state class for mananging GLES 3 Vertex Array Objects.
757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill//
857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill#include "libGLESv2/VertexArray.h"
1057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill#include "libGLESv2/Buffer.h"
115bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones#include "libGLESv2/renderer/VertexArrayImpl.h"
1257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
1357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madillnamespace gl
1457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
1557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
165bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon JonesVertexArray::VertexArray(rx::VertexArrayImpl *impl, GLuint id, size_t maxAttribs)
17aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    : mId(id),
185bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones      mVertexArray(impl),
195bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones      mVertexAttributes(maxAttribs)
2057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
21d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    ASSERT(impl != NULL);
22004a6f9f5ccb5ae270aed9cc95fe22ed061d16a4Jamie Madill}
23004a6f9f5ccb5ae270aed9cc95fe22ed061d16a4Jamie Madill
24004a6f9f5ccb5ae270aed9cc95fe22ed061d16a4Jamie MadillVertexArray::~VertexArray()
25004a6f9f5ccb5ae270aed9cc95fe22ed061d16a4Jamie Madill{
26d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    SafeDelete(mVertexArray);
27d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
285bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    for (size_t i = 0; i < getMaxAttribs(); i++)
2957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
305bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones        mVertexAttributes[i].buffer.set(NULL);
3157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
3257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    mElementArrayBuffer.set(NULL);
3357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
3457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
35aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon WoodsGLuint VertexArray::id() const
36aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods{
37aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    return mId;
38aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods}
39aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods
4057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madillvoid VertexArray::detachBuffer(GLuint bufferName)
4157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
425bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    for (size_t attribute = 0; attribute < getMaxAttribs(); attribute++)
4357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
445bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones        if (mVertexAttributes[attribute].buffer.id() == bufferName)
4557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        {
465bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones            mVertexAttributes[attribute].buffer.set(NULL);
4757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        }
4857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
4957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
5057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    if (mElementArrayBuffer.id() == bufferName)
5157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
5257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        mElementArrayBuffer.set(NULL);
5357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
5457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
5557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
565bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jonesconst VertexAttribute& VertexArray::getVertexAttribute(size_t attributeIndex) const
5757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
585bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    ASSERT(attributeIndex < getMaxAttribs());
5957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    return mVertexAttributes[attributeIndex];
6057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
6157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
6257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madillvoid VertexArray::setVertexAttribDivisor(GLuint index, GLuint divisor)
6357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
645bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    ASSERT(index < getMaxAttribs());
655bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[index].divisor = divisor;
665bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexArray->setAttributeDivisor(index, divisor);
6757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
6857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
6957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madillvoid VertexArray::enableAttribute(unsigned int attributeIndex, bool enabledState)
7057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
715bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    ASSERT(attributeIndex < getMaxAttribs());
725bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[attributeIndex].enabled = enabledState;
735bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexArray->enableAttribute(attributeIndex, enabledState);
7457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
7557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
7657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madillvoid VertexArray::setAttributeState(unsigned int attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type,
7757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill                                    bool normalized, bool pureInteger, GLsizei stride, const void *pointer)
7857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
795bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    ASSERT(attributeIndex < getMaxAttribs());
805bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[attributeIndex].buffer.set(boundBuffer);
815bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[attributeIndex].size = size;
825bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[attributeIndex].type = type;
835bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[attributeIndex].normalized = normalized;
845bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[attributeIndex].pureInteger = pureInteger;
855bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[attributeIndex].stride = stride;
865bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexAttributes[attributeIndex].pointer = pointer;
875bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexArray->setAttribute(attributeIndex, mVertexAttributes[attributeIndex]);
885bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones}
895bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones
905bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jonesvoid VertexArray::setElementArrayBuffer(Buffer *buffer)
915bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones{
925bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mElementArrayBuffer.set(buffer);
935bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    mVertexArray->setElementArrayBuffer(buffer);
9457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
9557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
9657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}