// // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or // index data. Implements GL buffer objects and related functionality. // [OpenGL ES 2.0.24] section 2.9 page 21. #include "libANGLE/Buffer.h" #include "libANGLE/renderer/BufferImpl.h" #include "libANGLE/renderer/Renderer.h" namespace gl { Buffer::Buffer(rx::BufferImpl *impl, GLuint id) : RefCountObject(id), mBuffer(impl), mUsage(GL_DYNAMIC_DRAW), mSize(0), mAccessFlags(0), mMapped(GL_FALSE), mMapPointer(NULL), mMapOffset(0), mMapLength(0) { } Buffer::~Buffer() { SafeDelete(mBuffer); } Error Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) { gl::Error error = mBuffer->setData(data, size, usage); if (error.isError()) { return error; } mIndexRangeCache.clear(); mUsage = usage; mSize = size; return error; } Error Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) { gl::Error error = mBuffer->setSubData(data, size, offset); if (error.isError()) { return error; } mIndexRangeCache.invalidateRange(offset, size); return error; } Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size) { gl::Error error = mBuffer->copySubData(source->getImplementation(), sourceOffset, destOffset, size); if (error.isError()) { return error; } mIndexRangeCache.invalidateRange(destOffset, size); return error; } Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access) { ASSERT(!mMapped); ASSERT(offset + length <= mSize); Error error = mBuffer->map(offset, length, access, &mMapPointer); if (error.isError()) { mMapPointer = NULL; return error; } mMapped = GL_TRUE; mMapOffset = static_cast(offset); mMapLength = static_cast(length); mAccessFlags = static_cast(access); if ((access & GL_MAP_WRITE_BIT) > 0) { mIndexRangeCache.invalidateRange(offset, length); } return error; } Error Buffer::unmap() { ASSERT(mMapped); Error error = mBuffer->unmap(); if (error.isError()) { return error; } mMapped = GL_FALSE; mMapPointer = NULL; mMapOffset = 0; mMapLength = 0; mAccessFlags = 0; return error; } }