xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/metal/VertexArrayMtl.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // VertexArrayMtl.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the class interface for VertexArrayMtl, implementing VertexArrayImpl.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_METAL_VERTEXARRAYMTL_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_METAL_VERTEXARRAYMTL_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/VertexArrayImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/BufferMtl.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_buffer_pool.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_command_buffer.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_context_device.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_format_utils.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_resources.h"
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker namespace rx
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker class ContextMtl;
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker class VertexArrayMtl : public VertexArrayImpl
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker   public:
28*8975f5c5SAndroid Build Coastguard Worker     VertexArrayMtl(const gl::VertexArrayState &state, ContextMtl *context);
29*8975f5c5SAndroid Build Coastguard Worker     ~VertexArrayMtl() override;
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker     void destroy(const gl::Context *context) override;
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncState(const gl::Context *context,
34*8975f5c5SAndroid Build Coastguard Worker                             const gl::VertexArray::DirtyBits &dirtyBits,
35*8975f5c5SAndroid Build Coastguard Worker                             gl::VertexArray::DirtyAttribBitsArray *attribBits,
36*8975f5c5SAndroid Build Coastguard Worker                             gl::VertexArray::DirtyBindingBitsArray *bindingBits) override;
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker     // Feed client side's vertex/index data
39*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateClientAttribs(const gl::Context *context,
40*8975f5c5SAndroid Build Coastguard Worker                                       GLint firstVertex,
41*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei vertexOrIndexCount,
42*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei instanceCount,
43*8975f5c5SAndroid Build Coastguard Worker                                       gl::DrawElementsType indexTypeOrInvalid,
44*8975f5c5SAndroid Build Coastguard Worker                                       const void *indices);
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker     // vertexDescChanged is both input and output, the input value if is true, will force new
47*8975f5c5SAndroid Build Coastguard Worker     // mtl::VertexDesc to be returned via vertexDescOut. This typically happens when active shader
48*8975f5c5SAndroid Build Coastguard Worker     // program is changed.
49*8975f5c5SAndroid Build Coastguard Worker     // Otherwise, it is only returned when the vertex array is dirty.
50*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupDraw(const gl::Context *glContext,
51*8975f5c5SAndroid Build Coastguard Worker                             mtl::RenderCommandEncoder *cmdEncoder,
52*8975f5c5SAndroid Build Coastguard Worker                             bool *vertexDescChanged,
53*8975f5c5SAndroid Build Coastguard Worker                             mtl::VertexDesc *vertexDescOut);
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker     angle::Result getIndexBuffer(const gl::Context *glContext,
56*8975f5c5SAndroid Build Coastguard Worker                                  gl::DrawElementsType indexType,
57*8975f5c5SAndroid Build Coastguard Worker                                  size_t indexCount,
58*8975f5c5SAndroid Build Coastguard Worker                                  const void *sourcePointer,
59*8975f5c5SAndroid Build Coastguard Worker                                  mtl::BufferRef *idxBufferOut,
60*8975f5c5SAndroid Build Coastguard Worker                                  size_t *idxBufferOffsetOut,
61*8975f5c5SAndroid Build Coastguard Worker                                  gl::DrawElementsType *indexTypeOut);
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     std::vector<DrawCommandRange> getDrawIndices(const gl::Context *glContext,
64*8975f5c5SAndroid Build Coastguard Worker                                                  gl::DrawElementsType originalIndexType,
65*8975f5c5SAndroid Build Coastguard Worker                                                  gl::DrawElementsType indexType,
66*8975f5c5SAndroid Build Coastguard Worker                                                  gl::PrimitiveMode primitiveMode,
67*8975f5c5SAndroid Build Coastguard Worker                                                  mtl::BufferRef idxBuffer,
68*8975f5c5SAndroid Build Coastguard Worker                                                  uint32_t indexCount,
69*8975f5c5SAndroid Build Coastguard Worker                                                  size_t offset);
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker   private:
72*8975f5c5SAndroid Build Coastguard Worker     void reset(ContextMtl *context);
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDirtyAttrib(const gl::Context *glContext,
75*8975f5c5SAndroid Build Coastguard Worker                                   const gl::VertexAttribute &attrib,
76*8975f5c5SAndroid Build Coastguard Worker                                   const gl::VertexBinding &binding,
77*8975f5c5SAndroid Build Coastguard Worker                                   size_t attribIndex);
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertIndexBuffer(const gl::Context *glContext,
80*8975f5c5SAndroid Build Coastguard Worker                                      gl::DrawElementsType indexType,
81*8975f5c5SAndroid Build Coastguard Worker                                      size_t offset,
82*8975f5c5SAndroid Build Coastguard Worker                                      mtl::BufferRef *idxBufferOut,
83*8975f5c5SAndroid Build Coastguard Worker                                      size_t *idxBufferOffsetOut);
84*8975f5c5SAndroid Build Coastguard Worker     angle::Result streamIndexBufferFromClient(const gl::Context *glContext,
85*8975f5c5SAndroid Build Coastguard Worker                                               gl::DrawElementsType indexType,
86*8975f5c5SAndroid Build Coastguard Worker                                               size_t indexCount,
87*8975f5c5SAndroid Build Coastguard Worker                                               const void *sourcePointer,
88*8975f5c5SAndroid Build Coastguard Worker                                               mtl::BufferRef *idxBufferOut,
89*8975f5c5SAndroid Build Coastguard Worker                                               size_t *idxBufferOffsetOut);
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertIndexBufferGPU(const gl::Context *glContext,
92*8975f5c5SAndroid Build Coastguard Worker                                         gl::DrawElementsType indexType,
93*8975f5c5SAndroid Build Coastguard Worker                                         BufferMtl *idxBuffer,
94*8975f5c5SAndroid Build Coastguard Worker                                         size_t offset,
95*8975f5c5SAndroid Build Coastguard Worker                                         size_t indexCount,
96*8975f5c5SAndroid Build Coastguard Worker                                         IndexConversionBufferMtl *conversion);
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertVertexBuffer(const gl::Context *glContext,
99*8975f5c5SAndroid Build Coastguard Worker                                       BufferMtl *srcBuffer,
100*8975f5c5SAndroid Build Coastguard Worker                                       const gl::VertexBinding &binding,
101*8975f5c5SAndroid Build Coastguard Worker                                       size_t attribIndex,
102*8975f5c5SAndroid Build Coastguard Worker                                       const mtl::VertexFormat &vertexFormat);
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertVertexBufferCPU(ContextMtl *contextMtl,
105*8975f5c5SAndroid Build Coastguard Worker                                          BufferMtl *srcBuffer,
106*8975f5c5SAndroid Build Coastguard Worker                                          const gl::VertexBinding &binding,
107*8975f5c5SAndroid Build Coastguard Worker                                          size_t attribIndex,
108*8975f5c5SAndroid Build Coastguard Worker                                          const mtl::VertexFormat &convertedFormat,
109*8975f5c5SAndroid Build Coastguard Worker                                          GLuint targetStride,
110*8975f5c5SAndroid Build Coastguard Worker                                          size_t vertexCount,
111*8975f5c5SAndroid Build Coastguard Worker                                          ConversionBufferMtl *conversion);
112*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertVertexBufferGPU(const gl::Context *glContext,
113*8975f5c5SAndroid Build Coastguard Worker                                          BufferMtl *srcBuffer,
114*8975f5c5SAndroid Build Coastguard Worker                                          const gl::VertexBinding &binding,
115*8975f5c5SAndroid Build Coastguard Worker                                          size_t attribIndex,
116*8975f5c5SAndroid Build Coastguard Worker                                          const mtl::VertexFormat &convertedFormat,
117*8975f5c5SAndroid Build Coastguard Worker                                          GLuint targetStride,
118*8975f5c5SAndroid Build Coastguard Worker                                          size_t vertexCount,
119*8975f5c5SAndroid Build Coastguard Worker                                          bool isExpandingComponents,
120*8975f5c5SAndroid Build Coastguard Worker                                          ConversionBufferMtl *conversion);
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker     // These can point to real BufferMtl or converted buffer in mConvertedArrayBufferHolders
123*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<BufferHolderMtl *> mCurrentArrayBuffers;
124*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<SimpleWeakBufferHolderMtl> mConvertedArrayBufferHolders;
125*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<size_t> mCurrentArrayBufferOffsets;
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     // Size to be uploaded as inline constant data. Used for client vertex attribute's data that
128*8975f5c5SAndroid Build Coastguard Worker     // is small enough that we can send directly as inline constant data instead of streaming
129*8975f5c5SAndroid Build Coastguard Worker     // through a buffer.
130*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<size_t> mCurrentArrayInlineDataSizes;
131*8975f5c5SAndroid Build Coastguard Worker     // Array of host buffers storing converted data for client attributes that are small enough.
132*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<angle::MemoryBuffer> mConvertedClientSmallArrays;
133*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<const uint8_t *> mCurrentArrayInlineDataPointers;
134*8975f5c5SAndroid Build Coastguard Worker     // Max size of inline constant data that can be used for client vertex attribute.
135*8975f5c5SAndroid Build Coastguard Worker     size_t mInlineDataMaxSize;
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker     // Stride per vertex attribute
138*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<GLuint> mCurrentArrayBufferStrides;
139*8975f5c5SAndroid Build Coastguard Worker     // Format per vertex attribute
140*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<const mtl::VertexFormat *> mCurrentArrayBufferFormats;
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     const mtl::VertexFormat &mDefaultFloatVertexFormat;
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker     mtl::BufferPool mDynamicVertexData;
145*8975f5c5SAndroid Build Coastguard Worker     mtl::BufferPool mDynamicIndexData;
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> mEmulatedInstanceAttribs;
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     bool mVertexArrayDirty = true;
150*8975f5c5SAndroid Build Coastguard Worker     bool mVertexDataDirty  = true;
151*8975f5c5SAndroid Build Coastguard Worker };
152*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker #endif /* LIBANGLE_RENDERER_METAL_VERTEXARRAYMTL_H_ */
155