blob: a032ce651272b84b019a1c796ad8f390fcb50463 [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//
Geoff Langeeba6e12014-02-03 13:12:30 -05003// Copyright (c) 2002-2014 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
Geoff Langeeba6e12014-02-03 13:12:30 -0500144void Buffer::markTransformFeedbackUsage()
145{
146 mBufferStorage->markTransformFeedbackUsage();
147 invalidateStaticData();
148}
149
daniel@transgaming.come4e45062012-12-20 20:56:53 +0000150rx::StaticVertexBufferInterface *Buffer::getStaticVertexBuffer()
daniel@transgaming.com83921382011-01-08 05:46:00 +0000151{
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000152 return mStaticVertexBuffer;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000153}
154
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000155rx::StaticIndexBufferInterface *Buffer::getStaticIndexBuffer()
daniel@transgaming.com83921382011-01-08 05:46:00 +0000156{
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000157 return mStaticIndexBuffer;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000158}
159
160void Buffer::invalidateStaticData()
161{
Geoff Langf8912c52014-01-30 10:12:03 -0500162 if ((mStaticVertexBuffer && mStaticVertexBuffer->getBufferSize() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0))
163 {
164 delete mStaticVertexBuffer;
165 mStaticVertexBuffer = NULL;
daniel@transgaming.com83921382011-01-08 05:46:00 +0000166
Geoff Langf8912c52014-01-30 10:12:03 -0500167 delete mStaticIndexBuffer;
168 mStaticIndexBuffer = NULL;
169 }
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000170
171 mUnmodifiedDataUse = 0;
172}
173
174// Creates static buffers if sufficient used data has been left unmodified
175void Buffer::promoteStaticUsage(int dataSize)
176{
177 if (!mStaticVertexBuffer && !mStaticIndexBuffer)
178 {
179 mUnmodifiedDataUse += dataSize;
180
shannon.woods@transgaming.com76655412013-02-28 23:08:09 +0000181 if (mUnmodifiedDataUse > 3 * mBufferStorage->getSize())
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000182 {
daniel@transgaming.come4e45062012-12-20 20:56:53 +0000183 mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer);
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000184 mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer);
daniel@transgaming.com78624ca2011-04-22 04:17:57 +0000185 }
186 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000187}
188
Geoff Langf23eb282013-07-22 10:52:19 -0400189rx::IndexRangeCache *Buffer::getIndexRangeCache()
190{
191 return &mIndexRangeCache;
192}
193
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000194}