blob: 7d31a82f0c7964c0e6055a8232ac20d5998b7971 [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{
Brandon Jonesd38f9262014-06-18 16:26:45 -070034 delete 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{
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +000039 mUsage = usage;
Brandon Jonesd38f9262014-06-18 16:26:45 -070040 mSize = size;
41 mBuffer->setData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000042}
43
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +000044void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000045{
Brandon Jonesd38f9262014-06-18 16:26:45 -070046 mBuffer->setSubData(data, size, offset);
daniel@transgaming.com83921382011-01-08 05:46:00 +000047}
48
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000049void Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
50{
Jamie Madillcfaaf722014-07-31 10:47:54 -040051 mBuffer->copySubData(source->getImplementation(), sourceOffset, destOffset, size);
shannon.woods%transgaming.com@gtempaccount.com614c07f2013-04-13 03:39:32 +000052}
53
Jamie Madill103a11f2014-02-24 15:27:21 -050054GLvoid *Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
55{
56 ASSERT(!mMapped);
Brandon Jonesd38f9262014-06-18 16:26:45 -070057 ASSERT(offset + length <= mSize);
Jamie Madill103a11f2014-02-24 15:27:21 -050058
Brandon Jonesd38f9262014-06-18 16:26:45 -070059 void *dataPointer = mBuffer->map(offset, length, access);
Jamie Madill103a11f2014-02-24 15:27:21 -050060
61 mMapped = GL_TRUE;
Brandon Jonesd38f9262014-06-18 16:26:45 -070062 mMapPointer = static_cast<GLvoid*>(static_cast<GLubyte*>(dataPointer));
Jamie Madill103a11f2014-02-24 15:27:21 -050063 mMapOffset = static_cast<GLint64>(offset);
64 mMapLength = static_cast<GLint64>(length);
65 mAccessFlags = static_cast<GLint>(access);
66
67 return mMapPointer;
68}
69
70void Buffer::unmap()
71{
72 ASSERT(mMapped);
73
Brandon Jonesd38f9262014-06-18 16:26:45 -070074 mBuffer->unmap();
Jamie Madill103a11f2014-02-24 15:27:21 -050075
76 mMapped = GL_FALSE;
77 mMapPointer = NULL;
78 mMapOffset = 0;
79 mMapLength = 0;
80 mAccessFlags = 0;
81}
82
Geoff Langeeba6e12014-02-03 13:12:30 -050083void Buffer::markTransformFeedbackUsage()
84{
Brandon Jonesd38f9262014-06-18 16:26:45 -070085 // TODO: Only used by the DX11 backend. Refactor to a more appropriate place.
86 mBuffer->markTransformFeedbackUsage();
Geoff Langf23eb282013-07-22 10:52:19 -040087}
88
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000089}