blob: 8bf9f2a1a14c5a0a137ff7528da853312c1ddb76 [file] [log] [blame]
daniel@transgaming.com955377e2012-12-20 21:09:15 +00001//
2// Copyright (c) 2002-2012 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// IndexBuffer.cpp: Defines the abstract IndexBuffer class and IndexBufferInterface
8// class with derivations, classes that perform graphics API agnostic index buffer operations.
9
Brandon Jonesc7a41042014-06-23 12:03:25 -070010#include "libGLESv2/renderer/d3d/IndexBuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000011#include "libGLESv2/renderer/Renderer.h"
daniel@transgaming.com955377e2012-12-20 21:09:15 +000012
daniel@transgaming.com955377e2012-12-20 21:09:15 +000013namespace rx
14{
15
daniel@transgaming.com2befccd2012-12-20 21:09:31 +000016unsigned int IndexBuffer::mNextSerial = 1;
17
18IndexBuffer::IndexBuffer()
19{
20 updateSerial();
21}
22
23IndexBuffer::~IndexBuffer()
24{
25}
26
27unsigned int IndexBuffer::getSerial() const
28{
29 return mSerial;
30}
31
32void IndexBuffer::updateSerial()
33{
34 mSerial = mNextSerial++;
35}
36
37
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000038IndexBufferInterface::IndexBufferInterface(Renderer *renderer, bool dynamic) : mRenderer(renderer)
daniel@transgaming.com955377e2012-12-20 21:09:15 +000039{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000040 mIndexBuffer = renderer->createIndexBuffer();
daniel@transgaming.com955377e2012-12-20 21:09:15 +000041
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000042 mDynamic = dynamic;
43 mWritePosition = 0;
daniel@transgaming.com955377e2012-12-20 21:09:15 +000044}
45
daniel@transgaming.com50cc7252012-12-20 21:09:23 +000046IndexBufferInterface::~IndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +000047{
48 if (mIndexBuffer)
49 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000050 delete mIndexBuffer;
daniel@transgaming.com955377e2012-12-20 21:09:15 +000051 }
52}
53
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000054GLenum IndexBufferInterface::getIndexType() const
daniel@transgaming.com955377e2012-12-20 21:09:15 +000055{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000056 return mIndexBuffer->getIndexType();
57}
58
59unsigned int IndexBufferInterface::getBufferSize() const
60{
61 return mIndexBuffer->getBufferSize();
daniel@transgaming.com955377e2012-12-20 21:09:15 +000062}
63
daniel@transgaming.com50cc7252012-12-20 21:09:23 +000064unsigned int IndexBufferInterface::getSerial() const
daniel@transgaming.com955377e2012-12-20 21:09:15 +000065{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000066 return mIndexBuffer->getSerial();
daniel@transgaming.com955377e2012-12-20 21:09:15 +000067}
68
Geoff Langa36ead42013-08-02 11:54:08 -040069bool IndexBufferInterface::mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset)
daniel@transgaming.com955377e2012-12-20 21:09:15 +000070{
Geoff Langa36ead42013-08-02 11:54:08 -040071 // Protect against integer overflow
72 if (mWritePosition + size < mWritePosition)
daniel@transgaming.com955377e2012-12-20 21:09:15 +000073 {
Geoff Langa36ead42013-08-02 11:54:08 -040074 return false;
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000075 }
76
Geoff Langa36ead42013-08-02 11:54:08 -040077 if (!mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory))
78 {
79 if (outMappedMemory)
80 {
81 *outMappedMemory = NULL;
82 }
83 return false;
84 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000085
Geoff Langa36ead42013-08-02 11:54:08 -040086 if (streamOffset)
87 {
88 *streamOffset = mWritePosition;
89 }
90
91 mWritePosition += size;
92 return true;
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000093}
94
95bool IndexBufferInterface::unmapBuffer()
96{
97 return mIndexBuffer->unmapBuffer();
98}
99
100IndexBuffer * IndexBufferInterface::getIndexBuffer() const
101{
102 return mIndexBuffer;
103}
104
105unsigned int IndexBufferInterface::getWritePosition() const
106{
107 return mWritePosition;
108}
109
110void IndexBufferInterface::setWritePosition(unsigned int writePosition)
111{
112 mWritePosition = writePosition;
113}
114
115bool IndexBufferInterface::discard()
116{
117 return mIndexBuffer->discard();
118}
119
120bool IndexBufferInterface::setBufferSize(unsigned int bufferSize, GLenum indexType)
121{
122 if (mIndexBuffer->getBufferSize() == 0)
123 {
124 return mIndexBuffer->initialize(bufferSize, indexType, mDynamic);
125 }
126 else
127 {
128 return mIndexBuffer->setSize(bufferSize, indexType);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000129 }
130}
131
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000132StreamingIndexBufferInterface::StreamingIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, true)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000133{
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000134}
135
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000136StreamingIndexBufferInterface::~StreamingIndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000137{
138}
139
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000140bool StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000141{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000142 bool result = true;
143 unsigned int curBufferSize = getBufferSize();
Geoff Langd81cf642013-07-09 16:02:30 -0400144 unsigned int writePos = getWritePosition();
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000145 if (size > curBufferSize)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000146 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000147 result = setBufferSize(std::max(size, 2 * curBufferSize), indexType);
148 setWritePosition(0);
149 }
Geoff Langd81cf642013-07-09 16:02:30 -0400150 else if (writePos + size > curBufferSize || writePos + size < writePos)
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000151 {
152 if (!discard())
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000153 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000154 return false;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000155 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000156 setWritePosition(0);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000157 }
158
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000159 return result;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000160}
161
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000162
163StaticIndexBufferInterface::StaticIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, false)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000164{
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000165}
166
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000167StaticIndexBufferInterface::~StaticIndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000168{
169}
170
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000171bool StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000172{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000173 unsigned int curSize = getBufferSize();
174 if (curSize == 0)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000175 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000176 return setBufferSize(size, indexType);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000177 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000178 else if (curSize >= size && indexType == getIndexType())
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000179 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000180 return true;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000181 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000182 else
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000183 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000184 ERR("Static index buffers can't be resized");
185 UNREACHABLE();
186 return false;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000187 }
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000188}
189
Geoff Langf23eb282013-07-22 10:52:19 -0400190IndexRangeCache *StaticIndexBufferInterface::getIndexRangeCache()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000191{
Geoff Langf23eb282013-07-22 10:52:19 -0400192 return &mIndexRangeCache;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000193}
194
195}