blob: 27b6fc33b03b95d9fde1110a4592c229a1bb002b [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"
Brandon Jonesd38f9262014-06-18 16:26:45 -070013#include "libGLESv2/renderer/BufferImpl.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000014#include "libGLESv2/renderer/Renderer.h"
daniel@transgaming.com83921382011-01-08 05:46:00 +000015
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016namespace gl
17{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000018
Brandon Jonesd38f9262014-06-18 16:26:45 -070019Buffer::Buffer(rx::BufferImpl *impl, GLuint id)
Jamie Madill103a11f2014-02-24 15:27:21 -050020 : RefCountObject(id),
Brandon Jonesd38f9262014-06-18 16:26:45 -070021 mBuffer(impl),
Jamie Madill103a11f2014-02-24 15:27:21 -050022 mUsage(GL_DYNAMIC_DRAW),
Brandon Jonesd38f9262014-06-18 16:26:45 -070023 mSize(0),
Jamie Madill103a11f2014-02-24 15:27:21 -050024 mAccessFlags(0),
25 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
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000037void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
38{
Jamie Madillef9d63e2014-08-04 10:48:02 -040039 mIndexRangeCache.clear();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +000040 mUsage = usage;
Brandon Jonesd38f9262014-06-18 16:26:45 -070041 mSize = size;
42 mBuffer->setData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000043}
44
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000045void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000046{
Jamie Madillef9d63e2014-08-04 10:48:02 -040047 mIndexRangeCache.invalidateRange(offset, size);
Brandon Jonesd38f9262014-06-18 16:26:45 -070048 mBuffer->setSubData(data, size, offset);
daniel@transgaming.com83921382011-01-08 05:46:00 +000049}
50
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000051void Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
52{
Jamie Madillef9d63e2014-08-04 10:48:02 -040053 mIndexRangeCache.invalidateRange(destOffset, size);
Jamie Madillcfaaf722014-07-31 10:47:54 -040054 mBuffer->copySubData(source->getImplementation(), sourceOffset, destOffset, size);
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000055}
56
Jamie Madill103a11f2014-02-24 15:27:21 -050057GLvoid *Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
58{
59 ASSERT(!mMapped);
Brandon Jonesd38f9262014-06-18 16:26:45 -070060 ASSERT(offset + length <= mSize);
Jamie Madill103a11f2014-02-24 15:27:21 -050061
Brandon Jonesd38f9262014-06-18 16:26:45 -070062 void *dataPointer = mBuffer->map(offset, length, access);
Jamie Madill103a11f2014-02-24 15:27:21 -050063
64 mMapped = GL_TRUE;
Brandon Jonesd38f9262014-06-18 16:26:45 -070065 mMapPointer = static_cast<GLvoid*>(static_cast<GLubyte*>(dataPointer));
Jamie Madill103a11f2014-02-24 15:27:21 -050066 mMapOffset = static_cast<GLint64>(offset);
67 mMapLength = static_cast<GLint64>(length);
68 mAccessFlags = static_cast<GLint>(access);
69
Jamie Madillef9d63e2014-08-04 10:48:02 -040070 if ((access & GL_MAP_WRITE_BIT) > 0)
71 {
72 mIndexRangeCache.invalidateRange(offset, length);
73 }
74
Jamie Madill103a11f2014-02-24 15:27:21 -050075 return mMapPointer;
76}
77
78void Buffer::unmap()
79{
80 ASSERT(mMapped);
81
Brandon Jonesd38f9262014-06-18 16:26:45 -070082 mBuffer->unmap();
Jamie Madill103a11f2014-02-24 15:27:21 -050083
84 mMapped = GL_FALSE;
85 mMapPointer = NULL;
86 mMapOffset = 0;
87 mMapLength = 0;
88 mAccessFlags = 0;
89}
90
Geoff Langeeba6e12014-02-03 13:12:30 -050091void Buffer::markTransformFeedbackUsage()
92{
Brandon Jonesd38f9262014-06-18 16:26:45 -070093 // TODO: Only used by the DX11 backend. Refactor to a more appropriate place.
94 mBuffer->markTransformFeedbackUsage();
Jamie Madillef9d63e2014-08-04 10:48:02 -040095 mIndexRangeCache.clear();
Geoff Langf23eb282013-07-22 10:52:19 -040096}
97
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000098}