1//
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.
5//
6
7// IndexBuffer.h: Defines the abstract IndexBuffer class and IndexBufferInterface
8// class with derivations, classes that perform graphics API agnostic index buffer operations.
9
10#ifndef LIBGLESV2_RENDERER_INDEXBUFFER_H_
11#define LIBGLESV2_RENDERER_INDEXBUFFER_H_
12
13#include "common/angleutils.h"
14#include "libGLESv2/renderer/IndexRangeCache.h"
15
16namespace rx
17{
18class Renderer;
19
20class IndexBuffer
21{
22  public:
23    IndexBuffer();
24    virtual ~IndexBuffer();
25
26    virtual bool initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) = 0;
27
28    virtual bool mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory) = 0;
29    virtual bool unmapBuffer() = 0;
30
31    virtual bool discard() = 0;
32
33    virtual GLenum getIndexType() const = 0;
34    virtual unsigned int getBufferSize() const = 0;
35    virtual bool setSize(unsigned int bufferSize, GLenum indexType) = 0;
36
37    unsigned int getSerial() const;
38
39  protected:
40    void updateSerial();
41
42  private:
43    DISALLOW_COPY_AND_ASSIGN(IndexBuffer);
44
45    unsigned int mSerial;
46    static unsigned int mNextSerial;
47};
48
49class IndexBufferInterface
50{
51  public:
52    IndexBufferInterface(Renderer *renderer, bool dynamic);
53    virtual ~IndexBufferInterface();
54
55    virtual bool reserveBufferSpace(unsigned int size, GLenum indexType) = 0;
56
57    GLenum getIndexType() const;
58    unsigned int getBufferSize() const;
59
60    unsigned int getSerial() const;
61
62    bool mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset);
63    bool unmapBuffer();
64
65    IndexBuffer *getIndexBuffer() const;
66
67  protected:
68    unsigned int getWritePosition() const;
69    void setWritePosition(unsigned int writePosition);
70
71    bool discard();
72
73    bool setBufferSize(unsigned int bufferSize, GLenum indexType);
74
75  private:
76    DISALLOW_COPY_AND_ASSIGN(IndexBufferInterface);
77
78    rx::Renderer *const mRenderer;
79
80    IndexBuffer* mIndexBuffer;
81
82    unsigned int mWritePosition;
83    bool mDynamic;
84};
85
86class StreamingIndexBufferInterface : public IndexBufferInterface
87{
88  public:
89    StreamingIndexBufferInterface(Renderer *renderer);
90    ~StreamingIndexBufferInterface();
91
92    virtual bool reserveBufferSpace(unsigned int size, GLenum indexType);
93};
94
95class StaticIndexBufferInterface : public IndexBufferInterface
96{
97  public:
98    explicit StaticIndexBufferInterface(Renderer *renderer);
99    ~StaticIndexBufferInterface();
100
101    virtual bool reserveBufferSpace(unsigned int size, GLenum indexType);
102
103    IndexRangeCache *getIndexRangeCache();
104
105  private:
106    IndexRangeCache mIndexRangeCache;
107};
108
109}
110
111#endif // LIBGLESV2_RENDERER_INDEXBUFFER_H_