blob: f43922903bd02327e8cf13c3238c7a12073faae3 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or
8// index data. Implements GL buffer objects and related functionality.
9// [OpenGL ES 2.0.24] section 2.9 page 21.
10
11#include "Buffer.h"
12
13#include "main.h"
14
15namespace gl
16{
17Buffer::Buffer()
18{
19 mSize = 0;
20 mData = NULL;
21
22 mVertexBuffer = NULL;
23 mIndexBuffer = NULL;
24}
25
26Buffer::~Buffer()
27{
28 erase();
29}
30
31void Buffer::storeData(GLsizeiptr size, const void *data)
32{
33 erase();
34
35 mSize = size;
36 mData = new unsigned char[size];
37
38 if (data)
39 {
40 memcpy(mData, data, size);
41 }
42}
43
44IDirect3DVertexBuffer9 *Buffer::getVertexBuffer()
45{
46 if (!mVertexBuffer)
47 {
48 IDirect3DDevice9 *device = getDevice();
49
50 HRESULT result = device->CreateVertexBuffer(mSize, 0, 0, D3DPOOL_MANAGED, &mVertexBuffer, NULL);
51
52 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
53 {
54 return error(GL_OUT_OF_MEMORY, (IDirect3DVertexBuffer9*)NULL);
55 }
56
57 ASSERT(SUCCEEDED(result));
58
59 if (mVertexBuffer && mData)
60 {
61 void *dataStore;
62 mVertexBuffer->Lock(0, mSize, &dataStore, 0);
63 memcpy(dataStore, mData, mSize);
64 mVertexBuffer->Unlock();
65 }
66 }
67
68 return mVertexBuffer;
69}
70
71IDirect3DIndexBuffer9 *Buffer::getIndexBuffer()
72{
73 if (!mIndexBuffer)
74 {
75 IDirect3DDevice9 *device = getDevice();
76
77 HRESULT result = device->CreateIndexBuffer(mSize, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &mIndexBuffer, NULL);
78
79 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
80 {
81 return error(GL_OUT_OF_MEMORY, (IDirect3DIndexBuffer9*)NULL);
82 }
83
84 ASSERT(SUCCEEDED(result));
85
86 if (mIndexBuffer && mData)
87 {
88 void *dataStore;
89 mIndexBuffer->Lock(0, mSize, &dataStore, 0);
90 memcpy(dataStore, mData, mSize);
91 mIndexBuffer->Unlock();
92 }
93 }
94
95 return mIndexBuffer;
96}
97
98void Buffer::erase()
99{
100 mSize = 0;
101
102 if (mData)
103 {
104 delete[] mData;
105 mData = NULL;
106 }
107
108 if (mVertexBuffer)
109 {
110 mVertexBuffer->Release();
111 mVertexBuffer = NULL;
112 }
113
114 if (mIndexBuffer)
115 {
116 mIndexBuffer->Release();
117 mIndexBuffer = NULL;
118 }
119}
120}