michael@0: #include "precompiled.h" michael@0: // michael@0: // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: // michael@0: michael@0: // Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or michael@0: // index data. Implements GL buffer objects and related functionality. michael@0: // [OpenGL ES 2.0.24] section 2.9 page 21. michael@0: michael@0: #include "libGLESv2/Buffer.h" michael@0: michael@0: #include "libGLESv2/renderer/VertexBuffer.h" michael@0: #include "libGLESv2/renderer/IndexBuffer.h" michael@0: #include "libGLESv2/renderer/BufferStorage.h" michael@0: #include "libGLESv2/renderer/Renderer.h" michael@0: michael@0: namespace gl michael@0: { michael@0: michael@0: Buffer::Buffer(rx::Renderer *renderer, GLuint id) : RefCountObject(id) michael@0: { michael@0: mRenderer = renderer; michael@0: mUsage = GL_DYNAMIC_DRAW; michael@0: michael@0: mBufferStorage = renderer->createBufferStorage(); michael@0: mStaticVertexBuffer = NULL; michael@0: mStaticIndexBuffer = NULL; michael@0: mUnmodifiedDataUse = 0; michael@0: } michael@0: michael@0: Buffer::~Buffer() michael@0: { michael@0: delete mBufferStorage; michael@0: delete mStaticVertexBuffer; michael@0: delete mStaticIndexBuffer; michael@0: } michael@0: michael@0: void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) michael@0: { michael@0: mBufferStorage->clear(); michael@0: mIndexRangeCache.clear(); michael@0: mBufferStorage->setData(data, size, 0); michael@0: michael@0: mUsage = usage; michael@0: michael@0: invalidateStaticData(); michael@0: michael@0: if (usage == GL_STATIC_DRAW) michael@0: { michael@0: mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer); michael@0: mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer); michael@0: } michael@0: } michael@0: michael@0: void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) michael@0: { michael@0: mBufferStorage->setData(data, size, offset); michael@0: mIndexRangeCache.invalidateRange(offset, size); michael@0: michael@0: if ((mStaticVertexBuffer && mStaticVertexBuffer->getBufferSize() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0)) michael@0: { michael@0: invalidateStaticData(); michael@0: } michael@0: michael@0: mUnmodifiedDataUse = 0; michael@0: } michael@0: michael@0: rx::BufferStorage *Buffer::getStorage() const michael@0: { michael@0: return mBufferStorage; michael@0: } michael@0: michael@0: unsigned int Buffer::size() michael@0: { michael@0: return mBufferStorage->getSize(); michael@0: } michael@0: michael@0: GLenum Buffer::usage() const michael@0: { michael@0: return mUsage; michael@0: } michael@0: michael@0: rx::StaticVertexBufferInterface *Buffer::getStaticVertexBuffer() michael@0: { michael@0: return mStaticVertexBuffer; michael@0: } michael@0: michael@0: rx::StaticIndexBufferInterface *Buffer::getStaticIndexBuffer() michael@0: { michael@0: return mStaticIndexBuffer; michael@0: } michael@0: michael@0: void Buffer::invalidateStaticData() michael@0: { michael@0: delete mStaticVertexBuffer; michael@0: mStaticVertexBuffer = NULL; michael@0: michael@0: delete mStaticIndexBuffer; michael@0: mStaticIndexBuffer = NULL; michael@0: michael@0: mUnmodifiedDataUse = 0; michael@0: } michael@0: michael@0: // Creates static buffers if sufficient used data has been left unmodified michael@0: void Buffer::promoteStaticUsage(int dataSize) michael@0: { michael@0: if (!mStaticVertexBuffer && !mStaticIndexBuffer) michael@0: { michael@0: mUnmodifiedDataUse += dataSize; michael@0: michael@0: if (mUnmodifiedDataUse > 3 * mBufferStorage->getSize()) michael@0: { michael@0: mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer); michael@0: mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer); michael@0: } michael@0: } michael@0: } michael@0: michael@0: rx::IndexRangeCache *Buffer::getIndexRangeCache() michael@0: { michael@0: return &mIndexRangeCache; michael@0: } michael@0: michael@0: }