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