xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/VertexDataManager.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 // VertexDataManager.h: Defines the VertexDataManager, a class that
8*8975f5c5SAndroid Build Coastguard Worker // runs the Buffer translation process.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Constants.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/VertexAttribute.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/VertexBuffer.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace gl
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker class State;
22*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribute;
23*8975f5c5SAndroid Build Coastguard Worker class VertexBinding;
24*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribCurrentValueData;
25*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker namespace rx
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker class BufferD3D;
30*8975f5c5SAndroid Build Coastguard Worker class BufferFactoryD3D;
31*8975f5c5SAndroid Build Coastguard Worker class StreamingVertexBufferInterface;
32*8975f5c5SAndroid Build Coastguard Worker class VertexBuffer;
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker class VertexBufferBinding final
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker   public:
37*8975f5c5SAndroid Build Coastguard Worker     VertexBufferBinding();
38*8975f5c5SAndroid Build Coastguard Worker     VertexBufferBinding(const VertexBufferBinding &other);
39*8975f5c5SAndroid Build Coastguard Worker     ~VertexBufferBinding();
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker     void set(VertexBuffer *vertexBuffer);
42*8975f5c5SAndroid Build Coastguard Worker     VertexBuffer *get() const;
43*8975f5c5SAndroid Build Coastguard Worker     VertexBufferBinding &operator=(const VertexBufferBinding &other);
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker   private:
46*8975f5c5SAndroid Build Coastguard Worker     VertexBuffer *mBoundVertexBuffer;
47*8975f5c5SAndroid Build Coastguard Worker };
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker struct TranslatedAttribute
50*8975f5c5SAndroid Build Coastguard Worker {
51*8975f5c5SAndroid Build Coastguard Worker     TranslatedAttribute();
52*8975f5c5SAndroid Build Coastguard Worker     TranslatedAttribute(const TranslatedAttribute &other);
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     // Computes the correct offset from baseOffset, usesFirstVertexOffset, stride and startVertex.
55*8975f5c5SAndroid Build Coastguard Worker     // Can throw an error on integer overflow.
56*8975f5c5SAndroid Build Coastguard Worker     angle::Result computeOffset(const gl::Context *context,
57*8975f5c5SAndroid Build Coastguard Worker                                 GLint startVertex,
58*8975f5c5SAndroid Build Coastguard Worker                                 unsigned int *offsetOut) const;
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker     bool active;
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     const gl::VertexAttribute *attribute;
63*8975f5c5SAndroid Build Coastguard Worker     const gl::VertexBinding *binding;
64*8975f5c5SAndroid Build Coastguard Worker     gl::VertexAttribType currentValueType;
65*8975f5c5SAndroid Build Coastguard Worker     unsigned int baseOffset;
66*8975f5c5SAndroid Build Coastguard Worker     bool usesFirstVertexOffset;
67*8975f5c5SAndroid Build Coastguard Worker     unsigned int stride;  // 0 means not to advance the read pointer at all
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker     VertexBufferBinding vertexBuffer;
70*8975f5c5SAndroid Build Coastguard Worker     BufferD3D *storage;
71*8975f5c5SAndroid Build Coastguard Worker     unsigned int serial;
72*8975f5c5SAndroid Build Coastguard Worker     unsigned int divisor;
73*8975f5c5SAndroid Build Coastguard Worker };
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker enum class VertexStorageType
76*8975f5c5SAndroid Build Coastguard Worker {
77*8975f5c5SAndroid Build Coastguard Worker     UNKNOWN,
78*8975f5c5SAndroid Build Coastguard Worker     STATIC,         // Translate the vertex data once and re-use it.
79*8975f5c5SAndroid Build Coastguard Worker     DYNAMIC,        // Translate the data every frame into a ring buffer.
80*8975f5c5SAndroid Build Coastguard Worker     DIRECT,         // Bind a D3D buffer directly without any translation.
81*8975f5c5SAndroid Build Coastguard Worker     CURRENT_VALUE,  // Use a single value for the attribute.
82*8975f5c5SAndroid Build Coastguard Worker };
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker // Given a vertex attribute, return the type of storage it will use.
85*8975f5c5SAndroid Build Coastguard Worker VertexStorageType ClassifyAttributeStorage(const gl::Context *context,
86*8975f5c5SAndroid Build Coastguard Worker                                            const gl::VertexAttribute &attrib,
87*8975f5c5SAndroid Build Coastguard Worker                                            const gl::VertexBinding &binding);
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker class VertexDataManager : angle::NonCopyable
90*8975f5c5SAndroid Build Coastguard Worker {
91*8975f5c5SAndroid Build Coastguard Worker   public:
92*8975f5c5SAndroid Build Coastguard Worker     VertexDataManager(BufferFactoryD3D *factory);
93*8975f5c5SAndroid Build Coastguard Worker     virtual ~VertexDataManager();
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker     angle::Result initialize(const gl::Context *context);
96*8975f5c5SAndroid Build Coastguard Worker     void deinitialize();
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     angle::Result prepareVertexData(const gl::Context *context,
99*8975f5c5SAndroid Build Coastguard Worker                                     GLint start,
100*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei count,
101*8975f5c5SAndroid Build Coastguard Worker                                     std::vector<TranslatedAttribute> *translatedAttribs,
102*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei instances);
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     static void StoreDirectAttrib(const gl::Context *context, TranslatedAttribute *directAttrib);
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     static angle::Result StoreStaticAttrib(const gl::Context *context,
107*8975f5c5SAndroid Build Coastguard Worker                                            TranslatedAttribute *translated);
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker     angle::Result storeDynamicAttribs(const gl::Context *context,
110*8975f5c5SAndroid Build Coastguard Worker                                       std::vector<TranslatedAttribute> *translatedAttribs,
111*8975f5c5SAndroid Build Coastguard Worker                                       const gl::AttributesMask &dynamicAttribsMask,
112*8975f5c5SAndroid Build Coastguard Worker                                       GLint start,
113*8975f5c5SAndroid Build Coastguard Worker                                       size_t count,
114*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei instances,
115*8975f5c5SAndroid Build Coastguard Worker                                       GLuint baseInstance);
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     // Promote static usage of dynamic buffers.
118*8975f5c5SAndroid Build Coastguard Worker     static void PromoteDynamicAttribs(const gl::Context *context,
119*8975f5c5SAndroid Build Coastguard Worker                                       const std::vector<TranslatedAttribute> &translatedAttribs,
120*8975f5c5SAndroid Build Coastguard Worker                                       const gl::AttributesMask &dynamicAttribsMask,
121*8975f5c5SAndroid Build Coastguard Worker                                       size_t count);
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker     angle::Result storeCurrentValue(const gl::Context *context,
124*8975f5c5SAndroid Build Coastguard Worker                                     const gl::VertexAttribCurrentValueData &currentValue,
125*8975f5c5SAndroid Build Coastguard Worker                                     TranslatedAttribute *translated,
126*8975f5c5SAndroid Build Coastguard Worker                                     size_t attribIndex);
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker   private:
129*8975f5c5SAndroid Build Coastguard Worker     struct CurrentValueState final : angle::NonCopyable
130*8975f5c5SAndroid Build Coastguard Worker     {
131*8975f5c5SAndroid Build Coastguard Worker         CurrentValueState(BufferFactoryD3D *factory);
132*8975f5c5SAndroid Build Coastguard Worker         CurrentValueState(CurrentValueState &&other);
133*8975f5c5SAndroid Build Coastguard Worker         ~CurrentValueState();
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker         std::unique_ptr<StreamingVertexBufferInterface> buffer;
136*8975f5c5SAndroid Build Coastguard Worker         gl::VertexAttribCurrentValueData data;
137*8975f5c5SAndroid Build Coastguard Worker         size_t offset;
138*8975f5c5SAndroid Build Coastguard Worker     };
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker     angle::Result reserveSpaceForAttrib(const gl::Context *context,
141*8975f5c5SAndroid Build Coastguard Worker                                         const TranslatedAttribute &translatedAttrib,
142*8975f5c5SAndroid Build Coastguard Worker                                         GLint start,
143*8975f5c5SAndroid Build Coastguard Worker                                         size_t count,
144*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei instances,
145*8975f5c5SAndroid Build Coastguard Worker                                         GLuint baseInstance);
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     angle::Result storeDynamicAttrib(const gl::Context *context,
148*8975f5c5SAndroid Build Coastguard Worker                                      TranslatedAttribute *translated,
149*8975f5c5SAndroid Build Coastguard Worker                                      GLint start,
150*8975f5c5SAndroid Build Coastguard Worker                                      size_t count,
151*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei instances,
152*8975f5c5SAndroid Build Coastguard Worker                                      GLuint baseInstance);
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker     BufferFactoryD3D *const mFactory;
155*8975f5c5SAndroid Build Coastguard Worker 
156*8975f5c5SAndroid Build Coastguard Worker     StreamingVertexBufferInterface mStreamingBuffer;
157*8975f5c5SAndroid Build Coastguard Worker     std::vector<CurrentValueState> mCurrentValueCache;
158*8975f5c5SAndroid Build Coastguard Worker     gl::AttributesMask mDynamicAttribsMaskCache;
159*8975f5c5SAndroid Build Coastguard Worker };
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
164