gl::Buffer now uses an rx::BufferStorage to store the data.
TRAC #22297
Signed-off-by: Jamie Madill
Signed-off-by: Nicolas Capens
Author: Geoff Lang
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1883 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Buffer.cpp b/src/libGLESv2/Buffer.cpp
index 9a92592..fce2c88 100644
--- a/src/libGLESv2/Buffer.cpp
+++ b/src/libGLESv2/Buffer.cpp
@@ -1,5 +1,5 @@
//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2013 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.
//
@@ -18,10 +18,9 @@
Buffer::Buffer(rx::Renderer *renderer, GLuint id) : RefCountObject(id)
{
mRenderer = renderer;
- mContents = NULL;
- mSize = 0;
mUsage = GL_DYNAMIC_DRAW;
+ mBufferStorage = renderer->createBufferStorage();
mStaticVertexBuffer = NULL;
mStaticIndexBuffer = NULL;
mUnmodifiedDataUse = 0;
@@ -29,31 +28,16 @@
Buffer::~Buffer()
{
- delete[] mContents;
+ delete mBufferStorage;
delete mStaticVertexBuffer;
delete mStaticIndexBuffer;
}
void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
{
- if (size == 0)
- {
- delete[] mContents;
- mContents = NULL;
- }
- else if (size != mSize)
- {
- delete[] mContents;
- mContents = new GLubyte[size];
- memset(mContents, 0, size);
- }
+ mBufferStorage->clear();
+ mBufferStorage->setData(data, size, 0);
- if (data != NULL && size > 0)
- {
- memcpy(mContents, data, size);
- }
-
- mSize = size;
mUsage = usage;
invalidateStaticData();
@@ -67,8 +51,8 @@
void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
{
- memcpy(mContents + offset, data, size);
-
+ mBufferStorage->setData(data, size, offset);
+
if ((mStaticVertexBuffer && mStaticVertexBuffer->getBufferSize() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0))
{
invalidateStaticData();
@@ -77,6 +61,21 @@
mUnmodifiedDataUse = 0;
}
+rx::BufferStorage *Buffer::getStorage() const
+{
+ return mBufferStorage;
+}
+
+unsigned int Buffer::size()
+{
+ return mBufferStorage->getSize();
+}
+
+GLenum Buffer::usage() const
+{
+ return mUsage;
+}
+
rx::StaticVertexBufferInterface *Buffer::getStaticVertexBuffer()
{
return mStaticVertexBuffer;
@@ -105,7 +104,7 @@
{
mUnmodifiedDataUse += dataSize;
- if (mUnmodifiedDataUse > 3 * mSize)
+ if (mUnmodifiedDataUse > 3 * mBufferStorage->getSize())
{
mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer);
mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer);
diff --git a/src/libGLESv2/Buffer.h b/src/libGLESv2/Buffer.h
index b3eddbf..f56d1d3 100644
--- a/src/libGLESv2/Buffer.h
+++ b/src/libGLESv2/Buffer.h
@@ -1,5 +1,5 @@
//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2013 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.
//
@@ -22,6 +22,7 @@
#include "libGLESv2/renderer/IndexBuffer.h"
#include "libGLESv2/renderer/Renderer.h"
#include "libGLESv2/renderer/VertexBuffer.h"
+#include "libGLESv2/renderer/BufferStorage.h"
namespace gl
{
@@ -36,9 +37,10 @@
void bufferData(const void *data, GLsizeiptr size, GLenum usage);
void bufferSubData(const void *data, GLsizeiptr size, GLintptr offset);
- void *data() { return mContents; }
- size_t size() const { return mSize; }
- GLenum usage() const { return mUsage; }
+ GLenum usage() const;
+
+ rx::BufferStorage *getStorage() const;
+ unsigned int size();
rx::StaticVertexBufferInterface *getStaticVertexBuffer();
rx::StaticIndexBufferInterface *getStaticIndexBuffer();
@@ -49,13 +51,13 @@
DISALLOW_COPY_AND_ASSIGN(Buffer);
rx::Renderer *mRenderer;
- GLubyte *mContents;
- GLsizeiptr mSize;
GLenum mUsage;
+ rx::BufferStorage *mBufferStorage;
+
rx::StaticVertexBufferInterface *mStaticVertexBuffer;
rx::StaticIndexBufferInterface *mStaticIndexBuffer;
- GLsizeiptr mUnmodifiedDataUse;
+ unsigned int mUnmodifiedDataUse;
};
}
diff --git a/src/libGLESv2/renderer/IndexDataManager.cpp b/src/libGLESv2/renderer/IndexDataManager.cpp
index e009205..e58a5ae 100644
--- a/src/libGLESv2/renderer/IndexDataManager.cpp
+++ b/src/libGLESv2/renderer/IndexDataManager.cpp
@@ -130,6 +130,8 @@
if (buffer != NULL)
{
+ BufferStorage *storage = buffer->getStorage();
+
switch (type)
{
case GL_UNSIGNED_BYTE: alignedOffset = (offset % sizeof(GLubyte) == 0); break;
@@ -138,18 +140,19 @@
default: UNREACHABLE(); alignedOffset = false;
}
- if (indexTypeSize(type) * count + offset > static_cast<std::size_t>(buffer->size()))
+ if (indexTypeSize(type) * count + offset > storage->getSize())
{
return GL_INVALID_OPERATION;
}
- indices = static_cast<const GLubyte*>(buffer->data()) + offset;
+ indices = static_cast<const GLubyte*>(storage->getData()) + offset;
}
StreamingIndexBufferInterface *streamingBuffer = (type == GL_UNSIGNED_INT) ? mStreamingBufferInt : mStreamingBufferShort;
StaticIndexBufferInterface *staticBuffer = buffer ? buffer->getStaticIndexBuffer() : NULL;
IndexBufferInterface *indexBuffer = streamingBuffer;
+ BufferStorage *storage = buffer ? buffer->getStorage() : NULL;
UINT streamOffset = 0;
if (staticBuffer && staticBuffer->getIndexType() == type && alignedOffset)
@@ -173,7 +176,7 @@
if (staticBuffer->getBufferSize() == 0 && alignedOffset)
{
indexBuffer = staticBuffer;
- convertCount = buffer->size() / indexTypeSize(type);
+ convertCount = storage->getSize() / indexTypeSize(type);
}
else
{
@@ -199,7 +202,7 @@
return GL_OUT_OF_MEMORY;
}
- convertIndices(type, staticBuffer ? buffer->data() : indices, convertCount, output);
+ convertIndices(type, staticBuffer ? storage->getData() : indices, convertCount, output);
if (!indexBuffer->unmapBuffer())
{
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index aab13ca..88af239 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -965,8 +965,9 @@
if (type != GL_NONE && elementArrayBuffer)
{
gl::Buffer *indexBuffer = elementArrayBuffer;
+ BufferStorage *storage = indexBuffer->getStorage();
intptr_t offset = reinterpret_cast<intptr_t>(indices);
- indices = static_cast<const GLubyte*>(indexBuffer->data()) + offset;
+ indices = static_cast<const GLubyte*>(storage->getData()) + offset;
}
if (!mLineLoopIB)
@@ -1057,8 +1058,9 @@
if (type != GL_NONE && elementArrayBuffer)
{
gl::Buffer *indexBuffer = elementArrayBuffer;
+ BufferStorage *storage = indexBuffer->getStorage();
intptr_t offset = reinterpret_cast<intptr_t>(indices);
- indices = static_cast<const GLubyte*>(indexBuffer->data()) + offset;
+ indices = static_cast<const GLubyte*>(storage->getData()) + offset;
}
if (!mTriangleFanIB)
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index 8934949..d837192 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -1436,8 +1436,9 @@
if (type != GL_NONE && elementArrayBuffer)
{
gl::Buffer *indexBuffer = elementArrayBuffer;
+ BufferStorage *storage = indexBuffer->getStorage();
intptr_t offset = reinterpret_cast<intptr_t>(indices);
- indices = static_cast<const GLubyte*>(indexBuffer->data()) + offset;
+ indices = static_cast<const GLubyte*>(storage->getData()) + offset;
}
UINT startIndex = 0;
diff --git a/src/libGLESv2/renderer/VertexBuffer11.cpp b/src/libGLESv2/renderer/VertexBuffer11.cpp
index cde9ae8..8b46ca1 100644
--- a/src/libGLESv2/renderer/VertexBuffer11.cpp
+++ b/src/libGLESv2/renderer/VertexBuffer11.cpp
@@ -94,7 +94,8 @@
const char *input = NULL;
if (buffer)
{
- input = static_cast<const char*>(buffer->data()) + static_cast<int>(attrib.mOffset);
+ BufferStorage *storage = buffer->getStorage();
+ input = static_cast<const char*>(storage->getData()) + static_cast<int>(attrib.mOffset);
}
else
{
diff --git a/src/libGLESv2/renderer/VertexBuffer9.cpp b/src/libGLESv2/renderer/VertexBuffer9.cpp
index 00caeee..cf5a375 100644
--- a/src/libGLESv2/renderer/VertexBuffer9.cpp
+++ b/src/libGLESv2/renderer/VertexBuffer9.cpp
@@ -104,7 +104,8 @@
const char *input = NULL;
if (buffer)
{
- input = static_cast<const char*>(buffer->data()) + static_cast<int>(attrib.mOffset);
+ BufferStorage *storage = buffer->getStorage();
+ input = static_cast<const char*>(storage->getData()) + static_cast<int>(attrib.mOffset);
}
else
{
diff --git a/src/libGLESv2/renderer/VertexDataManager.cpp b/src/libGLESv2/renderer/VertexDataManager.cpp
index 99d03d5..00a1633 100644
--- a/src/libGLESv2/renderer/VertexDataManager.cpp
+++ b/src/libGLESv2/renderer/VertexDataManager.cpp
@@ -87,11 +87,12 @@
gl::Buffer *buffer = attribs[i].mBoundBuffer.get();
StaticVertexBufferInterface *staticBuffer = buffer ? buffer->getStaticVertexBuffer() : NULL;
+ BufferStorage *storage = buffer ? buffer->getStorage() : NULL;
if (staticBuffer)
{
if (staticBuffer->getBufferSize() == 0)
{
- int totalCount = elementsInBuffer(attribs[i], buffer->size());
+ int totalCount = elementsInBuffer(attribs[i], storage->getSize());
staticBuffer->reserveVertexSpace(attribs[i], totalCount, 0);
}
else if (staticBuffer->lookupAttribute(attribs[i]) == -1)
@@ -126,6 +127,8 @@
StaticVertexBufferInterface *staticBuffer = buffer ? buffer->getStaticVertexBuffer() : NULL;
VertexBufferInterface *vertexBuffer = staticBuffer ? staticBuffer : static_cast<VertexBufferInterface*>(mStreamingBuffer);
+ BufferStorage *storage = buffer ? buffer->getStorage() : NULL;
+
std::size_t streamOffset = -1;
unsigned int outputElementSize = 0;
@@ -137,7 +140,7 @@
if (streamOffset == -1)
{
// Convert the entire buffer
- int totalCount = elementsInBuffer(attribs[i], buffer->size());
+ int totalCount = elementsInBuffer(attribs[i], storage->getSize());
int startIndex = attribs[i].mOffset / attribs[i].stride();
streamOffset = staticBuffer->storeVertexAttributes(attribs[i], -startIndex, totalCount, 0);