// // Copyright (c) 2002-2010 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/main.h" #include "libGLESv2/geometry/VertexDataManager.h" #include "libGLESv2/geometry/IndexDataManager.h" namespace gl { Buffer::Buffer(GLuint id) : RefCountObject(id) { mContents = NULL; mSize = 0; mUsage = GL_DYNAMIC_DRAW; mVertexBuffer = NULL; mIndexBuffer = NULL; } Buffer::~Buffer() { delete[] mContents; delete mVertexBuffer; delete mIndexBuffer; } void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) { if (size == 0) { delete[] mContents; mContents = NULL; } else if (size != mSize) { delete[] mContents; mContents = new GLubyte[size]; memset(mContents, 0, size); } if (data != NULL && size > 0) { memcpy(mContents, data, size); } mSize = size; mUsage = usage; invalidateStaticData(); if (usage == GL_STATIC_DRAW) { mVertexBuffer = new StaticVertexBuffer(getDevice()); mIndexBuffer = new StaticIndexBuffer(getDevice()); } } void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) { memcpy(mContents + offset, data, size); if ((mVertexBuffer && mVertexBuffer->size() != 0) || (mIndexBuffer && mIndexBuffer->size() != 0)) { invalidateStaticData(); if (mUsage == GL_STATIC_DRAW) { // If applications update the buffer data after it has already been used in a draw call, // it most likely isn't used as a static buffer so we should fall back to streaming usage // for best performance. So ignore the usage hint and don't create new static buffers. // mVertexBuffer = new StaticVertexBuffer(getDevice()); // mIndexBuffer = new StaticIndexBuffer(getDevice()); } } } StaticVertexBuffer *Buffer::getVertexBuffer() { return mVertexBuffer; } StaticIndexBuffer *Buffer::getIndexBuffer() { return mIndexBuffer; } void Buffer::invalidateStaticData() { delete mVertexBuffer; mVertexBuffer = NULL; delete mIndexBuffer; mIndexBuffer = NULL; } }