blob: 7fe2a3abe7ca33620b2203d86083f4109cf30e22 [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
Geoff Langa36ead42013-08-02 11:54:08 -040070bool IndexBufferInterface::mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset)
daniel@transgaming.com955377e2012-12-20 21:09:15 +000071{
Geoff Langa36ead42013-08-02 11:54:08 -040072 // Protect against integer overflow
73 if (mWritePosition + size < mWritePosition)
daniel@transgaming.com955377e2012-12-20 21:09:15 +000074 {
Geoff Langa36ead42013-08-02 11:54:08 -040075 return false;
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000076 }
77
Geoff Langa36ead42013-08-02 11:54:08 -040078 if (!mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory))
79 {
80 if (outMappedMemory)
81 {
82 *outMappedMemory = NULL;
83 }
84 return false;
85 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000086
Geoff Langa36ead42013-08-02 11:54:08 -040087 if (streamOffset)
88 {
89 *streamOffset = mWritePosition;
90 }
91
92 mWritePosition += size;
93 return true;
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +000094}
95
96bool IndexBufferInterface::unmapBuffer()
97{
98 return mIndexBuffer->unmapBuffer();
99}
100
101IndexBuffer * IndexBufferInterface::getIndexBuffer() const
102{
103 return mIndexBuffer;
104}
105
106unsigned int IndexBufferInterface::getWritePosition() const
107{
108 return mWritePosition;
109}
110
111void IndexBufferInterface::setWritePosition(unsigned int writePosition)
112{
113 mWritePosition = writePosition;
114}
115
116bool IndexBufferInterface::discard()
117{
118 return mIndexBuffer->discard();
119}
120
121bool IndexBufferInterface::setBufferSize(unsigned int bufferSize, GLenum indexType)
122{
123 if (mIndexBuffer->getBufferSize() == 0)
124 {
125 return mIndexBuffer->initialize(bufferSize, indexType, mDynamic);
126 }
127 else
128 {
129 return mIndexBuffer->setSize(bufferSize, indexType);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000130 }
131}
132
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000133StreamingIndexBufferInterface::StreamingIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, true)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000134{
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000135}
136
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000137StreamingIndexBufferInterface::~StreamingIndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000138{
139}
140
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000141bool StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000142{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000143 bool result = true;
144 unsigned int curBufferSize = getBufferSize();
Geoff Langd81cf642013-07-09 16:02:30 -0400145 unsigned int writePos = getWritePosition();
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000146 if (size > curBufferSize)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000147 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000148 result = setBufferSize(std::max(size, 2 * curBufferSize), indexType);
149 setWritePosition(0);
150 }
Geoff Langd81cf642013-07-09 16:02:30 -0400151 else if (writePos + size > curBufferSize || writePos + size < writePos)
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000152 {
153 if (!discard())
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000154 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000155 return false;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000156 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000157 setWritePosition(0);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000158 }
159
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000160 return result;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000161}
162
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000163
164StaticIndexBufferInterface::StaticIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, false)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000165{
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000166}
167
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000168StaticIndexBufferInterface::~StaticIndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000169{
170}
171
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000172bool StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000173{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000174 unsigned int curSize = getBufferSize();
175 if (curSize == 0)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000176 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000177 return setBufferSize(size, indexType);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000178 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000179 else if (curSize >= size && indexType == getIndexType())
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000180 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000181 return true;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000182 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000183 else
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000184 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000185 ERR("Static index buffers can't be resized");
186 UNREACHABLE();
187 return false;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000188 }
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000189}
190
Geoff Langf23eb282013-07-22 10:52:19 -0400191IndexRangeCache *StaticIndexBufferInterface::getIndexRangeCache()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000192{
Geoff Langf23eb282013-07-22 10:52:19 -0400193 return &mIndexRangeCache;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000194}
195
196}