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