• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrGLUniformHandler_DEFINED
9 #define GrGLUniformHandler_DEFINED
10 
11 #include "src/gpu/gl/GrGLProgramDataManager.h"
12 #include "src/gpu/glsl/GrGLSLUniformHandler.h"
13 
14 #include <vector>
15 
16 class GrGLCaps;
17 
18 class GrGLUniformHandler : public GrGLSLUniformHandler {
19 public:
20     static const int kUniformsPerBlock = 8;
21 
getUniformVariable(UniformHandle u)22     const GrShaderVar& getUniformVariable(UniformHandle u) const override {
23         return fUniforms.item(u.toIndex()).fVariable;
24     }
25 
getUniformCStr(UniformHandle u)26     const char* getUniformCStr(UniformHandle u) const override {
27         return this->getUniformVariable(u).c_str();
28     }
29 
numUniforms()30     int numUniforms() const override {
31         return fUniforms.count();
32     }
33 
uniform(int idx)34     UniformInfo& uniform(int idx) override {
35         return fUniforms.item(idx);
36     }
uniform(int idx)37     const UniformInfo& uniform(int idx) const override {
38         return fUniforms.item(idx);
39     }
40 
41 private:
GrGLUniformHandler(GrGLSLProgramBuilder * program)42     explicit GrGLUniformHandler(GrGLSLProgramBuilder* program)
43         : INHERITED(program)
44         , fUniforms(kUniformsPerBlock)
45         , fSamplers(kUniformsPerBlock) {}
46 
47     UniformHandle internalAddUniformArray(const GrFragmentProcessor* owner,
48                                           uint32_t visibility,
49                                           GrSLType type,
50                                           const char* name,
51                                           bool mangleName,
52                                           int arrayCount,
53                                           const char** outName) override;
54 
55     SamplerHandle addSampler(const GrBackendFormat&, GrSamplerState, const GrSwizzle&,
56                              const char* name, const GrShaderCaps*) override;
57 
samplerVariable(SamplerHandle handle)58     const char* samplerVariable(SamplerHandle handle) const override {
59         return fSamplers.item(handle.toIndex()).fVariable.c_str();
60     }
61 
samplerSwizzle(SamplerHandle handle)62     GrSwizzle samplerSwizzle(SamplerHandle handle) const override {
63         return fSamplerSwizzles[handle.toIndex()];
64     }
65 
66     void appendUniformDecls(GrShaderFlags visibility, SkString*) const override;
67 
68     // Manually set uniform locations for all our uniforms.
69     void bindUniformLocations(GrGLuint programID, const GrGLCaps& caps);
70 
71     // Updates the loction of the Uniforms if we cannot bind uniform locations manually
72     void getUniformLocations(GrGLuint programID, const GrGLCaps& caps, bool force);
73 
74     const GrGLGpu* glGpu() const;
75 
76     typedef GrGLProgramDataManager::GLUniformInfo GLUniformInfo;
77     typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
78 
79     UniformInfoArray    fUniforms;
80     UniformInfoArray    fSamplers;
81     SkTArray<GrSwizzle> fSamplerSwizzles;
82 
83     friend class GrGLProgramBuilder;
84 
85     using INHERITED = GrGLSLUniformHandler;
86 };
87 
88 #endif
89