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}