1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libGLESv2/renderer/IndexBuffer.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,197 @@ 1.4 +#include "precompiled.h" 1.5 +// 1.6 +// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 1.7 +// Use of this source code is governed by a BSD-style license that can be 1.8 +// found in the LICENSE file. 1.9 +// 1.10 + 1.11 +// IndexBuffer.cpp: Defines the abstract IndexBuffer class and IndexBufferInterface 1.12 +// class with derivations, classes that perform graphics API agnostic index buffer operations. 1.13 + 1.14 +#include "libGLESv2/renderer/IndexBuffer.h" 1.15 +#include "libGLESv2/renderer/Renderer.h" 1.16 + 1.17 +namespace rx 1.18 +{ 1.19 + 1.20 +unsigned int IndexBuffer::mNextSerial = 1; 1.21 + 1.22 +IndexBuffer::IndexBuffer() 1.23 +{ 1.24 + updateSerial(); 1.25 +} 1.26 + 1.27 +IndexBuffer::~IndexBuffer() 1.28 +{ 1.29 +} 1.30 + 1.31 +unsigned int IndexBuffer::getSerial() const 1.32 +{ 1.33 + return mSerial; 1.34 +} 1.35 + 1.36 +void IndexBuffer::updateSerial() 1.37 +{ 1.38 + mSerial = mNextSerial++; 1.39 +} 1.40 + 1.41 + 1.42 +IndexBufferInterface::IndexBufferInterface(Renderer *renderer, bool dynamic) : mRenderer(renderer) 1.43 +{ 1.44 + mIndexBuffer = renderer->createIndexBuffer(); 1.45 + 1.46 + mDynamic = dynamic; 1.47 + mWritePosition = 0; 1.48 +} 1.49 + 1.50 +IndexBufferInterface::~IndexBufferInterface() 1.51 +{ 1.52 + if (mIndexBuffer) 1.53 + { 1.54 + delete mIndexBuffer; 1.55 + } 1.56 +} 1.57 + 1.58 +GLenum IndexBufferInterface::getIndexType() const 1.59 +{ 1.60 + return mIndexBuffer->getIndexType(); 1.61 +} 1.62 + 1.63 +unsigned int IndexBufferInterface::getBufferSize() const 1.64 +{ 1.65 + return mIndexBuffer->getBufferSize(); 1.66 +} 1.67 + 1.68 +unsigned int IndexBufferInterface::getSerial() const 1.69 +{ 1.70 + return mIndexBuffer->getSerial(); 1.71 +} 1.72 + 1.73 +bool IndexBufferInterface::mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset) 1.74 +{ 1.75 + // Protect against integer overflow 1.76 + if (mWritePosition + size < mWritePosition) 1.77 + { 1.78 + return false; 1.79 + } 1.80 + 1.81 + if (!mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory)) 1.82 + { 1.83 + if (outMappedMemory) 1.84 + { 1.85 + *outMappedMemory = NULL; 1.86 + } 1.87 + return false; 1.88 + } 1.89 + 1.90 + if (streamOffset) 1.91 + { 1.92 + *streamOffset = mWritePosition; 1.93 + } 1.94 + 1.95 + mWritePosition += size; 1.96 + return true; 1.97 +} 1.98 + 1.99 +bool IndexBufferInterface::unmapBuffer() 1.100 +{ 1.101 + return mIndexBuffer->unmapBuffer(); 1.102 +} 1.103 + 1.104 +IndexBuffer * IndexBufferInterface::getIndexBuffer() const 1.105 +{ 1.106 + return mIndexBuffer; 1.107 +} 1.108 + 1.109 +unsigned int IndexBufferInterface::getWritePosition() const 1.110 +{ 1.111 + return mWritePosition; 1.112 +} 1.113 + 1.114 +void IndexBufferInterface::setWritePosition(unsigned int writePosition) 1.115 +{ 1.116 + mWritePosition = writePosition; 1.117 +} 1.118 + 1.119 +bool IndexBufferInterface::discard() 1.120 +{ 1.121 + return mIndexBuffer->discard(); 1.122 +} 1.123 + 1.124 +bool IndexBufferInterface::setBufferSize(unsigned int bufferSize, GLenum indexType) 1.125 +{ 1.126 + if (mIndexBuffer->getBufferSize() == 0) 1.127 + { 1.128 + return mIndexBuffer->initialize(bufferSize, indexType, mDynamic); 1.129 + } 1.130 + else 1.131 + { 1.132 + return mIndexBuffer->setSize(bufferSize, indexType); 1.133 + } 1.134 +} 1.135 + 1.136 +StreamingIndexBufferInterface::StreamingIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, true) 1.137 +{ 1.138 +} 1.139 + 1.140 +StreamingIndexBufferInterface::~StreamingIndexBufferInterface() 1.141 +{ 1.142 +} 1.143 + 1.144 +bool StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType) 1.145 +{ 1.146 + bool result = true; 1.147 + unsigned int curBufferSize = getBufferSize(); 1.148 + unsigned int writePos = getWritePosition(); 1.149 + if (size > curBufferSize) 1.150 + { 1.151 + result = setBufferSize(std::max(size, 2 * curBufferSize), indexType); 1.152 + setWritePosition(0); 1.153 + } 1.154 + else if (writePos + size > curBufferSize || writePos + size < writePos) 1.155 + { 1.156 + if (!discard()) 1.157 + { 1.158 + return false; 1.159 + } 1.160 + setWritePosition(0); 1.161 + } 1.162 + 1.163 + return result; 1.164 +} 1.165 + 1.166 + 1.167 +StaticIndexBufferInterface::StaticIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, false) 1.168 +{ 1.169 +} 1.170 + 1.171 +StaticIndexBufferInterface::~StaticIndexBufferInterface() 1.172 +{ 1.173 +} 1.174 + 1.175 +bool StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType) 1.176 +{ 1.177 + unsigned int curSize = getBufferSize(); 1.178 + if (curSize == 0) 1.179 + { 1.180 + return setBufferSize(size, indexType); 1.181 + } 1.182 + else if (curSize >= size && indexType == getIndexType()) 1.183 + { 1.184 + return true; 1.185 + } 1.186 + else 1.187 + { 1.188 + ERR("Static index buffers can't be resized"); 1.189 + UNREACHABLE(); 1.190 + return false; 1.191 + } 1.192 +} 1.193 + 1.194 +IndexRangeCache *StaticIndexBufferInterface::getIndexRangeCache() 1.195 +{ 1.196 + return &mIndexRangeCache; 1.197 +} 1.198 + 1.199 +} 1.200 +