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