Use plain data arrays for Buffer storage
TRAC #12299
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch
Author: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/trunk@299 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Buffer.cpp b/src/libGLESv2/Buffer.cpp
index fd24f0f..87d4185 100644
--- a/src/libGLESv2/Buffer.cpp
+++ b/src/libGLESv2/Buffer.cpp
@@ -10,71 +10,47 @@
#include "libGLESv2/Buffer.h"
-#include <cstdlib>
-#include <limits>
-#include <utility>
-
-#include "common/debug.h"
-
-#include "libGLESv2/geometry/backend.h"
-
namespace gl
{
-Buffer::Buffer(BufferBackEnd *backEnd)
- : mBackEnd(backEnd)
+Buffer::Buffer()
{
+ mContents = NULL;
+ mSize = 0;
+ mUsage = GL_DYNAMIC_DRAW;
}
-GLenum Buffer::bufferData(const void* data, GLsizeiptr size, GLenum usage)
+Buffer::~Buffer()
{
- if (size < 0) return GL_INVALID_VALUE;
+ delete[] mContents;
+}
- const GLubyte* newdata = static_cast<const GLubyte*>(data);
-
+void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
+{
if (size == 0)
{
- mContents.clear();
+ delete[] mContents;
+ mContents = NULL;
}
- else if (size != mContents.size())
+ else if (size != mSize)
{
- // vector::resize only provides the basic exception guarantee, so use temporaries & swap to get the strong exception guarantee.
- std::vector<GLubyte> newContents;
-
- if (newdata != NULL)
- {
- newContents.assign(newdata, newdata + size);
- }
- else
- {
- newContents.assign(size, 0);
- }
-
- // No exceptions allowed after this point.
-
- mContents.swap(newContents);
-
+ delete[] mContents;
+ mContents = new GLubyte[size];
+ memset(mContents, 0, size);
}
- else if (newdata != NULL)
+
+ if (data != NULL && size > 0)
{
- mContents.assign(newdata, newdata + size);
+ memcpy(mContents, data, size);
}
+ mSize = size;
mUsage = usage;
-
- return GL_NO_ERROR;
}
-GLenum Buffer::bufferSubData(const void* data, GLsizeiptr size, GLintptr offset)
+void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
{
- if (size < 0 || offset < 0) return GL_INVALID_VALUE;
- if (std::numeric_limits<GLsizeiptr>::max() - offset < size) return GL_INVALID_VALUE;
- if (size + offset > static_cast<GLsizeiptr>(mContents.size())) return GL_INVALID_VALUE;
-
- const GLubyte *newdata = static_cast<const GLubyte*>(data);
- memcpy(&mContents[offset], newdata, size);
-
- return GL_NO_ERROR;
+ memcpy(mContents + offset, data, size);
}
}
diff --git a/src/libGLESv2/Buffer.h b/src/libGLESv2/Buffer.h
index ea6d0d2..5fe0d75 100644
--- a/src/libGLESv2/Buffer.h
+++ b/src/libGLESv2/Buffer.h
@@ -22,28 +22,26 @@
namespace gl
{
-class BufferBackEnd;
-class TranslatedVertexBuffer;
-
class Buffer
{
public:
- explicit Buffer(BufferBackEnd *backEnd);
+ Buffer();
- GLenum bufferData(const void *data, GLsizeiptr size, GLenum usage);
- GLenum bufferSubData(const void *data, GLsizeiptr size, GLintptr offset);
+ virtual ~Buffer();
- void *data() { return &mContents[0]; }
- GLsizeiptr size() const { return mContents.size(); }
+ 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; }
private:
DISALLOW_COPY_AND_ASSIGN(Buffer);
- std::vector<GLubyte> mContents;
+ GLubyte *mContents;
+ size_t mSize;
GLenum mUsage;
-
- BufferBackEnd *mBackEnd;
};
}
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 942e0b8..480c688 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -929,7 +929,7 @@
{
if (buffer != 0 && !getBuffer(buffer))
{
- mBufferMap[buffer] = new Buffer(mBufferBackEnd);
+ mBufferMap[buffer] = new Buffer();
}
mState.arrayBuffer = buffer;
@@ -939,7 +939,7 @@
{
if (buffer != 0 && !getBuffer(buffer))
{
- mBufferMap[buffer] = new Buffer(mBufferBackEnd);
+ mBufferMap[buffer] = new Buffer();
}
mState.elementArrayBuffer = buffer;
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index b712d7c..4b91b2c 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -506,7 +506,7 @@
try
{
- if (size < 0)
+ if (size < 0 || offset < 0)
{
return error(GL_INVALID_VALUE);
}
@@ -539,12 +539,12 @@
return error(GL_INVALID_OPERATION);
}
- GLenum err = buffer->bufferSubData(data, size, offset);
-
- if (err != GL_NO_ERROR)
+ if ((size_t)size + offset > buffer->size())
{
- return error(err);
+ return error(GL_INVALID_VALUE);
}
+
+ buffer->bufferSubData(data, size, offset);
}
}
catch(std::bad_alloc&)