xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/IndexBuffer.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 // IndexBuffer.h: Defines the abstract IndexBuffer class and IndexBufferInterface
8*8975f5c5SAndroid Build Coastguard Worker // class with derivations, classes that perform graphics API agnostic index buffer operations.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h"
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace gl
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker class Context;
20*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace rx
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker class BufferFactoryD3D;
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker class IndexBuffer : angle::NonCopyable
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker   public:
29*8975f5c5SAndroid Build Coastguard Worker     IndexBuffer();
30*8975f5c5SAndroid Build Coastguard Worker     virtual ~IndexBuffer();
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result initialize(const gl::Context *context,
33*8975f5c5SAndroid Build Coastguard Worker                                      unsigned int bufferSize,
34*8975f5c5SAndroid Build Coastguard Worker                                      gl::DrawElementsType indexType,
35*8975f5c5SAndroid Build Coastguard Worker                                      bool dynamic) = 0;
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result mapBuffer(const gl::Context *context,
38*8975f5c5SAndroid Build Coastguard Worker                                     unsigned int offset,
39*8975f5c5SAndroid Build Coastguard Worker                                     unsigned int size,
40*8975f5c5SAndroid Build Coastguard Worker                                     void **outMappedMemory)       = 0;
41*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result unmapBuffer(const gl::Context *context) = 0;
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result discard(const gl::Context *context) = 0;
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker     virtual gl::DrawElementsType getIndexType() const             = 0;
46*8975f5c5SAndroid Build Coastguard Worker     virtual unsigned int getBufferSize() const                    = 0;
47*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result setSize(const gl::Context *context,
48*8975f5c5SAndroid Build Coastguard Worker                                   unsigned int bufferSize,
49*8975f5c5SAndroid Build Coastguard Worker                                   gl::DrawElementsType indexType) = 0;
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     unsigned int getSerial() const;
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker   protected:
54*8975f5c5SAndroid Build Coastguard Worker     void updateSerial();
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker   private:
57*8975f5c5SAndroid Build Coastguard Worker     unsigned int mSerial;
58*8975f5c5SAndroid Build Coastguard Worker     static unsigned int mNextSerial;
59*8975f5c5SAndroid Build Coastguard Worker };
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker class IndexBufferInterface : angle::NonCopyable
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker   public:
64*8975f5c5SAndroid Build Coastguard Worker     IndexBufferInterface(BufferFactoryD3D *factory, bool dynamic);
65*8975f5c5SAndroid Build Coastguard Worker     virtual ~IndexBufferInterface();
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result reserveBufferSpace(const gl::Context *context,
68*8975f5c5SAndroid Build Coastguard Worker                                              unsigned int size,
69*8975f5c5SAndroid Build Coastguard Worker                                              gl::DrawElementsType indexType) = 0;
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     gl::DrawElementsType getIndexType() const;
72*8975f5c5SAndroid Build Coastguard Worker     unsigned int getBufferSize() const;
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker     unsigned int getSerial() const;
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker     angle::Result mapBuffer(const gl::Context *context,
77*8975f5c5SAndroid Build Coastguard Worker                             unsigned int size,
78*8975f5c5SAndroid Build Coastguard Worker                             void **outMappedMemory,
79*8975f5c5SAndroid Build Coastguard Worker                             unsigned int *streamOffset);
80*8975f5c5SAndroid Build Coastguard Worker     angle::Result unmapBuffer(const gl::Context *context);
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker     IndexBuffer *getIndexBuffer() const;
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker   protected:
85*8975f5c5SAndroid Build Coastguard Worker     unsigned int getWritePosition() const;
86*8975f5c5SAndroid Build Coastguard Worker     void setWritePosition(unsigned int writePosition);
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     angle::Result discard(const gl::Context *context);
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker     angle::Result setBufferSize(const gl::Context *context,
91*8975f5c5SAndroid Build Coastguard Worker                                 unsigned int bufferSize,
92*8975f5c5SAndroid Build Coastguard Worker                                 gl::DrawElementsType indexType);
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker   private:
95*8975f5c5SAndroid Build Coastguard Worker     IndexBuffer *mIndexBuffer;
96*8975f5c5SAndroid Build Coastguard Worker 
97*8975f5c5SAndroid Build Coastguard Worker     unsigned int mWritePosition;
98*8975f5c5SAndroid Build Coastguard Worker     bool mDynamic;
99*8975f5c5SAndroid Build Coastguard Worker };
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker class StreamingIndexBufferInterface : public IndexBufferInterface
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker   public:
104*8975f5c5SAndroid Build Coastguard Worker     explicit StreamingIndexBufferInterface(BufferFactoryD3D *factory);
105*8975f5c5SAndroid Build Coastguard Worker     ~StreamingIndexBufferInterface() override;
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker     angle::Result reserveBufferSpace(const gl::Context *context,
108*8975f5c5SAndroid Build Coastguard Worker                                      unsigned int size,
109*8975f5c5SAndroid Build Coastguard Worker                                      gl::DrawElementsType indexType) override;
110*8975f5c5SAndroid Build Coastguard Worker };
111*8975f5c5SAndroid Build Coastguard Worker 
112*8975f5c5SAndroid Build Coastguard Worker class StaticIndexBufferInterface : public IndexBufferInterface
113*8975f5c5SAndroid Build Coastguard Worker {
114*8975f5c5SAndroid Build Coastguard Worker   public:
115*8975f5c5SAndroid Build Coastguard Worker     explicit StaticIndexBufferInterface(BufferFactoryD3D *factory);
116*8975f5c5SAndroid Build Coastguard Worker     ~StaticIndexBufferInterface() override;
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     angle::Result reserveBufferSpace(const gl::Context *context,
119*8975f5c5SAndroid Build Coastguard Worker                                      unsigned int size,
120*8975f5c5SAndroid Build Coastguard Worker                                      gl::DrawElementsType indexType) override;
121*8975f5c5SAndroid Build Coastguard Worker };
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_
126