1// 2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3// Use of this source code is governed by a BSD-style license that can be 4// found in the LICENSE file. 5// 6 7// Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or 8// index data. Implements GL buffer objects and related functionality. 9// [OpenGL ES 2.0.24] section 2.9 page 21. 10 11#include "libGLESv2/Buffer.h" 12 13#include "libGLESv2/main.h" 14#include "libGLESv2/geometry/VertexDataManager.h" 15#include "libGLESv2/geometry/IndexDataManager.h" 16 17namespace gl 18{ 19 20Buffer::Buffer(GLuint id) : RefCountObject(id) 21{ 22 mContents = NULL; 23 mSize = 0; 24 mUsage = GL_DYNAMIC_DRAW; 25 26 mVertexBuffer = NULL; 27 mIndexBuffer = NULL; 28} 29 30Buffer::~Buffer() 31{ 32 delete[] mContents; 33 delete mVertexBuffer; 34 delete mIndexBuffer; 35} 36 37void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) 38{ 39 if (size == 0) 40 { 41 delete[] mContents; 42 mContents = NULL; 43 } 44 else if (size != mSize) 45 { 46 delete[] mContents; 47 mContents = new GLubyte[size]; 48 memset(mContents, 0, size); 49 } 50 51 if (data != NULL && size > 0) 52 { 53 memcpy(mContents, data, size); 54 } 55 56 mSize = size; 57 mUsage = usage; 58 59 invalidateStaticData(); 60 61 if (usage == GL_STATIC_DRAW) 62 { 63 mVertexBuffer = new StaticVertexBuffer(getDevice()); 64 mIndexBuffer = new StaticIndexBuffer(getDevice()); 65 } 66} 67 68void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) 69{ 70 memcpy(mContents + offset, data, size); 71 72 if ((mVertexBuffer && mVertexBuffer->size() != 0) || (mIndexBuffer && mIndexBuffer->size() != 0)) 73 { 74 invalidateStaticData(); 75 76 if (mUsage == GL_STATIC_DRAW) 77 { 78 // If applications update the buffer data after it has already been used in a draw call, 79 // it most likely isn't used as a static buffer so we should fall back to streaming usage 80 // for best performance. So ignore the usage hint and don't create new static buffers. 81 // mVertexBuffer = new StaticVertexBuffer(getDevice()); 82 // mIndexBuffer = new StaticIndexBuffer(getDevice()); 83 } 84 } 85} 86 87StaticVertexBuffer *Buffer::getVertexBuffer() 88{ 89 return mVertexBuffer; 90} 91 92StaticIndexBuffer *Buffer::getIndexBuffer() 93{ 94 return mIndexBuffer; 95} 96 97void Buffer::invalidateStaticData() 98{ 99 delete mVertexBuffer; 100 mVertexBuffer = NULL; 101 102 delete mIndexBuffer; 103 mIndexBuffer = NULL; 104} 105 106} 107