blob: 26d138886f954237c3c3b7694daefbb83e9c3837 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.combdfb3912012-10-31 19:55:21 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// 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
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011#include "libGLESv2/Buffer.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
daniel@transgaming.com83921382011-01-08 05:46:00 +000013#include "libGLESv2/main.h"
daniel@transgaming.com8fd34bd2011-02-18 02:52:14 +000014#include "libGLESv2/VertexDataManager.h"
15#include "libGLESv2/IndexDataManager.h"
daniel@transgaming.com83921382011-01-08 05:46:00 +000016
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017namespace gl
18{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000020Buffer::Buffer(GLuint id) : RefCountObject(id)
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000021{
daniel@transgaming.combdfb3912012-10-31 19:55:21 +000022 mRenderer = getDisplay()->getRenderer9();
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000023 mContents = NULL;
24 mSize = 0;
25 mUsage = GL_DYNAMIC_DRAW;
daniel@transgaming.com83921382011-01-08 05:46:00 +000026
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000027 mStaticVertexBuffer = NULL;
28 mStaticIndexBuffer = NULL;
29 mUnmodifiedDataUse = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000030}
31
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000032Buffer::~Buffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033{
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000034 delete[] mContents;
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000035 delete mStaticVertexBuffer;
36 delete mStaticIndexBuffer;
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000037}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000038
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000039void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
40{
daniel@transgaming.comc103b602010-04-23 18:34:58 +000041 if (size == 0)
42 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000043 delete[] mContents;
44 mContents = NULL;
daniel@transgaming.comc103b602010-04-23 18:34:58 +000045 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000046 else if (size != mSize)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000047 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000048 delete[] mContents;
49 mContents = new GLubyte[size];
50 memset(mContents, 0, size);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000051 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000052
53 if (data != NULL && size > 0)
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000054 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000055 memcpy(mContents, data, size);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000056 }
57
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000058 mSize = size;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +000059 mUsage = usage;
daniel@transgaming.com83921382011-01-08 05:46:00 +000060
61 invalidateStaticData();
62
63 if (usage == GL_STATIC_DRAW)
64 {
daniel@transgaming.comb7386992012-10-31 18:29:58 +000065 mStaticVertexBuffer = new StaticVertexBuffer(mRenderer);
daniel@transgaming.com6716a272012-10-31 18:31:39 +000066 mStaticIndexBuffer = new StaticIndexBuffer(mRenderer);
daniel@transgaming.com83921382011-01-08 05:46:00 +000067 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068}
69
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000070void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000071{
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000072 memcpy(mContents + offset, data, size);
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000073
74 if ((mStaticVertexBuffer && mStaticVertexBuffer->size() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->size() != 0))
daniel@transgaming.com83921382011-01-08 05:46:00 +000075 {
76 invalidateStaticData();
daniel@transgaming.com83921382011-01-08 05:46:00 +000077 }
jbauman@chromium.orgaa9c5ca2011-09-26 21:10:13 +000078
79 mUnmodifiedDataUse = 0;
daniel@transgaming.com83921382011-01-08 05:46:00 +000080}
81
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000082StaticVertexBuffer *Buffer::getStaticVertexBuffer()
daniel@transgaming.com83921382011-01-08 05:46:00 +000083{
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000084 return mStaticVertexBuffer;
daniel@transgaming.com83921382011-01-08 05:46:00 +000085}
86
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000087StaticIndexBuffer *Buffer::getStaticIndexBuffer()
daniel@transgaming.com83921382011-01-08 05:46:00 +000088{
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000089 return mStaticIndexBuffer;
daniel@transgaming.com83921382011-01-08 05:46:00 +000090}
91
92void Buffer::invalidateStaticData()
93{
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000094 delete mStaticVertexBuffer;
95 mStaticVertexBuffer = NULL;
daniel@transgaming.com83921382011-01-08 05:46:00 +000096
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000097 delete mStaticIndexBuffer;
98 mStaticIndexBuffer = NULL;
99
100 mUnmodifiedDataUse = 0;
101}
102
103// Creates static buffers if sufficient used data has been left unmodified
104void Buffer::promoteStaticUsage(int dataSize)
105{
106 if (!mStaticVertexBuffer && !mStaticIndexBuffer)
107 {
108 mUnmodifiedDataUse += dataSize;
109
110 if (mUnmodifiedDataUse > 3 * mSize)
111 {
daniel@transgaming.comb7386992012-10-31 18:29:58 +0000112 mStaticVertexBuffer = new StaticVertexBuffer(mRenderer);
daniel@transgaming.com6716a272012-10-31 18:31:39 +0000113 mStaticIndexBuffer = new StaticIndexBuffer(mRenderer);
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000114 }
115 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116}
117
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000118}