blob: 87cfde7a07966ae41326f08fdd6a32f4e8be181f [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +00002// Copyright (c) 2002-2013 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
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000013#include "libGLESv2/renderer/VertexBuffer.h"
14#include "libGLESv2/renderer/IndexBuffer.h"
15#include "libGLESv2/renderer/BufferStorage.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000016#include "libGLESv2/renderer/Renderer.h"
daniel@transgaming.com83921382011-01-08 05:46:00 +000017
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000018namespace gl
19{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020
daniel@transgaming.com70062c92012-11-28 19:32:30 +000021Buffer::Buffer(rx::Renderer *renderer, GLuint id) : RefCountObject(id)
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000022{
daniel@transgaming.comb9c64a82013-01-11 04:09:04 +000023 mRenderer = renderer;
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000024 mUsage = GL_DYNAMIC_DRAW;
daniel@transgaming.com83921382011-01-08 05:46:00 +000025
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000026 mBufferStorage = renderer->createBufferStorage();
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{
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000034 delete mBufferStorage;
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{
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000041 mBufferStorage->clear();
42 mBufferStorage->setData(data, size, 0);
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000043
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +000044 mUsage = usage;
daniel@transgaming.com83921382011-01-08 05:46:00 +000045
46 invalidateStaticData();
47
48 if (usage == GL_STATIC_DRAW)
49 {
daniel@transgaming.come4e45062012-12-20 20:56:53 +000050 mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer);
daniel@transgaming.com50cc7252012-12-20 21:09:23 +000051 mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer);
daniel@transgaming.com83921382011-01-08 05:46:00 +000052 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053}
54
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000055void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056{
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000057 mBufferStorage->setData(data, size, offset);
58
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000059 if ((mStaticVertexBuffer && mStaticVertexBuffer->getBufferSize() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0))
daniel@transgaming.com83921382011-01-08 05:46:00 +000060 {
61 invalidateStaticData();
daniel@transgaming.com83921382011-01-08 05:46:00 +000062 }
jbauman@chromium.orgaa9c5ca2011-09-26 21:10:13 +000063
64 mUnmodifiedDataUse = 0;
daniel@transgaming.com83921382011-01-08 05:46:00 +000065}
66
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000067rx::BufferStorage *Buffer::getStorage() const
68{
69 return mBufferStorage;
70}
71
72unsigned int Buffer::size()
73{
74 return mBufferStorage->getSize();
75}
76
77GLenum Buffer::usage() const
78{
79 return mUsage;
80}
81
daniel@transgaming.come4e45062012-12-20 20:56:53 +000082rx::StaticVertexBufferInterface *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.com50cc7252012-12-20 21:09:23 +000087rx::StaticIndexBufferInterface *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
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +0000110 if (mUnmodifiedDataUse > 3 * mBufferStorage->getSize())
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000111 {
daniel@transgaming.come4e45062012-12-20 20:56:53 +0000112 mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer);
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000113 mStaticIndexBuffer = new rx::StaticIndexBufferInterface(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}