1 //
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 "libGLESv2/Buffer.h"
12
13 #include "libGLESv2/main.h"
14 #include "libGLESv2/geometry/VertexDataManager.h"
15 #include "libGLESv2/geometry/IndexDataManager.h"
16
17 namespace gl
18 {
19
Buffer(GLuint id)20 Buffer::Buffer(GLuint id) : RefCountObject(id)
21 {
22 mContents = NULL;
23 mSize = 0;
24 mUsage = GL_DYNAMIC_DRAW;
25
26 mVertexBuffer = NULL;
27 mIndexBuffer = NULL;
28 }
29
~Buffer()30 Buffer::~Buffer()
31 {
32 delete[] mContents;
33 delete mVertexBuffer;
34 delete mIndexBuffer;
35 }
36
bufferData(const void * data,GLsizeiptr size,GLenum usage)37 void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
38 {
39 if (size == 0)
40 {
41 delete[] mContents;
42 mContents = NULL;
43 }
44 else if (size != mSize)
45 {
46 delete[] mContents;
47 mContents = new GLubyte[size];
48 memset(mContents, 0, size);
49 }
50
51 if (data != NULL && size > 0)
52 {
53 memcpy(mContents, data, size);
54 }
55
56 mSize = size;
57 mUsage = usage;
58
59 invalidateStaticData();
60
61 if (usage == GL_STATIC_DRAW)
62 {
63 mVertexBuffer = new StaticVertexBuffer(getDevice());
64 mIndexBuffer = new StaticIndexBuffer(getDevice());
65 }
66 }
67
bufferSubData(const void * data,GLsizeiptr size,GLintptr offset)68 void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
69 {
70 memcpy(mContents + offset, data, size);
71
72 if ((mVertexBuffer && mVertexBuffer->size() != 0) || (mIndexBuffer && mIndexBuffer->size() != 0))
73 {
74 invalidateStaticData();
75
76 if (mUsage == GL_STATIC_DRAW)
77 {
78 // If applications update the buffer data after it has already been used in a draw call,
79 // it most likely isn't used as a static buffer so we should fall back to streaming usage
80 // for best performance. So ignore the usage hint and don't create new static buffers.
81 // mVertexBuffer = new StaticVertexBuffer(getDevice());
82 // mIndexBuffer = new StaticIndexBuffer(getDevice());
83 }
84 }
85 }
86
getVertexBuffer()87 StaticVertexBuffer *Buffer::getVertexBuffer()
88 {
89 return mVertexBuffer;
90 }
91
getIndexBuffer()92 StaticIndexBuffer *Buffer::getIndexBuffer()
93 {
94 return mIndexBuffer;
95 }
96
invalidateStaticData()97 void Buffer::invalidateStaticData()
98 {
99 delete mVertexBuffer;
100 mVertexBuffer = NULL;
101
102 delete mIndexBuffer;
103 mIndexBuffer = NULL;
104 }
105
106 }
107