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 "glsl/GrGLSLUniformHandler.h"
12
13#include "gl/GrGLProgramDataManager.h"
14
15class GrGLCaps;
16
17class GrGLUniformHandler : public GrGLSLUniformHandler {
18public:
19    static const int kUniformsPerBlock = 8;
20
21    const GrShaderVar& getUniformVariable(UniformHandle u) const override {
22        return fUniforms[u.toIndex()].fVariable;
23    }
24
25    const char* getUniformCStr(UniformHandle u) const override {
26        return this->getUniformVariable(u).c_str();
27    }
28private:
29    explicit GrGLUniformHandler(GrGLSLProgramBuilder* program)
30        : INHERITED(program)
31        , fUniforms(kUniformsPerBlock)
32        , fSamplers(kUniformsPerBlock)
33        , fTexelBuffers(kUniformsPerBlock) {}
34
35    UniformHandle internalAddUniformArray(uint32_t visibility,
36                                          GrSLType type,
37                                          GrSLPrecision precision,
38                                          const char* name,
39                                          bool mangleName,
40                                          int arrayCount,
41                                          const char** outName) override;
42
43    SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrSLType, GrSLPrecision,
44                             const char* name) override;
45
46    const GrShaderVar& samplerVariable(SamplerHandle handle) const override {
47        return fSamplers[handle.toIndex()].fVariable;
48    }
49
50    GrSwizzle samplerSwizzle(SamplerHandle handle) const override {
51        return fSamplerSwizzles[handle.toIndex()];
52    }
53
54    TexelBufferHandle addTexelBuffer(uint32_t visibility, GrSLPrecision,
55                                     const char* name) override;
56
57    const GrShaderVar& texelBufferVariable(TexelBufferHandle handle) const override {
58        return fTexelBuffers[handle.toIndex()].fVariable;
59    }
60
61    void appendUniformDecls(GrShaderFlags visibility, SkString*) const override;
62
63    // Manually set uniform locations for all our uniforms.
64    void bindUniformLocations(GrGLuint programID, const GrGLCaps& caps);
65
66    // Updates the loction of the Uniforms if we cannot bind uniform locations manually
67    void getUniformLocations(GrGLuint programID, const GrGLCaps& caps);
68
69    const GrGLGpu* glGpu() const;
70
71    typedef GrGLProgramDataManager::UniformInfo UniformInfo;
72    typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
73
74    UniformInfoArray    fUniforms;
75    UniformInfoArray    fSamplers;
76    SkTArray<GrSwizzle> fSamplerSwizzles;
77    UniformInfoArray    fTexelBuffers;
78
79    friend class GrGLProgramBuilder;
80
81    typedef GrGLSLUniformHandler INHERITED;
82};
83
84#endif
85