Initial import from TransGaming
git-svn-id: https://angleproject.googlecode.com/svn/trunk@2 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/libGLESv2/Buffer.cpp b/libGLESv2/Buffer.cpp
new file mode 100644
index 0000000..f439229
--- /dev/null
+++ b/libGLESv2/Buffer.cpp
@@ -0,0 +1,120 @@
+//
+// Copyright (c) 2002-2010 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 "Buffer.h"
+
+#include "main.h"
+
+namespace gl
+{
+Buffer::Buffer()
+{
+ mSize = 0;
+ mData = NULL;
+
+ mVertexBuffer = NULL;
+ mIndexBuffer = NULL;
+}
+
+Buffer::~Buffer()
+{
+ erase();
+}
+
+void Buffer::storeData(GLsizeiptr size, const void *data)
+{
+ erase();
+
+ mSize = size;
+ mData = new unsigned char[size];
+
+ if (data)
+ {
+ memcpy(mData, data, size);
+ }
+}
+
+IDirect3DVertexBuffer9 *Buffer::getVertexBuffer()
+{
+ if (!mVertexBuffer)
+ {
+ IDirect3DDevice9 *device = getDevice();
+
+ HRESULT result = device->CreateVertexBuffer(mSize, 0, 0, D3DPOOL_MANAGED, &mVertexBuffer, NULL);
+
+ if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
+ {
+ return error(GL_OUT_OF_MEMORY, (IDirect3DVertexBuffer9*)NULL);
+ }
+
+ ASSERT(SUCCEEDED(result));
+
+ if (mVertexBuffer && mData)
+ {
+ void *dataStore;
+ mVertexBuffer->Lock(0, mSize, &dataStore, 0);
+ memcpy(dataStore, mData, mSize);
+ mVertexBuffer->Unlock();
+ }
+ }
+
+ return mVertexBuffer;
+}
+
+IDirect3DIndexBuffer9 *Buffer::getIndexBuffer()
+{
+ if (!mIndexBuffer)
+ {
+ IDirect3DDevice9 *device = getDevice();
+
+ HRESULT result = device->CreateIndexBuffer(mSize, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &mIndexBuffer, NULL);
+
+ if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
+ {
+ return error(GL_OUT_OF_MEMORY, (IDirect3DIndexBuffer9*)NULL);
+ }
+
+ ASSERT(SUCCEEDED(result));
+
+ if (mIndexBuffer && mData)
+ {
+ void *dataStore;
+ mIndexBuffer->Lock(0, mSize, &dataStore, 0);
+ memcpy(dataStore, mData, mSize);
+ mIndexBuffer->Unlock();
+ }
+ }
+
+ return mIndexBuffer;
+}
+
+void Buffer::erase()
+{
+ mSize = 0;
+
+ if (mData)
+ {
+ delete[] mData;
+ mData = NULL;
+ }
+
+ if (mVertexBuffer)
+ {
+ mVertexBuffer->Release();
+ mVertexBuffer = NULL;
+ }
+
+ if (mIndexBuffer)
+ {
+ mIndexBuffer->Release();
+ mIndexBuffer = NULL;
+ }
+}
+}