xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/IndexDataManager.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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