xref: /aosp_15_r20/external/skia/src/gpu/ganesh/gl/GrGLVertexArray.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2013 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrGLVertexArray_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrGLVertexArray_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLTypes.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuResource.h"
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker class GrBuffer;
19*c8dee2aaSAndroid Build Coastguard Worker class GrGLGpu;
20*c8dee2aaSAndroid Build Coastguard Worker enum class SkSLType : char;
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker /**
23*c8dee2aaSAndroid Build Coastguard Worker  * This sets and tracks the vertex attribute array state. It is used internally by GrGLVertexArray
24*c8dee2aaSAndroid Build Coastguard Worker  * (below) but is separate because it is also used to track the state of vertex array object 0.
25*c8dee2aaSAndroid Build Coastguard Worker  */
26*c8dee2aaSAndroid Build Coastguard Worker class GrGLAttribArrayState {
27*c8dee2aaSAndroid Build Coastguard Worker public:
28*c8dee2aaSAndroid Build Coastguard Worker     explicit GrGLAttribArrayState(int arrayCount = 0) {
29*c8dee2aaSAndroid Build Coastguard Worker         this->resize(arrayCount);
30*c8dee2aaSAndroid Build Coastguard Worker     }
31*c8dee2aaSAndroid Build Coastguard Worker 
resize(int newCount)32*c8dee2aaSAndroid Build Coastguard Worker     void resize(int newCount) {
33*c8dee2aaSAndroid Build Coastguard Worker         fAttribArrayStates.resize_back(newCount);
34*c8dee2aaSAndroid Build Coastguard Worker         this->invalidate();
35*c8dee2aaSAndroid Build Coastguard Worker     }
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker     /**
38*c8dee2aaSAndroid Build Coastguard Worker      * This function enables and sets vertex attrib state for the specified attrib index. It is
39*c8dee2aaSAndroid Build Coastguard Worker      * assumed that the GrGLAttribArrayState is tracking the state of the currently bound vertex
40*c8dee2aaSAndroid Build Coastguard Worker      * array object.
41*c8dee2aaSAndroid Build Coastguard Worker      */
42*c8dee2aaSAndroid Build Coastguard Worker     void set(GrGLGpu*,
43*c8dee2aaSAndroid Build Coastguard Worker              int attribIndex,
44*c8dee2aaSAndroid Build Coastguard Worker              const GrBuffer* vertexBuffer,
45*c8dee2aaSAndroid Build Coastguard Worker              GrVertexAttribType cpuType,
46*c8dee2aaSAndroid Build Coastguard Worker              SkSLType gpuType,
47*c8dee2aaSAndroid Build Coastguard Worker              GrGLsizei stride,
48*c8dee2aaSAndroid Build Coastguard Worker              size_t offsetInBytes,
49*c8dee2aaSAndroid Build Coastguard Worker              int divisor = 0);
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker     /**
52*c8dee2aaSAndroid Build Coastguard Worker      * This function enables the first 'enabledCount' vertex arrays and disables the rest.
53*c8dee2aaSAndroid Build Coastguard Worker      */
54*c8dee2aaSAndroid Build Coastguard Worker     void enableVertexArrays(const GrGLGpu*, int enabledCount,
55*c8dee2aaSAndroid Build Coastguard Worker                             GrPrimitiveRestart = GrPrimitiveRestart::kNo);
56*c8dee2aaSAndroid Build Coastguard Worker 
invalidate()57*c8dee2aaSAndroid Build Coastguard Worker     void invalidate() {
58*c8dee2aaSAndroid Build Coastguard Worker         int count = fAttribArrayStates.size();
59*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < count; ++i) {
60*c8dee2aaSAndroid Build Coastguard Worker             fAttribArrayStates[i].invalidate();
61*c8dee2aaSAndroid Build Coastguard Worker         }
62*c8dee2aaSAndroid Build Coastguard Worker         fEnableStateIsValid = false;
63*c8dee2aaSAndroid Build Coastguard Worker     }
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker     /**
66*c8dee2aaSAndroid Build Coastguard Worker      * The number of attrib arrays that this object is configured to track.
67*c8dee2aaSAndroid Build Coastguard Worker      */
count()68*c8dee2aaSAndroid Build Coastguard Worker     int count() const { return fAttribArrayStates.size(); }
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker private:
71*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr int kInvalidDivisor = -1;
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker     /**
74*c8dee2aaSAndroid Build Coastguard Worker      * Tracks the state of glVertexAttribArray for an attribute index.
75*c8dee2aaSAndroid Build Coastguard Worker      */
76*c8dee2aaSAndroid Build Coastguard Worker     struct AttribArrayState {
invalidateAttribArrayState77*c8dee2aaSAndroid Build Coastguard Worker         void invalidate() {
78*c8dee2aaSAndroid Build Coastguard Worker             fVertexBufferUniqueID.makeInvalid();
79*c8dee2aaSAndroid Build Coastguard Worker             fDivisor = kInvalidDivisor;
80*c8dee2aaSAndroid Build Coastguard Worker             fUsingCpuBuffer = false;
81*c8dee2aaSAndroid Build Coastguard Worker         }
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker         GrGpuResource::UniqueID   fVertexBufferUniqueID;
84*c8dee2aaSAndroid Build Coastguard Worker         bool                      fUsingCpuBuffer;
85*c8dee2aaSAndroid Build Coastguard Worker         GrVertexAttribType        fCPUType;
86*c8dee2aaSAndroid Build Coastguard Worker         SkSLType                  fGPUType;
87*c8dee2aaSAndroid Build Coastguard Worker         GrGLsizei                 fStride;
88*c8dee2aaSAndroid Build Coastguard Worker         const GrGLvoid*           fOffset;
89*c8dee2aaSAndroid Build Coastguard Worker         int                       fDivisor;
90*c8dee2aaSAndroid Build Coastguard Worker     };
91*c8dee2aaSAndroid Build Coastguard Worker 
92*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<16, AttribArrayState, true> fAttribArrayStates;
93*c8dee2aaSAndroid Build Coastguard Worker     int fNumEnabledArrays;
94*c8dee2aaSAndroid Build Coastguard Worker     GrPrimitiveRestart fPrimitiveRestartEnabled;
95*c8dee2aaSAndroid Build Coastguard Worker     bool fEnableStateIsValid = false;
96*c8dee2aaSAndroid Build Coastguard Worker };
97*c8dee2aaSAndroid Build Coastguard Worker 
98*c8dee2aaSAndroid Build Coastguard Worker /**
99*c8dee2aaSAndroid Build Coastguard Worker  * This class represents an OpenGL vertex array object. It manages the lifetime of the vertex array
100*c8dee2aaSAndroid Build Coastguard Worker  * and is used to track the state of the vertex array to avoid redundant GL calls.
101*c8dee2aaSAndroid Build Coastguard Worker  */
102*c8dee2aaSAndroid Build Coastguard Worker class GrGLVertexArray {
103*c8dee2aaSAndroid Build Coastguard Worker public:
104*c8dee2aaSAndroid Build Coastguard Worker     GrGLVertexArray(GrGLint id, int attribCount);
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     /**
107*c8dee2aaSAndroid Build Coastguard Worker      * Binds this vertex array. If the ID has been deleted or abandoned then nullptr is returned.
108*c8dee2aaSAndroid Build Coastguard Worker      * Otherwise, the GrGLAttribArrayState that is tracking this vertex array's attrib bindings is
109*c8dee2aaSAndroid Build Coastguard Worker      * returned.
110*c8dee2aaSAndroid Build Coastguard Worker      */
111*c8dee2aaSAndroid Build Coastguard Worker     GrGLAttribArrayState* bind(GrGLGpu*);
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker     /**
114*c8dee2aaSAndroid Build Coastguard Worker      * This is a version of the above function that also binds an index buffer to the vertex
115*c8dee2aaSAndroid Build Coastguard Worker      * array object.
116*c8dee2aaSAndroid Build Coastguard Worker      */
117*c8dee2aaSAndroid Build Coastguard Worker     GrGLAttribArrayState* bindWithIndexBuffer(GrGLGpu* gpu, const GrBuffer* indexBuffer);
118*c8dee2aaSAndroid Build Coastguard Worker 
arrayID()119*c8dee2aaSAndroid Build Coastguard Worker     GrGLuint arrayID() const { return fID; }
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker     void invalidateCachedState();
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker private:
124*c8dee2aaSAndroid Build Coastguard Worker     GrGLuint                  fID;
125*c8dee2aaSAndroid Build Coastguard Worker     GrGLAttribArrayState      fAttribArrays;
126*c8dee2aaSAndroid Build Coastguard Worker     GrGpuResource::UniqueID   fIndexBufferUniqueID;
127*c8dee2aaSAndroid Build Coastguard Worker };
128*c8dee2aaSAndroid Build Coastguard Worker 
129*c8dee2aaSAndroid Build Coastguard Worker #endif
130