|
1 #include "precompiled.h" |
|
2 // |
|
3 // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. |
|
4 // Use of this source code is governed by a BSD-style license that can be |
|
5 // found in the LICENSE file. |
|
6 // |
|
7 |
|
8 // Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or |
|
9 // index data. Implements GL buffer objects and related functionality. |
|
10 // [OpenGL ES 2.0.24] section 2.9 page 21. |
|
11 |
|
12 #include "libGLESv2/Buffer.h" |
|
13 |
|
14 #include "libGLESv2/renderer/VertexBuffer.h" |
|
15 #include "libGLESv2/renderer/IndexBuffer.h" |
|
16 #include "libGLESv2/renderer/BufferStorage.h" |
|
17 #include "libGLESv2/renderer/Renderer.h" |
|
18 |
|
19 namespace gl |
|
20 { |
|
21 |
|
22 Buffer::Buffer(rx::Renderer *renderer, GLuint id) : RefCountObject(id) |
|
23 { |
|
24 mRenderer = renderer; |
|
25 mUsage = GL_DYNAMIC_DRAW; |
|
26 |
|
27 mBufferStorage = renderer->createBufferStorage(); |
|
28 mStaticVertexBuffer = NULL; |
|
29 mStaticIndexBuffer = NULL; |
|
30 mUnmodifiedDataUse = 0; |
|
31 } |
|
32 |
|
33 Buffer::~Buffer() |
|
34 { |
|
35 delete mBufferStorage; |
|
36 delete mStaticVertexBuffer; |
|
37 delete mStaticIndexBuffer; |
|
38 } |
|
39 |
|
40 void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) |
|
41 { |
|
42 mBufferStorage->clear(); |
|
43 mIndexRangeCache.clear(); |
|
44 mBufferStorage->setData(data, size, 0); |
|
45 |
|
46 mUsage = usage; |
|
47 |
|
48 invalidateStaticData(); |
|
49 |
|
50 if (usage == GL_STATIC_DRAW) |
|
51 { |
|
52 mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer); |
|
53 mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer); |
|
54 } |
|
55 } |
|
56 |
|
57 void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) |
|
58 { |
|
59 mBufferStorage->setData(data, size, offset); |
|
60 mIndexRangeCache.invalidateRange(offset, size); |
|
61 |
|
62 if ((mStaticVertexBuffer && mStaticVertexBuffer->getBufferSize() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0)) |
|
63 { |
|
64 invalidateStaticData(); |
|
65 } |
|
66 |
|
67 mUnmodifiedDataUse = 0; |
|
68 } |
|
69 |
|
70 rx::BufferStorage *Buffer::getStorage() const |
|
71 { |
|
72 return mBufferStorage; |
|
73 } |
|
74 |
|
75 unsigned int Buffer::size() |
|
76 { |
|
77 return mBufferStorage->getSize(); |
|
78 } |
|
79 |
|
80 GLenum Buffer::usage() const |
|
81 { |
|
82 return mUsage; |
|
83 } |
|
84 |
|
85 rx::StaticVertexBufferInterface *Buffer::getStaticVertexBuffer() |
|
86 { |
|
87 return mStaticVertexBuffer; |
|
88 } |
|
89 |
|
90 rx::StaticIndexBufferInterface *Buffer::getStaticIndexBuffer() |
|
91 { |
|
92 return mStaticIndexBuffer; |
|
93 } |
|
94 |
|
95 void Buffer::invalidateStaticData() |
|
96 { |
|
97 delete mStaticVertexBuffer; |
|
98 mStaticVertexBuffer = NULL; |
|
99 |
|
100 delete mStaticIndexBuffer; |
|
101 mStaticIndexBuffer = NULL; |
|
102 |
|
103 mUnmodifiedDataUse = 0; |
|
104 } |
|
105 |
|
106 // Creates static buffers if sufficient used data has been left unmodified |
|
107 void Buffer::promoteStaticUsage(int dataSize) |
|
108 { |
|
109 if (!mStaticVertexBuffer && !mStaticIndexBuffer) |
|
110 { |
|
111 mUnmodifiedDataUse += dataSize; |
|
112 |
|
113 if (mUnmodifiedDataUse > 3 * mBufferStorage->getSize()) |
|
114 { |
|
115 mStaticVertexBuffer = new rx::StaticVertexBufferInterface(mRenderer); |
|
116 mStaticIndexBuffer = new rx::StaticIndexBufferInterface(mRenderer); |
|
117 } |
|
118 } |
|
119 } |
|
120 |
|
121 rx::IndexRangeCache *Buffer::getIndexRangeCache() |
|
122 { |
|
123 return &mIndexRangeCache; |
|
124 } |
|
125 |
|
126 } |