blob: 621d8d2938ffd6eeb0817fda8a021d9d95e4dda3 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 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
Geoff Lang2b5420c2014-11-19 14:20:15 -050011#include "libANGLE/Buffer.h"
12#include "libANGLE/renderer/BufferImpl.h"
13#include "libANGLE/renderer/Renderer.h"
daniel@transgaming.com83921382011-01-08 05:46:00 +000014
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000015namespace gl
16{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017
Brandon Jonesd38f9262014-06-18 16:26:45 -070018Buffer::Buffer(rx::BufferImpl *impl, GLuint id)
Jamie Madill103a11f2014-02-24 15:27:21 -050019 : RefCountObject(id),
Brandon Jonesd38f9262014-06-18 16:26:45 -070020 mBuffer(impl),
Jamie Madill103a11f2014-02-24 15:27:21 -050021 mUsage(GL_DYNAMIC_DRAW),
Brandon Jonesd38f9262014-06-18 16:26:45 -070022 mSize(0),
Jamie Madill103a11f2014-02-24 15:27:21 -050023 mAccessFlags(0),
Geoff Langcc6f55d2015-03-20 13:01:02 -040024 mAccess(GL_WRITE_ONLY_OES),
Jamie Madill103a11f2014-02-24 15:27:21 -050025 mMapped(GL_FALSE),
26 mMapPointer(NULL),
27 mMapOffset(0),
Brandon Jonesd38f9262014-06-18 16:26:45 -070028 mMapLength(0)
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000029{
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{
Jamie Madillef9d63e2014-08-04 10:48:02 -040034 SafeDelete(mBuffer);
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000035}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000036
Geoff Lang2a1c15a2014-07-25 11:43:00 -040037Error Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000038{
Geoff Lang2a1c15a2014-07-25 11:43:00 -040039 gl::Error error = mBuffer->setData(data, size, usage);
40 if (error.isError())
41 {
42 return error;
43 }
44
Jamie Madillef9d63e2014-08-04 10:48:02 -040045 mIndexRangeCache.clear();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +000046 mUsage = usage;
Brandon Jonesd38f9262014-06-18 16:26:45 -070047 mSize = size;
Geoff Lang2a1c15a2014-07-25 11:43:00 -040048
49 return error;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000050}
51
Geoff Lang2a1c15a2014-07-25 11:43:00 -040052Error Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053{
Geoff Lang2a1c15a2014-07-25 11:43:00 -040054 gl::Error error = mBuffer->setSubData(data, size, offset);
55 if (error.isError())
56 {
57 return error;
58 }
59
Jamie Madillef9d63e2014-08-04 10:48:02 -040060 mIndexRangeCache.invalidateRange(offset, size);
Geoff Lang2a1c15a2014-07-25 11:43:00 -040061
62 return error;
daniel@transgaming.com83921382011-01-08 05:46:00 +000063}
64
Geoff Lang2a1c15a2014-07-25 11:43:00 -040065Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000066{
Geoff Lang2a1c15a2014-07-25 11:43:00 -040067 gl::Error error = mBuffer->copySubData(source->getImplementation(), sourceOffset, destOffset, size);
68 if (error.isError())
69 {
70 return error;
71 }
72
Jamie Madillef9d63e2014-08-04 10:48:02 -040073 mIndexRangeCache.invalidateRange(destOffset, size);
Geoff Lang2a1c15a2014-07-25 11:43:00 -040074
75 return error;
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000076}
77
Geoff Langcc6f55d2015-03-20 13:01:02 -040078Error Buffer::map(GLenum access)
79{
80 ASSERT(!mMapped);
81
82 Error error = mBuffer->map(access, &mMapPointer);
83 if (error.isError())
84 {
85 mMapPointer = NULL;
86 return error;
87 }
88
89 ASSERT(access == GL_WRITE_ONLY_OES);
90
91 mMapped = GL_TRUE;
92 mMapOffset = 0;
93 mMapLength = mSize;
94 mAccess = access;
95 mAccessFlags = GL_MAP_WRITE_BIT;
96
97 mIndexRangeCache.invalidateRange(0, mMapLength);
98
99 return error;
100}
101
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400102Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
Jamie Madill103a11f2014-02-24 15:27:21 -0500103{
104 ASSERT(!mMapped);
Brandon Jonesd38f9262014-06-18 16:26:45 -0700105 ASSERT(offset + length <= mSize);
Jamie Madill103a11f2014-02-24 15:27:21 -0500106
Geoff Langcc6f55d2015-03-20 13:01:02 -0400107 Error error = mBuffer->mapRange(offset, length, access, &mMapPointer);
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400108 if (error.isError())
109 {
110 mMapPointer = NULL;
111 return error;
112 }
Jamie Madill103a11f2014-02-24 15:27:21 -0500113
114 mMapped = GL_TRUE;
Jamie Madill103a11f2014-02-24 15:27:21 -0500115 mMapOffset = static_cast<GLint64>(offset);
116 mMapLength = static_cast<GLint64>(length);
Geoff Langcc6f55d2015-03-20 13:01:02 -0400117 mAccess = GL_WRITE_ONLY_OES;
118 mAccessFlags = access;
119
120 // The OES_mapbuffer extension states that GL_WRITE_ONLY_OES is the only valid
121 // value for GL_BUFFER_ACCESS_OES because it was written against ES2. Since there is
122 // no update for ES3 and the GL_READ_ONLY and GL_READ_WRITE enums don't exist for ES,
123 // we cannot properly set GL_BUFFER_ACCESS_OES when glMapBufferRange is called.
Jamie Madill103a11f2014-02-24 15:27:21 -0500124
Jamie Madillef9d63e2014-08-04 10:48:02 -0400125 if ((access & GL_MAP_WRITE_BIT) > 0)
126 {
127 mIndexRangeCache.invalidateRange(offset, length);
128 }
129
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400130 return error;
Jamie Madill103a11f2014-02-24 15:27:21 -0500131}
132
Geoff Langcc6f55d2015-03-20 13:01:02 -0400133Error Buffer::unmap(GLboolean *result)
Jamie Madill103a11f2014-02-24 15:27:21 -0500134{
135 ASSERT(mMapped);
136
Geoff Langcc6f55d2015-03-20 13:01:02 -0400137 Error error = mBuffer->unmap(result);
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400138 if (error.isError())
139 {
Geoff Langcc6f55d2015-03-20 13:01:02 -0400140 *result = GL_FALSE;
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400141 return error;
142 }
Jamie Madill103a11f2014-02-24 15:27:21 -0500143
144 mMapped = GL_FALSE;
145 mMapPointer = NULL;
146 mMapOffset = 0;
147 mMapLength = 0;
Geoff Langcc6f55d2015-03-20 13:01:02 -0400148 mAccess = GL_WRITE_ONLY_OES;
Jamie Madill103a11f2014-02-24 15:27:21 -0500149 mAccessFlags = 0;
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400150
151 return error;
Jamie Madill103a11f2014-02-24 15:27:21 -0500152}
153
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154}