blob: e24583a5083b86b097799ec4650f57f38ff3f234 [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();
Geoff Langd81cf642013-07-09 16:02:30 -0400133 unsigned int writePos = getWritePosition();
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000134 if (size > curBufferSize)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000135 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000136 result = setBufferSize(std::max(size, 2 * curBufferSize), indexType);
137 setWritePosition(0);
138 }
Geoff Langd81cf642013-07-09 16:02:30 -0400139 else if (writePos + size > curBufferSize || writePos + size < writePos)
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000140 {
141 if (!discard())
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000142 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000143 return false;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000144 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000145 setWritePosition(0);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000146 }
147
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000148 return result;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000149}
150
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000151
152StaticIndexBufferInterface::StaticIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, false)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000153{
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000154}
155
daniel@transgaming.com50cc7252012-12-20 21:09:23 +0000156StaticIndexBufferInterface::~StaticIndexBufferInterface()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000157{
158}
159
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000160bool StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000161{
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000162 unsigned int curSize = getBufferSize();
163 if (curSize == 0)
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000164 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000165 return setBufferSize(size, indexType);
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000166 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000167 else if (curSize >= size && indexType == getIndexType())
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000168 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000169 return true;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000170 }
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000171 else
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000172 {
daniel@transgaming.com1e3a8042012-12-20 21:09:55 +0000173 ERR("Static index buffers can't be resized");
174 UNREACHABLE();
175 return false;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000176 }
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000177}
178
Geoff Langf23eb282013-07-22 10:52:19 -0400179IndexRangeCache *StaticIndexBufferInterface::getIndexRangeCache()
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000180{
Geoff Langf23eb282013-07-22 10:52:19 -0400181 return &mIndexRangeCache;
daniel@transgaming.com955377e2012-12-20 21:09:15 +0000182}
183
184}