2 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
7 // IndexBuffer.cpp: Defines the abstract IndexBuffer class and IndexBufferInterface
8 // class with derivations, classes that perform graphics API agnostic index buffer operations.
10 #include "libGLESv2/renderer/d3d/IndexBuffer.h"
11 #include "libGLESv2/renderer/Renderer.h"
16 unsigned int IndexBuffer::mNextSerial = 1;
18 IndexBuffer::IndexBuffer()
23 IndexBuffer::~IndexBuffer()
27 unsigned int IndexBuffer::getSerial() const
32 void IndexBuffer::updateSerial()
34 mSerial = mNextSerial++;
38 IndexBufferInterface::IndexBufferInterface(Renderer *renderer, bool dynamic) : mRenderer(renderer)
40 mIndexBuffer = renderer->createIndexBuffer();
46 IndexBufferInterface::~IndexBufferInterface()
54 GLenum IndexBufferInterface::getIndexType() const
56 return mIndexBuffer->getIndexType();
59 unsigned int IndexBufferInterface::getBufferSize() const
61 return mIndexBuffer->getBufferSize();
64 unsigned int IndexBufferInterface::getSerial() const
66 return mIndexBuffer->getSerial();
69 gl::Error IndexBufferInterface::mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset)
71 // Protect against integer overflow
72 if (mWritePosition + size < mWritePosition)
74 return gl::Error(GL_OUT_OF_MEMORY, "Mapping of internal index buffer would cause an integer overflow.");
77 gl::Error error = mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory);
82 *outMappedMemory = NULL;
89 *streamOffset = mWritePosition;
92 mWritePosition += size;
93 return gl::Error(GL_NO_ERROR);
96 gl::Error IndexBufferInterface::unmapBuffer()
98 return mIndexBuffer->unmapBuffer();
101 IndexBuffer * IndexBufferInterface::getIndexBuffer() const
106 unsigned int IndexBufferInterface::getWritePosition() const
108 return mWritePosition;
111 void IndexBufferInterface::setWritePosition(unsigned int writePosition)
113 mWritePosition = writePosition;
116 gl::Error IndexBufferInterface::discard()
118 return mIndexBuffer->discard();
121 gl::Error IndexBufferInterface::setBufferSize(unsigned int bufferSize, GLenum indexType)
123 if (mIndexBuffer->getBufferSize() == 0)
125 return mIndexBuffer->initialize(bufferSize, indexType, mDynamic);
129 return mIndexBuffer->setSize(bufferSize, indexType);
133 StreamingIndexBufferInterface::StreamingIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, true)
137 StreamingIndexBufferInterface::~StreamingIndexBufferInterface()
141 gl::Error StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
143 unsigned int curBufferSize = getBufferSize();
144 unsigned int writePos = getWritePosition();
145 if (size > curBufferSize)
147 gl::Error error = setBufferSize(std::max(size, 2 * curBufferSize), indexType);
154 else if (writePos + size > curBufferSize || writePos + size < writePos)
156 gl::Error error = discard();
164 return gl::Error(GL_NO_ERROR);
168 StaticIndexBufferInterface::StaticIndexBufferInterface(Renderer *renderer) : IndexBufferInterface(renderer, false)
172 StaticIndexBufferInterface::~StaticIndexBufferInterface()
176 gl::Error StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
178 unsigned int curSize = getBufferSize();
181 return setBufferSize(size, indexType);
183 else if (curSize >= size && indexType == getIndexType())
185 return gl::Error(GL_NO_ERROR);
190 return gl::Error(GL_INVALID_OPERATION, "Internal static index buffers can't be resized");
194 IndexRangeCache *StaticIndexBufferInterface::getIndexRangeCache()
196 return &mIndexRangeCache;