#include "precompiled.h" // // Copyright (c) 2002-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. // // Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or // index data. Implements GL buffer objects and related functionality. // [OpenGL ES 2.0.24] section 2.9 page 21. #include "libGLESv2/Buffer.h" #include "libGLESv2/renderer/VertexBuffer.h" #include "libGLESv2/renderer/IndexBuffer.h" #include "libGLESv2/renderer/BufferStorage.h" #include "libGLESv2/renderer/Renderer.h" namespace gl { Buffer::Buffer(rx::Renderer *renderer, GLuint id) : RefCountObject(id) { mRenderer = renderer; mUsage = GL_DYNAMIC_DRAW; mBufferStorage = renderer->createBufferStorage(); mStaticVertexBuffer = NULL; mStaticIndexBuffer = NULL; mUnmodifiedDataUse = 0; } Buffer::~Buffer() { delete mBufferStorage; delete mStaticVertexBuffer; delete mStaticIndexBuffer; } void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) { mBufferStorage->clear(); mBufferStorage->setData(data, size, 0); mUsage = usage; invalidateStaticData(); if (usage == GL_STATIC_DRAW) { mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer); mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer); } } void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) { mBufferStorage->setData(data, size, offset); if ((mStaticVertexBuffer && mStaticVertexBuffer->getBufferSize() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0)) { invalidateStaticData(); } mUnmodifiedDataUse = 0; } rx::BufferStorage *Buffer::getStorage() const { return mBufferStorage; } unsigned int Buffer::size() { return mBufferStorage->getSize(); } GLenum Buffer::usage() const { return mUsage; } rx::StaticVertexBufferInterface *Buffer::getStaticVertexBuffer() { return mStaticVertexBuffer; } rx::StaticIndexBufferInterface *Buffer::getStaticIndexBuffer() { return mStaticIndexBuffer; } void Buffer::invalidateStaticData() { delete mStaticVertexBuffer; mStaticVertexBuffer = NULL; delete mStaticIndexBuffer; mStaticIndexBuffer = NULL; mUnmodifiedDataUse = 0; } // Creates static buffers if sufficient used data has been left unmodified void Buffer::promoteStaticUsage(int dataSize) { if (!mStaticVertexBuffer && !mStaticIndexBuffer) { mUnmodifiedDataUse += dataSize; if (mUnmodifiedDataUse > 3 * mBufferStorage->getSize()) { mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer); mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer); } } } }