blob: 7af7c80aa61d01ad2bcb19eba54e0eddb68e4c86 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or
9// index data. Implements GL buffer objects and related functionality.
10// [OpenGL ES 2.0.24] section 2.9 page 21.
11
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000012#include "libGLESv2/Buffer.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000014#include "libGLESv2/renderer/VertexBuffer.h"
15#include "libGLESv2/renderer/IndexBuffer.h"
16#include "libGLESv2/renderer/BufferStorage.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/renderer/Renderer.h"
daniel@transgaming.com83921382011-01-08 05:46:00 +000018
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019namespace gl
20{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021
Jamie Madill103a11f2014-02-24 15:27:21 -050022Buffer::Buffer(rx::Renderer *renderer, GLuint id)
23 : RefCountObject(id),
24 mRenderer(renderer),
25 mUsage(GL_DYNAMIC_DRAW),
26 mAccessFlags(0),
27 mMapped(GL_FALSE),
28 mMapPointer(NULL),
29 mMapOffset(0),
30 mMapLength(0),
31 mBufferStorage(NULL),
32 mStaticVertexBuffer(NULL),
33 mStaticIndexBuffer(NULL),
34 mUnmodifiedDataUse(0)
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000035{
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000036 mBufferStorage = renderer->createBufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037}
38
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000039Buffer::~Buffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040{
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000041 delete mBufferStorage;
daniel@transgaming.com78624ca2011-04-22 04:17:57 +000042 delete mStaticVertexBuffer;
43 delete mStaticIndexBuffer;
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000044}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000045
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000046void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
47{
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000048 mBufferStorage->clear();
Geoff Langf23eb282013-07-22 10:52:19 -040049 mIndexRangeCache.clear();
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000050 mBufferStorage->setData(data, size, 0);
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000051
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +000052 mUsage = usage;
daniel@transgaming.com83921382011-01-08 05:46:00 +000053
54 invalidateStaticData();
55
56 if (usage == GL_STATIC_DRAW)
57 {
daniel@transgaming.come4e45062012-12-20 20:56:53 +000058 mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer);
daniel@transgaming.com50cc7252012-12-20 21:09:23 +000059 mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer);
daniel@transgaming.com83921382011-01-08 05:46:00 +000060 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000061}
62
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000063void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064{
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +000065 mBufferStorage->setData(data, size, offset);
Geoff Langf23eb282013-07-22 10:52:19 -040066 mIndexRangeCache.invalidateRange(offset, size);
Geoff Langf8912c52014-01-30 10:12:03 -050067 invalidateStaticData();
daniel@transgaming.com83921382011-01-08 05:46:00 +000068}
69
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000070void Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
71{
72 mBufferStorage->copyData(source->mBufferStorage, size, sourceOffset, destOffset);
Geoff Langf8912c52014-01-30 10:12:03 -050073 invalidateStaticData();
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000074}
75
Jamie Madill103a11f2014-02-24 15:27:21 -050076GLvoid *Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
77{
78 ASSERT(!mMapped);
79
80 void *dataPointer = mBufferStorage->map(access);
81
82 mMapped = GL_TRUE;
83 mMapPointer = static_cast<GLvoid*>(static_cast<GLubyte*>(dataPointer) + offset);
84 mMapOffset = static_cast<GLint64>(offset);
85 mMapLength = static_cast<GLint64>(length);
86 mAccessFlags = static_cast<GLint>(access);
87
88 return mMapPointer;
89}
90
91void Buffer::unmap()
92{
93 ASSERT(mMapped);
94
95 mBufferStorage->unmap();
96
97 mMapped = GL_FALSE;
98 mMapPointer = NULL;
99 mMapOffset = 0;
100 mMapLength = 0;
101 mAccessFlags = 0;
102}
103
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +0000104rx::BufferStorage *Buffer::getStorage() const
105{
106 return mBufferStorage;
107}
108
Jamie Madill96b67e32013-08-26 15:29:29 -0400109unsigned int Buffer::size() const
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +0000110{
111 return mBufferStorage->getSize();
112}
113
114GLenum Buffer::usage() const
115{
116 return mUsage;
117}
118
Jamie Madill103a11f2014-02-24 15:27:21 -0500119GLint Buffer::accessFlags() const
120{
121 return mAccessFlags;
122}
123
124GLboolean Buffer::mapped() const
125{
126 return mMapped;
127}
128
129GLvoid *Buffer::mapPointer() const
130{
131 return mMapPointer;
132}
133
134GLint64 Buffer::mapOffset() const
135{
136 return mMapOffset;
137}
138
139GLint64 Buffer::mapLength() const
140{
141 return mMapLength;
142}
143
daniel@transgaming.come4e45062012-12-20 20:56:53 +0000144rx::StaticVertexBufferInterface *Buffer::getStaticVertexBuffer()
daniel@transgaming.com83921382011-01-08 05:46:00 +0000145{
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000146 return mStaticVertexBuffer;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000147}
148
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000149rx::StaticIndexBufferInterface *Buffer::getStaticIndexBuffer()
daniel@transgaming.com83921382011-01-08 05:46:00 +0000150{
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000151 return mStaticIndexBuffer;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000152}
153
154void Buffer::invalidateStaticData()
155{
Geoff Langf8912c52014-01-30 10:12:03 -0500156 if ((mStaticVertexBuffer && mStaticVertexBuffer->getBufferSize() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0))
157 {
158 delete mStaticVertexBuffer;
159 mStaticVertexBuffer = NULL;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000160
Geoff Langf8912c52014-01-30 10:12:03 -0500161 delete mStaticIndexBuffer;
162 mStaticIndexBuffer = NULL;
163 }
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000164
165 mUnmodifiedDataUse = 0;
166}
167
168// Creates static buffers if sufficient used data has been left unmodified
169void Buffer::promoteStaticUsage(int dataSize)
170{
171 if (!mStaticVertexBuffer && !mStaticIndexBuffer)
172 {
173 mUnmodifiedDataUse += dataSize;
174
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +0000175 if (mUnmodifiedDataUse > 3 * mBufferStorage->getSize())
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000176 {
daniel@transgaming.come4e45062012-12-20 20:56:53 +0000177 mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer);
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000178 mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer);
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000179 }
180 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000181}
182
Geoff Langf23eb282013-07-22 10:52:19 -0400183rx::IndexRangeCache *Buffer::getIndexRangeCache()
184{
185 return &mIndexRangeCache;
186}
187
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000188}