1/*
2 * Copyright 2012 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 GrGLProgramDataManager_DEFINED
9#define GrGLProgramDataManager_DEFINED
10
11#include "GrAllocator.h"
12#include "GrShaderVar.h"
13#include "gl/GrGLTypes.h"
14#include "glsl/GrGLSLProgramDataManager.h"
15
16#include "SkTArray.h"
17
18class GrGLGpu;
19class SkMatrix;
20class GrGLProgram;
21
22/** Manages the resources used by a shader program.
23 * The resources are objects the program uses to communicate with the
24 * application code.
25 */
26class GrGLProgramDataManager : public GrGLSLProgramDataManager {
27public:
28    struct UniformInfo {
29        GrShaderVar fVariable;
30        uint32_t        fVisibility;
31        GrGLint         fLocation;
32    };
33
34    struct VaryingInfo {
35        GrShaderVar fVariable;
36        GrGLint         fLocation;
37    };
38
39    // This uses an allocator rather than array so that the GrShaderVars don't move in memory
40    // after they are inserted. Users of GrGLShaderBuilder get refs to the vars and ptrs to their
41    // name strings. Otherwise, we'd have to hand out copies.
42    typedef GrTAllocator<UniformInfo> UniformInfoArray;
43    typedef GrTAllocator<VaryingInfo> VaryingInfoArray;
44
45    GrGLProgramDataManager(GrGLGpu*, GrGLuint programID, const UniformInfoArray&,
46                           const VaryingInfoArray&);
47
48    void setSamplerUniforms(const UniformInfoArray& samplers, int startUnit) const;
49
50    /** Functions for uploading uniform values. The varities ending in v can be used to upload to an
51    *  array of uniforms. arrayCount must be <= the array count of the uniform.
52    */
53    void set1i(UniformHandle, int32_t) const override;
54    void set1iv(UniformHandle, int arrayCount, const int v[]) const override;
55    void set1f(UniformHandle, float v0) const override;
56    void set1fv(UniformHandle, int arrayCount, const float v[]) const override;
57    void set2f(UniformHandle, float, float) const override;
58    void set2fv(UniformHandle, int arrayCount, const float v[]) const override;
59    void set3f(UniformHandle, float, float, float) const override;
60    void set3fv(UniformHandle, int arrayCount, const float v[]) const override;
61    void set4f(UniformHandle, float, float, float, float) const override;
62    void set4fv(UniformHandle, int arrayCount, const float v[]) const override;
63    // matrices are column-major, the first three upload a single matrix, the latter three upload
64    // arrayCount matrices into a uniform array.
65    void setMatrix2f(UniformHandle, const float matrix[]) const override;
66    void setMatrix3f(UniformHandle, const float matrix[]) const override;
67    void setMatrix4f(UniformHandle, const float matrix[]) const override;
68    void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
69    void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override;
70    void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override;
71
72    // for nvpr only
73    void setPathFragmentInputTransform(VaryingHandle u, int components,
74                                       const SkMatrix& matrix) const override;
75
76private:
77    enum {
78        kUnusedUniform = -1,
79    };
80
81    struct Uniform {
82        GrGLint     fLocation;
83#ifdef SK_DEBUG
84        GrSLType    fType;
85        int         fArrayCount;
86#endif
87    };
88
89    enum {
90        kUnusedPathProcVarying = -1,
91    };
92    struct PathProcVarying {
93        GrGLint     fLocation;
94        SkDEBUGCODE(
95            GrSLType    fType;
96            int         fArrayCount;
97        );
98    };
99
100    template<int N> inline void setMatrices(UniformHandle, int arrayCount,
101                                            const float matrices[]) const;
102
103    SkTArray<Uniform, true> fUniforms;
104    SkTArray<PathProcVarying, true> fPathProcVaryings;
105    GrGLGpu* fGpu;
106    GrGLuint fProgramID;
107
108    typedef GrGLSLProgramDataManager INHERITED;
109};
110
111#endif
112