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