xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/VertexBuffer.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 // VertexBuffer.h: Defines the abstract VertexBuffer class and VertexBufferInterface
8*8975f5c5SAndroid Build Coastguard Worker // class with derivations, classes that perform graphics API agnostic vertex buffer operations.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_VERTEXBUFFER_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 #include "libANGLE/renderer/Format.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #include <GLES2/gl2.h>
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker #include <cstddef>
21*8975f5c5SAndroid Build Coastguard Worker #include <cstdint>
22*8975f5c5SAndroid Build Coastguard Worker #include <vector>
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker namespace gl
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker class Context;
27*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribute;
28*8975f5c5SAndroid Build Coastguard Worker class VertexBinding;
29*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribCurrentValueData;
30*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker namespace rx
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker class BufferFactoryD3D;
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker // Use a ref-counting scheme with self-deletion on release. We do this so that we can more
37*8975f5c5SAndroid Build Coastguard Worker // easily manage the static buffer cache, without deleting currently bound buffers.
38*8975f5c5SAndroid Build Coastguard Worker class VertexBuffer : angle::NonCopyable
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker   public:
41*8975f5c5SAndroid Build Coastguard Worker     VertexBuffer();
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result initialize(const gl::Context *context,
44*8975f5c5SAndroid Build Coastguard Worker                                      unsigned int size,
45*8975f5c5SAndroid Build Coastguard Worker                                      bool dynamicUsage) = 0;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     // Warning: you should ensure binding really matches attrib.bindingIndex before using this
48*8975f5c5SAndroid Build Coastguard Worker     // function.
49*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result storeVertexAttributes(const gl::Context *context,
50*8975f5c5SAndroid Build Coastguard Worker                                                 const gl::VertexAttribute &attrib,
51*8975f5c5SAndroid Build Coastguard Worker                                                 const gl::VertexBinding &binding,
52*8975f5c5SAndroid Build Coastguard Worker                                                 gl::VertexAttribType currentValueType,
53*8975f5c5SAndroid Build Coastguard Worker                                                 GLint start,
54*8975f5c5SAndroid Build Coastguard Worker                                                 size_t count,
55*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei instances,
56*8975f5c5SAndroid Build Coastguard Worker                                                 unsigned int offset,
57*8975f5c5SAndroid Build Coastguard Worker                                                 const uint8_t *sourceData) = 0;
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker     virtual unsigned int getBufferSize() const                                         = 0;
60*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result setBufferSize(const gl::Context *context, unsigned int size) = 0;
61*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result discard(const gl::Context *context)                          = 0;
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     unsigned int getSerial() const;
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker     // This may be overridden (e.g. by VertexBuffer11) if necessary.
hintUnmapResource()66*8975f5c5SAndroid Build Coastguard Worker     virtual void hintUnmapResource() {}
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     // Reference counting.
69*8975f5c5SAndroid Build Coastguard Worker     void addRef();
70*8975f5c5SAndroid Build Coastguard Worker     void release();
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker   protected:
73*8975f5c5SAndroid Build Coastguard Worker     void updateSerial();
74*8975f5c5SAndroid Build Coastguard Worker     virtual ~VertexBuffer();
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker   private:
77*8975f5c5SAndroid Build Coastguard Worker     unsigned int mSerial;
78*8975f5c5SAndroid Build Coastguard Worker     static unsigned int mNextSerial;
79*8975f5c5SAndroid Build Coastguard Worker     unsigned int mRefCount;
80*8975f5c5SAndroid Build Coastguard Worker };
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker class VertexBufferInterface : angle::NonCopyable
83*8975f5c5SAndroid Build Coastguard Worker {
84*8975f5c5SAndroid Build Coastguard Worker   public:
85*8975f5c5SAndroid Build Coastguard Worker     VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic);
86*8975f5c5SAndroid Build Coastguard Worker     virtual ~VertexBufferInterface();
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     unsigned int getBufferSize() const;
empty()89*8975f5c5SAndroid Build Coastguard Worker     bool empty() const { return getBufferSize() == 0; }
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     unsigned int getSerial() const;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     VertexBuffer *getVertexBuffer() const;
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker   protected:
96*8975f5c5SAndroid Build Coastguard Worker     angle::Result discard(const gl::Context *context);
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     angle::Result setBufferSize(const gl::Context *context, unsigned int size);
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     angle::Result getSpaceRequired(const gl::Context *context,
101*8975f5c5SAndroid Build Coastguard Worker                                    const gl::VertexAttribute &attrib,
102*8975f5c5SAndroid Build Coastguard Worker                                    const gl::VertexBinding &binding,
103*8975f5c5SAndroid Build Coastguard Worker                                    size_t count,
104*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei instances,
105*8975f5c5SAndroid Build Coastguard Worker                                    GLuint baseInstance,
106*8975f5c5SAndroid Build Coastguard Worker                                    unsigned int *spaceInBytesOut) const;
107*8975f5c5SAndroid Build Coastguard Worker     BufferFactoryD3D *const mFactory;
108*8975f5c5SAndroid Build Coastguard Worker     VertexBuffer *mVertexBuffer;
109*8975f5c5SAndroid Build Coastguard Worker     bool mDynamic;
110*8975f5c5SAndroid Build Coastguard Worker };
111*8975f5c5SAndroid Build Coastguard Worker 
112*8975f5c5SAndroid Build Coastguard Worker class StreamingVertexBufferInterface : public VertexBufferInterface
113*8975f5c5SAndroid Build Coastguard Worker {
114*8975f5c5SAndroid Build Coastguard Worker   public:
115*8975f5c5SAndroid Build Coastguard Worker     StreamingVertexBufferInterface(BufferFactoryD3D *factory);
116*8975f5c5SAndroid Build Coastguard Worker     ~StreamingVertexBufferInterface() override;
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     angle::Result initialize(const gl::Context *context, std::size_t initialSize);
119*8975f5c5SAndroid Build Coastguard Worker     void reset();
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker     angle::Result storeDynamicAttribute(const gl::Context *context,
122*8975f5c5SAndroid Build Coastguard Worker                                         const gl::VertexAttribute &attrib,
123*8975f5c5SAndroid Build Coastguard Worker                                         const gl::VertexBinding &binding,
124*8975f5c5SAndroid Build Coastguard Worker                                         gl::VertexAttribType currentValueType,
125*8975f5c5SAndroid Build Coastguard Worker                                         GLint start,
126*8975f5c5SAndroid Build Coastguard Worker                                         size_t count,
127*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei instances,
128*8975f5c5SAndroid Build Coastguard Worker                                         GLuint baseInstance,
129*8975f5c5SAndroid Build Coastguard Worker                                         unsigned int *outStreamOffset,
130*8975f5c5SAndroid Build Coastguard Worker                                         const uint8_t *sourceData);
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker     angle::Result reserveVertexSpace(const gl::Context *context,
133*8975f5c5SAndroid Build Coastguard Worker                                      const gl::VertexAttribute &attribute,
134*8975f5c5SAndroid Build Coastguard Worker                                      const gl::VertexBinding &binding,
135*8975f5c5SAndroid Build Coastguard Worker                                      size_t count,
136*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei instances,
137*8975f5c5SAndroid Build Coastguard Worker                                      GLuint baseInstance);
138*8975f5c5SAndroid Build Coastguard Worker 
139*8975f5c5SAndroid Build Coastguard Worker   private:
140*8975f5c5SAndroid Build Coastguard Worker     angle::Result reserveSpace(const gl::Context *context, unsigned int size);
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     unsigned int mWritePosition;
143*8975f5c5SAndroid Build Coastguard Worker     unsigned int mReservedSpace;
144*8975f5c5SAndroid Build Coastguard Worker };
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker class StaticVertexBufferInterface : public VertexBufferInterface
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker   public:
149*8975f5c5SAndroid Build Coastguard Worker     explicit StaticVertexBufferInterface(BufferFactoryD3D *factory);
150*8975f5c5SAndroid Build Coastguard Worker     ~StaticVertexBufferInterface() override;
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     // Warning: you should ensure binding really matches attrib.bindingIndex before using these
153*8975f5c5SAndroid Build Coastguard Worker     // functions.
154*8975f5c5SAndroid Build Coastguard Worker     angle::Result storeStaticAttribute(const gl::Context *context,
155*8975f5c5SAndroid Build Coastguard Worker                                        const gl::VertexAttribute &attrib,
156*8975f5c5SAndroid Build Coastguard Worker                                        const gl::VertexBinding &binding,
157*8975f5c5SAndroid Build Coastguard Worker                                        GLint start,
158*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei count,
159*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei instances,
160*8975f5c5SAndroid Build Coastguard Worker                                        const uint8_t *sourceData);
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker     bool matchesAttribute(const gl::VertexAttribute &attribute,
163*8975f5c5SAndroid Build Coastguard Worker                           const gl::VertexBinding &binding) const;
164*8975f5c5SAndroid Build Coastguard Worker 
165*8975f5c5SAndroid Build Coastguard Worker     void setAttribute(const gl::VertexAttribute &attribute, const gl::VertexBinding &binding);
166*8975f5c5SAndroid Build Coastguard Worker 
167*8975f5c5SAndroid Build Coastguard Worker   private:
168*8975f5c5SAndroid Build Coastguard Worker     class AttributeSignature final : angle::NonCopyable
169*8975f5c5SAndroid Build Coastguard Worker     {
170*8975f5c5SAndroid Build Coastguard Worker       public:
171*8975f5c5SAndroid Build Coastguard Worker         AttributeSignature();
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker         bool matchesAttribute(const gl::VertexAttribute &attrib,
174*8975f5c5SAndroid Build Coastguard Worker                               const gl::VertexBinding &binding) const;
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker         void set(const gl::VertexAttribute &attrib, const gl::VertexBinding &binding);
177*8975f5c5SAndroid Build Coastguard Worker 
178*8975f5c5SAndroid Build Coastguard Worker       private:
179*8975f5c5SAndroid Build Coastguard Worker         angle::FormatID formatID;
180*8975f5c5SAndroid Build Coastguard Worker         GLuint stride;
181*8975f5c5SAndroid Build Coastguard Worker         size_t offset;
182*8975f5c5SAndroid Build Coastguard Worker     };
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker     AttributeSignature mSignature;
185*8975f5c5SAndroid Build Coastguard Worker };
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_
190