blob: f394a6b1d1eaaa2f7804baf7c9a1c1c739048bc0 [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),
24 mMapped(GL_FALSE),
25 mMapPointer(NULL),
26 mMapOffset(0),
Brandon Jonesd38f9262014-06-18 16:26:45 -070027 mMapLength(0)
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +000028{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000029}
30
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000031Buffer::~Buffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032{
Jamie Madillef9d63e2014-08-04 10:48:02 -040033 SafeDelete(mBuffer);
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000034}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000035
Geoff Lang2a1c15a2014-07-25 11:43:00 -040036Error Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000037{
Geoff Lang2a1c15a2014-07-25 11:43:00 -040038 gl::Error error = mBuffer->setData(data, size, usage);
39 if (error.isError())
40 {
41 return error;
42 }
43
Jamie Madillef9d63e2014-08-04 10:48:02 -040044 mIndexRangeCache.clear();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +000045 mUsage = usage;
Brandon Jonesd38f9262014-06-18 16:26:45 -070046 mSize = size;
Geoff Lang2a1c15a2014-07-25 11:43:00 -040047
48 return error;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000049}
50
Geoff Lang2a1c15a2014-07-25 11:43:00 -040051Error Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052{
Geoff Lang2a1c15a2014-07-25 11:43:00 -040053 gl::Error error = mBuffer->setSubData(data, size, offset);
54 if (error.isError())
55 {
56 return error;
57 }
58
Jamie Madillef9d63e2014-08-04 10:48:02 -040059 mIndexRangeCache.invalidateRange(offset, size);
Geoff Lang2a1c15a2014-07-25 11:43:00 -040060
61 return error;
daniel@transgaming.com83921382011-01-08 05:46:00 +000062}
63
Geoff Lang2a1c15a2014-07-25 11:43:00 -040064Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000065{
Geoff Lang2a1c15a2014-07-25 11:43:00 -040066 gl::Error error = mBuffer->copySubData(source->getImplementation(), sourceOffset, destOffset, size);
67 if (error.isError())
68 {
69 return error;
70 }
71
Jamie Madillef9d63e2014-08-04 10:48:02 -040072 mIndexRangeCache.invalidateRange(destOffset, size);
Geoff Lang2a1c15a2014-07-25 11:43:00 -040073
74 return error;
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000075}
76
Geoff Lang2a1c15a2014-07-25 11:43:00 -040077Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
Jamie Madill103a11f2014-02-24 15:27:21 -050078{
79 ASSERT(!mMapped);
Brandon Jonesd38f9262014-06-18 16:26:45 -070080 ASSERT(offset + length <= mSize);
Jamie Madill103a11f2014-02-24 15:27:21 -050081
Geoff Lang2a1c15a2014-07-25 11:43:00 -040082 Error error = mBuffer->map(offset, length, access, &mMapPointer);
83 if (error.isError())
84 {
85 mMapPointer = NULL;
86 return error;
87 }
Jamie Madill103a11f2014-02-24 15:27:21 -050088
89 mMapped = GL_TRUE;
Jamie Madill103a11f2014-02-24 15:27:21 -050090 mMapOffset = static_cast<GLint64>(offset);
91 mMapLength = static_cast<GLint64>(length);
92 mAccessFlags = static_cast<GLint>(access);
93
Jamie Madillef9d63e2014-08-04 10:48:02 -040094 if ((access & GL_MAP_WRITE_BIT) > 0)
95 {
96 mIndexRangeCache.invalidateRange(offset, length);
97 }
98
Geoff Lang2a1c15a2014-07-25 11:43:00 -040099 return error;
Jamie Madill103a11f2014-02-24 15:27:21 -0500100}
101
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400102Error Buffer::unmap()
Jamie Madill103a11f2014-02-24 15:27:21 -0500103{
104 ASSERT(mMapped);
105
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400106 Error error = mBuffer->unmap();
107 if (error.isError())
108 {
109 return error;
110 }
Jamie Madill103a11f2014-02-24 15:27:21 -0500111
112 mMapped = GL_FALSE;
113 mMapPointer = NULL;
114 mMapOffset = 0;
115 mMapLength = 0;
116 mAccessFlags = 0;
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400117
118 return error;
Jamie Madill103a11f2014-02-24 15:27:21 -0500119}
120
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000121}