1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker // IndexDataManager.h: Defines the IndexDataManager, a class that
8*8975f5c5SAndroid Build Coastguard Worker // runs the Buffer translation process for index buffers.
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_INDEXDATAMANAGER_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_INDEXDATAMANAGER_H_
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker #include <GLES2/gl2.h>
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/RendererD3D.h"
19*8975f5c5SAndroid Build Coastguard Worker
20*8975f5c5SAndroid Build Coastguard Worker namespace
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker enum
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker INITIAL_INDEX_BUFFER_SIZE = 4096 * sizeof(GLuint)
25*8975f5c5SAndroid Build Coastguard Worker };
26*8975f5c5SAndroid Build Coastguard Worker }
27*8975f5c5SAndroid Build Coastguard Worker
28*8975f5c5SAndroid Build Coastguard Worker namespace gl
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker class Buffer;
31*8975f5c5SAndroid Build Coastguard Worker }
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker namespace rx
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker class IndexBufferInterface;
36*8975f5c5SAndroid Build Coastguard Worker class StaticIndexBufferInterface;
37*8975f5c5SAndroid Build Coastguard Worker class StreamingIndexBufferInterface;
38*8975f5c5SAndroid Build Coastguard Worker class IndexBuffer;
39*8975f5c5SAndroid Build Coastguard Worker class BufferD3D;
40*8975f5c5SAndroid Build Coastguard Worker class RendererD3D;
41*8975f5c5SAndroid Build Coastguard Worker
42*8975f5c5SAndroid Build Coastguard Worker struct SourceIndexData
43*8975f5c5SAndroid Build Coastguard Worker {
44*8975f5c5SAndroid Build Coastguard Worker BufferD3D *srcBuffer;
45*8975f5c5SAndroid Build Coastguard Worker const void *srcIndices;
46*8975f5c5SAndroid Build Coastguard Worker unsigned int srcCount;
47*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType srcIndexType;
48*8975f5c5SAndroid Build Coastguard Worker bool srcIndicesChanged;
49*8975f5c5SAndroid Build Coastguard Worker };
50*8975f5c5SAndroid Build Coastguard Worker
51*8975f5c5SAndroid Build Coastguard Worker struct TranslatedIndexData
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker unsigned int startIndex;
54*8975f5c5SAndroid Build Coastguard Worker unsigned int startOffset; // In bytes
55*8975f5c5SAndroid Build Coastguard Worker
56*8975f5c5SAndroid Build Coastguard Worker IndexBuffer *indexBuffer;
57*8975f5c5SAndroid Build Coastguard Worker BufferD3D *storage;
58*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexType;
59*8975f5c5SAndroid Build Coastguard Worker unsigned int serial;
60*8975f5c5SAndroid Build Coastguard Worker
61*8975f5c5SAndroid Build Coastguard Worker SourceIndexData srcIndexData;
62*8975f5c5SAndroid Build Coastguard Worker };
63*8975f5c5SAndroid Build Coastguard Worker
64*8975f5c5SAndroid Build Coastguard Worker class IndexDataManager : angle::NonCopyable
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker public:
67*8975f5c5SAndroid Build Coastguard Worker explicit IndexDataManager(BufferFactoryD3D *factory);
68*8975f5c5SAndroid Build Coastguard Worker virtual ~IndexDataManager();
69*8975f5c5SAndroid Build Coastguard Worker
70*8975f5c5SAndroid Build Coastguard Worker void deinitialize();
71*8975f5c5SAndroid Build Coastguard Worker
72*8975f5c5SAndroid Build Coastguard Worker angle::Result prepareIndexData(const gl::Context *context,
73*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType srcType,
74*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType dstType,
75*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
76*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *glBuffer,
77*8975f5c5SAndroid Build Coastguard Worker const void *indices,
78*8975f5c5SAndroid Build Coastguard Worker TranslatedIndexData *translated);
79*8975f5c5SAndroid Build Coastguard Worker
80*8975f5c5SAndroid Build Coastguard Worker private:
81*8975f5c5SAndroid Build Coastguard Worker angle::Result streamIndexData(const gl::Context *context,
82*8975f5c5SAndroid Build Coastguard Worker const void *data,
83*8975f5c5SAndroid Build Coastguard Worker unsigned int count,
84*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType srcType,
85*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType dstType,
86*8975f5c5SAndroid Build Coastguard Worker bool usePrimitiveRestartFixedIndex,
87*8975f5c5SAndroid Build Coastguard Worker TranslatedIndexData *translated);
88*8975f5c5SAndroid Build Coastguard Worker angle::Result getStreamingIndexBuffer(const gl::Context *context,
89*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType destinationIndexType,
90*8975f5c5SAndroid Build Coastguard Worker IndexBufferInterface **outBuffer);
91*8975f5c5SAndroid Build Coastguard Worker
92*8975f5c5SAndroid Build Coastguard Worker using StreamingBuffer = std::unique_ptr<StreamingIndexBufferInterface>;
93*8975f5c5SAndroid Build Coastguard Worker
94*8975f5c5SAndroid Build Coastguard Worker BufferFactoryD3D *const mFactory;
95*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<StreamingIndexBufferInterface> mStreamingBufferShort;
96*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<StreamingIndexBufferInterface> mStreamingBufferInt;
97*8975f5c5SAndroid Build Coastguard Worker };
98*8975f5c5SAndroid Build Coastguard Worker
99*8975f5c5SAndroid Build Coastguard Worker angle::Result GetIndexTranslationDestType(const gl::Context *context,
100*8975f5c5SAndroid Build Coastguard Worker GLsizei indexCount,
101*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexType,
102*8975f5c5SAndroid Build Coastguard Worker const void *indices,
103*8975f5c5SAndroid Build Coastguard Worker bool usePrimitiveRestartWorkaround,
104*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType *destTypeOut);
105*8975f5c5SAndroid Build Coastguard Worker
IsOffsetAligned(gl::DrawElementsType elementType,unsigned int offset)106*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool IsOffsetAligned(gl::DrawElementsType elementType, unsigned int offset)
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker return (offset % gl::GetDrawElementsTypeSize(elementType) == 0);
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker } // namespace rx
111*8975f5c5SAndroid Build Coastguard Worker
112*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_INDEXDATAMANAGER_H_
113