1#include "precompiled.h" 2// 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" 12#include "libGLESv2/renderer/Renderer.h" 13 14namespace rx 15{ 16 17unsigned 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 39IndexBufferInterface::IndexBufferInterface(Renderer *renderer, bool dynamic) : mRenderer(renderer) 40{ 41 mIndexBuffer = renderer->createIndexBuffer(); 42 43 mDynamic = dynamic; 44 mWritePosition = 0; 45} 46 47IndexBufferInterface::~IndexBufferInterface() 48{ 49 if (mIndexBuffer) 50 { 51 delete mIndexBuffer; 52 } 53} 54 55GLenum IndexBufferInterface::getIndexType() const 56{ 57 return mIndexBuffer->getIndexType(); 58} 59 60unsigned int IndexBufferInterface::getBufferSize() const 61{ 62 return mIndexBuffer->getBufferSize(); 63} 64 65unsigned int IndexBufferInterface::getSerial() const 66{ 67 return mIndexBuffer->getSerial(); 68} 69 70int IndexBufferInterface::mapBuffer(unsigned int size, void** outMappedMemory) 71{ 72 if (!mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory)) 73 { 74 *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); 118 } 119} 120 121StreamingIndexBufferInterface::StreamingIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, true) 122{ 123} 124 125StreamingIndexBufferInterface::~StreamingIndexBufferInterface() 126{ 127} 128 129bool StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType) 130{ 131 bool result = true; 132 unsigned int curBufferSize = getBufferSize(); 133 unsigned int writePos = getWritePosition(); 134 if (size > curBufferSize) 135 { 136 result = setBufferSize(std::max(size, 2 * curBufferSize), indexType); 137 setWritePosition(0); 138 } 139 else if (writePos + size > curBufferSize || writePos + size < writePos) 140 { 141 if (!discard()) 142 { 143 return false; 144 } 145 setWritePosition(0); 146 } 147 148 return result; 149} 150 151 152StaticIndexBufferInterface::StaticIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, false) 153{ 154} 155 156StaticIndexBufferInterface::~StaticIndexBufferInterface() 157{ 158} 159 160bool StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType) 161{ 162 unsigned int curSize = getBufferSize(); 163 if (curSize == 0) 164 { 165 return setBufferSize(size, indexType); 166 } 167 else if (curSize >= size && indexType == getIndexType()) 168 { 169 return true; 170 } 171 else 172 { 173 ERR("Static index buffers can't be resized"); 174 UNREACHABLE(); 175 return false; 176 } 177} 178 179IndexRangeCache *StaticIndexBufferInterface::getIndexRangeCache() 180{ 181 return &mIndexRangeCache; 182} 183 184} 185 186