1dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com/*
2dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com * Copyright 2012 Google Inc.
3dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com *
4dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com * Use of this source code is governed by a BSD-style license that can be
5dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com * found in the LICENSE file.
6dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com */
7dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
87510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen#ifndef GrGLProgramDataManager_DEFINED
97510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen#define GrGLProgramDataManager_DEFINED
10dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
11777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com#include "GrAllocator.h"
1299938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon#include "GrShaderVar.h"
13f529439fea003851d986a0573a7e0465754b2a48egdaniel#include "gl/GrGLTypes.h"
1499938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon#include "glsl/GrGLSLProgramDataManager.h"
15dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
16dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com#include "SkTArray.h"
17dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
18861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomonclass GrGLGpu;
19d8b5faca043100d7a1e4594b4d10e462532af390bsalomon@google.comclass SkMatrix;
20dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunenclass GrGLProgram;
21dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
227510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen/** Manages the resources used by a shader program.
237510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen * The resources are objects the program uses to communicate with the
247510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen * application code.
257510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen */
26018fb62d12d1febf121fe265da5b6117b86a6541egdanielclass GrGLProgramDataManager : public GrGLSLProgramDataManager {
27dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.compublic:
2847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    struct UniformInfo {
2999938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon        GrShaderVar fVariable;
300d3f061262a53b775f0a92b0abf8a4a846290d65egdaniel        uint32_t        fVisibility;
310d3f061262a53b775f0a92b0abf8a4a846290d65egdaniel        GrGLint         fLocation;
32ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen    };
33ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen
340eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel    struct VaryingInfo {
3599938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon        GrShaderVar fVariable;
360d3f061262a53b775f0a92b0abf8a4a846290d65egdaniel        GrGLint         fLocation;
37d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt    };
38d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt
3999938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon    // This uses an allocator rather than array so that the GrShaderVars don't move in memory
4047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    // after they are inserted. Users of GrGLShaderBuilder get refs to the vars and ptrs to their
4147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    // name strings. Otherwise, we'd have to hand out copies.
4247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    typedef GrTAllocator<UniformInfo> UniformInfoArray;
430eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel    typedef GrTAllocator<VaryingInfo> VaryingInfoArray;
4447bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
45d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt    GrGLProgramDataManager(GrGLGpu*, GrGLuint programID, const UniformInfoArray&,
460eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel                           const VaryingInfoArray&);
47dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
48b800248c73c75b02ab808c5bdb53e19e6abc3adcegdaniel
49101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon    void setSamplers(const UniformInfoArray& samplers) const;
50f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    void setImageStorages(const UniformInfoArray &images) const;
5109aa1fce69b214714171db12c341aebd78dd29eaegdaniel
5209aa1fce69b214714171db12c341aebd78dd29eaegdaniel    /** Functions for uploading uniform values. The varities ending in v can be used to upload to an
5309aa1fce69b214714171db12c341aebd78dd29eaegdaniel    *  array of uniforms. arrayCount must be <= the array count of the uniform.
5409aa1fce69b214714171db12c341aebd78dd29eaegdaniel    */
55497e9e2b3668fd8bc7fab16326e93c5cc6f0c287fmenozzi    void set1i(UniformHandle, int32_t) const override;
5635a98c733fb69ab72623cfd62ee2ac9859b0c613fmenozzi    void set1iv(UniformHandle, int arrayCount, const int v[]) const override;
57018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void set1f(UniformHandle, float v0) const override;
58018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void set1fv(UniformHandle, int arrayCount, const float v[]) const override;
59018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void set2f(UniformHandle, float, float) const override;
60018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void set2fv(UniformHandle, int arrayCount, const float v[]) const override;
61018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void set3f(UniformHandle, float, float, float) const override;
62018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void set3fv(UniformHandle, int arrayCount, const float v[]) const override;
63018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void set4f(UniformHandle, float, float, float, float) const override;
64018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void set4fv(UniformHandle, int arrayCount, const float v[]) const override;
65dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    // matrices are column-major, the first three upload a single matrix, the latter three upload
66dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    // arrayCount matrices into a uniform array.
678d988b3a73a75e062bc139f19cc6966888c722e2cdalton    void setMatrix2f(UniformHandle, const float matrix[]) const override;
68018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void setMatrix3f(UniformHandle, const float matrix[]) const override;
69018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void setMatrix4f(UniformHandle, const float matrix[]) const override;
708d988b3a73a75e062bc139f19cc6966888c722e2cdalton    void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
71018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override;
72018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override;
73dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
74d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt    // for nvpr only
750eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel    void setPathFragmentInputTransform(VaryingHandle u, int components,
76018fb62d12d1febf121fe265da5b6117b86a6541egdaniel                                       const SkMatrix& matrix) const override;
77d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt
78dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.comprivate:
79dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    enum {
80dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        kUnusedUniform = -1,
81dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    };
82dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
83dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    struct Uniform {
84101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon        GrGLint     fLocation;
85101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon#ifdef SK_DEBUG
86101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon        GrSLType    fType;
87101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon        int         fArrayCount;
88101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon#endif
89dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    };
90dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
91d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt    enum {
920eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel        kUnusedPathProcVarying = -1,
93d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt    };
940eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel    struct PathProcVarying {
95d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt        GrGLint     fLocation;
96d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt        SkDEBUGCODE(
97d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt            GrSLType    fType;
98d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt            int         fArrayCount;
99d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt        );
100d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt    };
101d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt
1028d988b3a73a75e062bc139f19cc6966888c722e2cdalton    template<int N> inline void setMatrices(UniformHandle, int arrayCount,
1038d988b3a73a75e062bc139f19cc6966888c722e2cdalton                                            const float matrices[]) const;
1048d988b3a73a75e062bc139f19cc6966888c722e2cdalton
105dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    SkTArray<Uniform, true> fUniforms;
1060eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel    SkTArray<PathProcVarying, true> fPathProcVaryings;
107861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon    GrGLGpu* fGpu;
108d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt    GrGLuint fProgramID;
1096eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org
110018fb62d12d1febf121fe265da5b6117b86a6541egdaniel    typedef GrGLSLProgramDataManager INHERITED;
111dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com};
11278cff136a4b59045e82965cbc9a63bf76a595796kkinnunen
113dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com#endif
114