1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 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 GrGLProgramDataManager_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrGLProgramDataManager_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/SkDebug.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTBlockList.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrShaderVar.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/glsl/GrGLSLProgramDataManager.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/glsl/GrGLSLUniformHandler.h" 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class GrGLGpu; 22*c8dee2aaSAndroid Build Coastguard Worker enum class SkSLType : char; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker /** Manages the resources used by a shader program. 25*c8dee2aaSAndroid Build Coastguard Worker * The resources are objects the program uses to communicate with the 26*c8dee2aaSAndroid Build Coastguard Worker * application code. 27*c8dee2aaSAndroid Build Coastguard Worker */ 28*c8dee2aaSAndroid Build Coastguard Worker class GrGLProgramDataManager : public GrGLSLProgramDataManager { 29*c8dee2aaSAndroid Build Coastguard Worker public: 30*c8dee2aaSAndroid Build Coastguard Worker struct GLUniformInfo : public GrGLSLUniformHandler::UniformInfo { 31*c8dee2aaSAndroid Build Coastguard Worker GrGLint fLocation; 32*c8dee2aaSAndroid Build Coastguard Worker }; 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker struct VaryingInfo { 35*c8dee2aaSAndroid Build Coastguard Worker GrShaderVar fVariable; 36*c8dee2aaSAndroid Build Coastguard Worker GrGLint fLocation; 37*c8dee2aaSAndroid Build Coastguard Worker }; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker // This uses a SkTBlockList rather than SkTArray/std::vector so that the GrShaderVars 40*c8dee2aaSAndroid Build Coastguard Worker // don't move in memory after they are inserted. Users of GrGLShaderBuilder get refs to the vars 41*c8dee2aaSAndroid Build Coastguard Worker // and ptrs to their name strings. Otherwise, we'd have to hand out copies. 42*c8dee2aaSAndroid Build Coastguard Worker typedef SkTBlockList<GLUniformInfo> UniformInfoArray; 43*c8dee2aaSAndroid Build Coastguard Worker typedef SkTBlockList<VaryingInfo> VaryingInfoArray; 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker GrGLProgramDataManager(GrGLGpu*, const UniformInfoArray&); 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker void setSamplerUniforms(const UniformInfoArray& samplers, int startUnit) const; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker /** Functions for uploading uniform values. The varities ending in v can be used to upload to an 50*c8dee2aaSAndroid Build Coastguard Worker * array of uniforms. arrayCount must be <= the array count of the uniform. 51*c8dee2aaSAndroid Build Coastguard Worker */ 52*c8dee2aaSAndroid Build Coastguard Worker void set1i(UniformHandle, int32_t) const override; 53*c8dee2aaSAndroid Build Coastguard Worker void set1iv(UniformHandle, int arrayCount, const int32_t v[]) const override; 54*c8dee2aaSAndroid Build Coastguard Worker void set1f(UniformHandle, float v0) const override; 55*c8dee2aaSAndroid Build Coastguard Worker void set1fv(UniformHandle, int arrayCount, const float v[]) const override; 56*c8dee2aaSAndroid Build Coastguard Worker void set2i(UniformHandle, int32_t, int32_t) const override; 57*c8dee2aaSAndroid Build Coastguard Worker void set2iv(UniformHandle, int arrayCount, const int32_t v[]) const override; 58*c8dee2aaSAndroid Build Coastguard Worker void set2f(UniformHandle, float, float) const override; 59*c8dee2aaSAndroid Build Coastguard Worker void set2fv(UniformHandle, int arrayCount, const float v[]) const override; 60*c8dee2aaSAndroid Build Coastguard Worker void set3i(UniformHandle, int32_t, int32_t, int32_t) const override; 61*c8dee2aaSAndroid Build Coastguard Worker void set3iv(UniformHandle, int arrayCount, const int32_t v[]) const override; 62*c8dee2aaSAndroid Build Coastguard Worker void set3f(UniformHandle, float, float, float) const override; 63*c8dee2aaSAndroid Build Coastguard Worker void set3fv(UniformHandle, int arrayCount, const float v[]) const override; 64*c8dee2aaSAndroid Build Coastguard Worker void set4i(UniformHandle, int32_t, int32_t, int32_t, int32_t) const override; 65*c8dee2aaSAndroid Build Coastguard Worker void set4iv(UniformHandle, int arrayCount, const int32_t v[]) const override; 66*c8dee2aaSAndroid Build Coastguard Worker void set4f(UniformHandle, float, float, float, float) const override; 67*c8dee2aaSAndroid Build Coastguard Worker void set4fv(UniformHandle, int arrayCount, const float v[]) const override; 68*c8dee2aaSAndroid Build Coastguard Worker // matrices are column-major, the first three upload a single matrix, the latter three upload 69*c8dee2aaSAndroid Build Coastguard Worker // arrayCount matrices into a uniform array. 70*c8dee2aaSAndroid Build Coastguard Worker void setMatrix2f(UniformHandle, const float matrix[]) const override; 71*c8dee2aaSAndroid Build Coastguard Worker void setMatrix3f(UniformHandle, const float matrix[]) const override; 72*c8dee2aaSAndroid Build Coastguard Worker void setMatrix4f(UniformHandle, const float matrix[]) const override; 73*c8dee2aaSAndroid Build Coastguard Worker void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override; 74*c8dee2aaSAndroid Build Coastguard Worker void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override; 75*c8dee2aaSAndroid Build Coastguard Worker void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker private: 78*c8dee2aaSAndroid Build Coastguard Worker struct Uniform { 79*c8dee2aaSAndroid Build Coastguard Worker GrGLint fLocation; 80*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 81*c8dee2aaSAndroid Build Coastguard Worker SkSLType fType; 82*c8dee2aaSAndroid Build Coastguard Worker int fArrayCount; 83*c8dee2aaSAndroid Build Coastguard Worker #endif 84*c8dee2aaSAndroid Build Coastguard Worker }; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker template<int N> inline void setMatrices(UniformHandle, int arrayCount, 87*c8dee2aaSAndroid Build Coastguard Worker const float matrices[]) const; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<Uniform, true> fUniforms; 90*c8dee2aaSAndroid Build Coastguard Worker GrGLGpu* fGpu; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrGLSLProgramDataManager; 93*c8dee2aaSAndroid Build Coastguard Worker }; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker #endif 96