blob: 6e4a6e46143d6c22fb06669941fadef7e5fd21fa [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.com83921382011-01-08 05:46:00 +000034};
35
36class IndexBuffer
37{
38 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +000039 IndexBuffer(rx::Renderer9 *renderer, UINT size, D3DFORMAT format);
daniel@transgaming.com83921382011-01-08 05:46:00 +000040 virtual ~IndexBuffer();
41
42 UINT size() const { return mBufferSize; }
43 virtual void *map(UINT requiredSpace, UINT *offset) = 0;
44 void unmap();
45 virtual void reserveSpace(UINT requiredSpace, GLenum type) = 0;
46
47 IDirect3DIndexBuffer9 *getBuffer() const;
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +000048 unsigned int getSerial() const;
daniel@transgaming.com83921382011-01-08 05:46:00 +000049
50 protected:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +000051 rx::Renderer9 *const mRenderer; // D3D9_REPLACE
daniel@transgaming.com83921382011-01-08 05:46:00 +000052
53 IDirect3DIndexBuffer9 *mIndexBuffer;
54 UINT mBufferSize;
55
jbauman@chromium.orgd8f3faa2011-09-02 01:10:47 +000056 unsigned int mSerial;
57 static unsigned int issueSerial();
58 static unsigned int mCurrentSerial;
59
daniel@transgaming.com83921382011-01-08 05:46:00 +000060 private:
61 DISALLOW_COPY_AND_ASSIGN(IndexBuffer);
62};
63
64class StreamingIndexBuffer : public IndexBuffer
65{
66 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +000067 StreamingIndexBuffer(rx::Renderer9 *renderer, UINT initialSize, D3DFORMAT format);
daniel@transgaming.com83921382011-01-08 05:46:00 +000068 ~StreamingIndexBuffer();
69
daniel@transgaming.comd976b582011-03-29 00:56:20 +000070 virtual void *map(UINT requiredSpace, UINT *offset);
71 virtual void reserveSpace(UINT requiredSpace, GLenum type);
daniel@transgaming.com83921382011-01-08 05:46:00 +000072
73 private:
74 UINT mWritePosition;
75};
76
77class StaticIndexBuffer : public IndexBuffer
78{
79 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +000080 explicit StaticIndexBuffer(rx::Renderer9 *renderer);
daniel@transgaming.com83921382011-01-08 05:46:00 +000081 ~StaticIndexBuffer();
82
daniel@transgaming.comd976b582011-03-29 00:56:20 +000083 virtual void *map(UINT requiredSpace, UINT *offset);
84 virtual void reserveSpace(UINT requiredSpace, GLenum type);
daniel@transgaming.com83921382011-01-08 05:46:00 +000085
86 bool lookupType(GLenum type);
87 UINT lookupRange(intptr_t offset, GLsizei count, UINT *minIndex, UINT *maxIndex); // Returns the offset into the index buffer, or -1 if not found
88 void addRange(intptr_t offset, GLsizei count, UINT minIndex, UINT maxIndex, UINT streamOffset);
89
90 private:
91 GLenum mCacheType;
daniel@transgaming.com50aadb02012-11-28 21:06:11 +000092
daniel@transgaming.com83921382011-01-08 05:46:00 +000093 struct IndexRange
94 {
95 intptr_t offset;
96 GLsizei count;
97
jbauman@chromium.org43cbe742011-09-01 22:09:40 +000098 bool operator<(const IndexRange& rhs) const
99 {
100 if (offset != rhs.offset)
101 {
102 return offset < rhs.offset;
103 }
104 if (count != rhs.count)
105 {
106 return count < rhs.count;
107 }
108 return false;
109 }
110 };
111
112 struct IndexResult
113 {
daniel@transgaming.com83921382011-01-08 05:46:00 +0000114 UINT minIndex;
115 UINT maxIndex;
116 UINT streamOffset;
117 };
118
jbauman@chromium.org43cbe742011-09-01 22:09:40 +0000119 std::map<IndexRange, IndexResult> mCache;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000120};
121
122class IndexDataManager
123{
124 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000125 IndexDataManager(rx::Renderer9 *renderer);
daniel@transgaming.com83921382011-01-08 05:46:00 +0000126 virtual ~IndexDataManager();
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000127
daniel@transgaming.com91207b72012-11-28 20:56:43 +0000128 GLenum prepareIndexData(GLenum type, GLsizei count, Buffer *arrayElementBuffer, const GLvoid *indices, TranslatedIndexData *translated, IDirect3DIndexBuffer9 **indexBuffer, unsigned int *serial);
daniel@transgaming.comf6549452012-01-27 15:39:08 +0000129 StaticIndexBuffer *getCountingIndices(GLsizei count);
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000130
131 private:
daniel@transgaming.com83921382011-01-08 05:46:00 +0000132 DISALLOW_COPY_AND_ASSIGN(IndexDataManager);
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000133
daniel@transgaming.com83921382011-01-08 05:46:00 +0000134 std::size_t typeSize(GLenum type) const;
135 std::size_t indexSize(D3DFORMAT format) const;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000136
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000137 rx::Renderer9 *const mRenderer; // D3D9_REPLACE
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +0000138
daniel@transgaming.com83921382011-01-08 05:46:00 +0000139 StreamingIndexBuffer *mStreamingBufferShort;
140 StreamingIndexBuffer *mStreamingBufferInt;
daniel@transgaming.comf6549452012-01-27 15:39:08 +0000141 StaticIndexBuffer *mCountingBuffer;
daniel@transgaming.comf8b58a02010-03-26 04:08:45 +0000142};
143
144}
145
daniel@transgaming.com8fd34bd2011-02-18 02:52:14 +0000146#endif // LIBGLESV2_INDEXDATAMANAGER_H_