blob: 16fd782315904bc63a98ee1d18009487eb5aaee1 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com955377e2012-12-20 21:09:15 +00002//
3// Copyright (c) 2002-2012 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// IndexBuffer.cpp: Defines the abstract IndexBuffer class and IndexBufferInterface
9// class with derivations, classes that perform graphics API agnostic index buffer operations.
10
11#include "libGLESv2/renderer/IndexBuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000012#include "libGLESv2/renderer/Renderer.h"
daniel@transgaming.com955377e2012-12-20 21:09:15 +000013
daniel@transgaming.com955377e2012-12-20 21:09:15 +000014namespace rx
15{
16
daniel@transgaming.com2befccd2012-12-20 21:09:31 +000017unsigned int IndexBuffer::mNextSerial = 1;
18
19IndexBuffer::IndexBuffer()
20{
21 updateSerial();
22}
23
24IndexBuffer::~IndexBuffer()
25{
26}
27
28unsigned int IndexBuffer::getSerial() const
29{
30 return mSerial;
31}
32
33void IndexBuffer::updateSerial()
34{
35 mSerial = mNextSerial++;
36}
37
38
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000039IndexBufferInterface::IndexBufferInterface(Renderer *renderer, bool dynamic) : mRenderer(renderer)
daniel@transgaming.com955377e2012-12-20 21:09:15 +000040{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000041 mIndexBuffer = renderer->createIndexBuffer();
daniel@transgaming.com955377e2012-12-20 21:09:15 +000042
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000043 mDynamic = dynamic;
44 mWritePosition = 0;
daniel@transgaming.com955377e2012-12-20 21:09:15 +000045}
46
daniel@transgaming.com50cc7252012-12-20 21:09:23 +000047IndexBufferInterface::~IndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +000048{
49 if (mIndexBuffer)
50 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000051 delete mIndexBuffer;
daniel@transgaming.com955377e2012-12-20 21:09:15 +000052 }
53}
54
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000055GLenum IndexBufferInterface::getIndexType() const
daniel@transgaming.com955377e2012-12-20 21:09:15 +000056{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000057 return mIndexBuffer->getIndexType();
58}
59
60unsigned int IndexBufferInterface::getBufferSize() const
61{
62 return mIndexBuffer->getBufferSize();
daniel@transgaming.com955377e2012-12-20 21:09:15 +000063}
64
daniel@transgaming.com50cc7252012-12-20 21:09:23 +000065unsigned int IndexBufferInterface::getSerial() const
daniel@transgaming.com955377e2012-12-20 21:09:15 +000066{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000067 return mIndexBuffer->getSerial();
daniel@transgaming.com955377e2012-12-20 21:09:15 +000068}
69
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000070int IndexBufferInterface::mapBuffer(unsigned int size, void** outMappedMemory)
daniel@transgaming.com955377e2012-12-20 21:09:15 +000071{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000072 if (!mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory))
daniel@transgaming.com955377e2012-12-20 21:09:15 +000073 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000074 *outMappedMemory = NULL;
75 return -1;
76 }
77
78 int oldWritePos = static_cast<int>(mWritePosition);
79 mWritePosition += size;
80
81 return oldWritePos;
82}
83
84bool IndexBufferInterface::unmapBuffer()
85{
86 return mIndexBuffer->unmapBuffer();
87}
88
89IndexBuffer * IndexBufferInterface::getIndexBuffer() const
90{
91 return mIndexBuffer;
92}
93
94unsigned int IndexBufferInterface::getWritePosition() const
95{
96 return mWritePosition;
97}
98
99void IndexBufferInterface::setWritePosition(unsigned int writePosition)
100{
101 mWritePosition = writePosition;
102}
103
104bool IndexBufferInterface::discard()
105{
106 return mIndexBuffer->discard();
107}
108
109bool IndexBufferInterface::setBufferSize(unsigned int bufferSize, GLenum indexType)
110{
111 if (mIndexBuffer->getBufferSize() == 0)
112 {
113 return mIndexBuffer->initialize(bufferSize, indexType, mDynamic);
114 }
115 else
116 {
117 return mIndexBuffer->setSize(bufferSize, indexType);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000118 }
119}
120
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000121StreamingIndexBufferInterface::StreamingIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, true)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000122{
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000123}
124
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000125StreamingIndexBufferInterface::~StreamingIndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000126{
127}
128
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000129bool StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000130{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000131 bool result = true;
132 unsigned int curBufferSize = getBufferSize();
133 if (size > curBufferSize)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000134 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000135 result = setBufferSize(std::max(size, 2 * curBufferSize), indexType);
136 setWritePosition(0);
137 }
138 else if (getWritePosition() + size > curBufferSize)
139 {
140 if (!discard())
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000141 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000142 return false;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000143 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000144 setWritePosition(0);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000145 }
146
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000147 return result;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000148}
149
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000150
151StaticIndexBufferInterface::StaticIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, false)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000152{
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000153}
154
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000155StaticIndexBufferInterface::~StaticIndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000156{
157}
158
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000159bool StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000160{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000161 unsigned int curSize = getBufferSize();
162 if (curSize == 0)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000163 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000164 return setBufferSize(size, indexType);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000165 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000166 else if (curSize >= size && indexType == getIndexType())
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000167 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000168 return true;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000169 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000170 else
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000171 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000172 ERR("Static index buffers can't be resized");
173 UNREACHABLE();
174 return false;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000175 }
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000176}
177
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +0000178unsigned int StaticIndexBufferInterface::lookupRange(intptr_t offset, GLsizei count, unsigned int *minIndex, unsigned int *maxIndex)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000179{
180 IndexRange range = {offset, count};
181
182 std::map<IndexRange, IndexResult>::iterator res = mCache.find(range);
183
184 if (res == mCache.end())
185 {
186 return -1;
187 }
188
189 *minIndex = res->second.minIndex;
190 *maxIndex = res->second.maxIndex;
191 return res->second.streamOffset;
192}
193
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +0000194void StaticIndexBufferInterface::addRange(intptr_t offset, GLsizei count, unsigned int minIndex, unsigned int maxIndex, unsigned int streamOffset)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000195{
196 IndexRange indexRange = {offset, count};
197 IndexResult indexResult = {minIndex, maxIndex, streamOffset};
198 mCache[indexRange] = indexResult;
199}
200
201}
202