blob: ba021c5211fd5cb07f41ed5d6b5ef6ad87cbac19 [file] [log] [blame]
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +00001//
daniel@transgaming.comf6549452012-01-27 15:39:08 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
daniel@transgaming.com8fd34bd2011-02-18 02:52:14 +00007// IndexDataManager.h: Defines the IndexDataManager, a class that
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +00008// runs the Buffer translation process for index buffers.
9
daniel@transgaming.com8fd34bd2011-02-18 02:52:14 +000010#ifndef LIBGLESV2_INDEXDATAMANAGER_H_
11#define LIBGLESV2_INDEXDATAMANAGER_H_
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +000012
daniel@transgaming.com83921382011-01-08 05:46:00 +000013#include <vector>
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +000014#include <cstddef>
15
16#define GL_APICALL
17#include <GLES2/gl2.h>
18
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Context.h"
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +000020
daniel@transgaming.com6c4b5e02012-01-27 15:39:12 +000021namespace
22{
23 enum { INITIAL_INDEX_BUFFER_SIZE = 4096 * sizeof(GLuint) };
24}
25
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +000026namespace gl
27{
28
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +000029struct TranslatedIndexData
30{
daniel@transgaming.com83921382011-01-08 05:46:00 +000031 UINT minIndex;
32 UINT maxIndex;
33 UINT startIndex;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +000034
daniel@transgaming.com83921382011-01-08 05:46:00 +000035 IDirect3DIndexBuffer9 *indexBuffer;
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +000036 unsigned int serial;
daniel@transgaming.com83921382011-01-08 05:46:00 +000037};
38
39class IndexBuffer
40{
41 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +000042 IndexBuffer(rx::Renderer9 *renderer, UINT size, D3DFORMAT format);
daniel@transgaming.com83921382011-01-08 05:46:00 +000043 virtual ~IndexBuffer();
44
45 UINT size() const { return mBufferSize; }
46 virtual void *map(UINT requiredSpace, UINT *offset) = 0;
47 void unmap();
48 virtual void reserveSpace(UINT requiredSpace, GLenum type) = 0;
49
50 IDirect3DIndexBuffer9 *getBuffer() const;
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +000051 unsigned int getSerial() const;
daniel@transgaming.com83921382011-01-08 05:46:00 +000052
53 protected:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +000054 rx::Renderer9 *const mRenderer; // D3D9_REPLACE
daniel@transgaming.com83921382011-01-08 05:46:00 +000055
56 IDirect3DIndexBuffer9 *mIndexBuffer;
57 UINT mBufferSize;
58
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +000059 unsigned int mSerial;
60 static unsigned int issueSerial();
61 static unsigned int mCurrentSerial;
62
daniel@transgaming.com83921382011-01-08 05:46:00 +000063 private:
64 DISALLOW_COPY_AND_ASSIGN(IndexBuffer);
65};
66
67class StreamingIndexBuffer : public IndexBuffer
68{
69 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +000070 StreamingIndexBuffer(rx::Renderer9 *renderer, UINT initialSize, D3DFORMAT format);
daniel@transgaming.com83921382011-01-08 05:46:00 +000071 ~StreamingIndexBuffer();
72
daniel@transgaming.comd976b582011-03-29 00:56:20 +000073 virtual void *map(UINT requiredSpace, UINT *offset);
74 virtual void reserveSpace(UINT requiredSpace, GLenum type);
daniel@transgaming.com83921382011-01-08 05:46:00 +000075
76 private:
77 UINT mWritePosition;
78};
79
80class StaticIndexBuffer : public IndexBuffer
81{
82 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +000083 explicit StaticIndexBuffer(rx::Renderer9 *renderer);
daniel@transgaming.com83921382011-01-08 05:46:00 +000084 ~StaticIndexBuffer();
85
daniel@transgaming.comd976b582011-03-29 00:56:20 +000086 virtual void *map(UINT requiredSpace, UINT *offset);
87 virtual void reserveSpace(UINT requiredSpace, GLenum type);
daniel@transgaming.com83921382011-01-08 05:46:00 +000088
89 bool lookupType(GLenum type);
90 UINT lookupRange(intptr_t offset, GLsizei count, UINT *minIndex, UINT *maxIndex); // Returns the offset into the index buffer, or -1 if not found
91 void addRange(intptr_t offset, GLsizei count, UINT minIndex, UINT maxIndex, UINT streamOffset);
92
93 private:
94 GLenum mCacheType;
95
96 struct IndexRange
97 {
98 intptr_t offset;
99 GLsizei count;
100
jbauman@chromium.org43cbe742011-09-01 22:09:40 +0000101 bool operator<(const IndexRange& rhs) const
102 {
103 if (offset != rhs.offset)
104 {
105 return offset < rhs.offset;
106 }
107 if (count != rhs.count)
108 {
109 return count < rhs.count;
110 }
111 return false;
112 }
113 };
114
115 struct IndexResult
116 {
daniel@transgaming.com83921382011-01-08 05:46:00 +0000117 UINT minIndex;
118 UINT maxIndex;
119 UINT streamOffset;
120 };
121
jbauman@chromium.org43cbe742011-09-01 22:09:40 +0000122 std::map<IndexRange, IndexResult> mCache;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000123};
124
125class IndexDataManager
126{
127 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000128 IndexDataManager(rx::Renderer9 *renderer);
daniel@transgaming.com83921382011-01-08 05:46:00 +0000129 virtual ~IndexDataManager();
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000130
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +0000131 GLenum prepareIndexData(GLenum type, GLsizei count, Buffer *arrayElementBuffer, const GLvoid *indices, TranslatedIndexData *translated);
daniel@transgaming.comf6549452012-01-27 15:39:08 +0000132 StaticIndexBuffer *getCountingIndices(GLsizei count);
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000133
134 private:
daniel@transgaming.com83921382011-01-08 05:46:00 +0000135 DISALLOW_COPY_AND_ASSIGN(IndexDataManager);
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000136
daniel@transgaming.com83921382011-01-08 05:46:00 +0000137 std::size_t typeSize(GLenum type) const;
138 std::size_t indexSize(D3DFORMAT format) const;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000139
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000140 rx::Renderer9 *const mRenderer; // D3D9_REPLACE
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +0000141
daniel@transgaming.com83921382011-01-08 05:46:00 +0000142 StreamingIndexBuffer *mStreamingBufferShort;
143 StreamingIndexBuffer *mStreamingBufferInt;
daniel@transgaming.comf6549452012-01-27 15:39:08 +0000144 StaticIndexBuffer *mCountingBuffer;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000145};
146
147}
148
daniel@transgaming.com8fd34bd2011-02-18 02:52:14 +0000149#endif // LIBGLESV2_INDEXDATAMANAGER_H_