GrGLProgram.h revision 30ba436f04e61d4505fb854d5fc56079636e0788
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED
10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED
11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1230ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "builders/GrGLProgramBuilder.h"
13d8f856c32b679d9f5a9926feac005e2c0186f83ftomhudson@google.com#include "GrDrawState.h"
146177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.com#include "GrGLContext.h"
1531ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com#include "GrGLProgramDesc.h"
16086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com#include "GrGLSL.h"
17890e3b58e78c0825820f75f1f0c5a5d71e855aa6bsalomon@google.com#include "GrGLTexture.h"
187510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen#include "GrGLProgramDataManager.h"
19f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
20f0a104e6f16dc095286d32f1e104894ae0b2b19fbsalomon@google.com#include "SkString.h"
2197c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
2297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
23d698f77c13d97c61109b861eac4d25b14a5de935bsalomon@google.comclass GrGLEffect;
243390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgclass GrGLProgramEffects;
2530ba436f04e61d4505fb854d5fc56079636e0788joshualittclass GrGLProgramBuilder;
26f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
27f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/**
28f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information.
29f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant
30f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations
31f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location
32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it
33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the
34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change.
35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
36a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.orgclass GrGLProgram : public SkRefCnt {
37f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic:
389ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    SK_DECLARE_INST_COUNT(GrGLProgram)
394fa6694c587b3830932429766c99d08c8dd9b723bsalomon@google.com
4030ba436f04e61d4505fb854d5fc56079636e0788joshualitt    typedef GrGLProgramBuilder::BuiltinUniformHandles BuiltinUniformHandles;
41dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen
429188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org    static GrGLProgram* Create(GrGpuGL* gpu,
4331ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com                               const GrGLProgramDesc& desc,
442c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                               const GrEffectStage* colorStages[],
452c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                               const GrEffectStage* coverageStages[]);
46ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
479ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    virtual ~GrGLProgram();
48f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
4934cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    /**
5034cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     * Call to abandon GL objects owned by this program.
5134cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     */
52ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    void abandon();
53ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
54f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
552db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com     * The shader may modify the blend coefficients. Params are in/out.
56f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
57ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const;
58f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
5931ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com    const GrGLProgramDesc& getDesc() { return fDesc; }
609ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
61271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    /**
626a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * Gets the GL program ID for this program.
636a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     */
64dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    GrGLuint programID() const { return fProgramID; }
656a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
66dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    bool hasVertexShader() const { return fHasVertexShader; }
676b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org
686a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    /**
69054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com     * Some GL state that is relevant to programs is not stored per-program. In particular color
7005a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com     * and coverage attributes can be global state. This struct is read and updated by
7105a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com     * GrGLProgram::setColor and GrGLProgram::setCoverage to allow us to avoid setting this state
72054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com     * redundantly.
7391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com     */
7491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    struct SharedGLState {
7591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        GrColor fConstAttribColor;
76054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        int     fConstAttribColorIndex;
7791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        GrColor fConstAttribCoverage;
78054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        int     fConstAttribCoverageIndex;
7991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
8091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        SharedGLState() { this->invalidate(); }
8191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        void invalidate() {
8291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com            fConstAttribColor = GrColor_ILLEGAL;
83054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com            fConstAttribColorIndex = -1;
8491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com            fConstAttribCoverage = GrColor_ILLEGAL;
85054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com            fConstAttribCoverageIndex = -1;
8691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        }
8791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    };
8891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
8991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    /**
906a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * The GrDrawState's view matrix along with the aspects of the render target determine the
916a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * matrix sent to GL. The size of the render target affects the GL matrix because we must
926a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * convert from Skia device coords to GL's normalized coords. Also the origin of the render
936a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * target may require us to perform a mirror-flip.
946a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     */
956a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    struct MatrixState {
966a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        SkMatrix        fViewMatrix;
976a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        SkISize         fRenderTargetSize;
986a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        GrSurfaceOrigin fRenderTargetOrigin;
996a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
1006a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        MatrixState() { this->invalidate(); }
1016a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        void invalidate() {
1026a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com            fViewMatrix = SkMatrix::InvalidMatrix();
10345a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com            fRenderTargetSize.fWidth = -1;
10445a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com            fRenderTargetSize.fHeight = -1;
1056a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com            fRenderTargetOrigin = (GrSurfaceOrigin) -1;
1066a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        }
10747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org
10847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        /**
10947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * Gets a matrix that goes from local coords to Skia's device coordinates.
11047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         */
111215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        template<int Size> void getGLMatrix(GrGLfloat* destMatrix) {
11247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            GrGLGetMatrix<Size>(destMatrix, fViewMatrix);
11347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        }
11447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org
11547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        /**
11647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * Gets a matrix that goes from local coordinates to GL normalized device coords.
11747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         */
11847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        template<int Size> void getRTAdjustedGLMatrix(GrGLfloat* destMatrix) {
119215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            SkMatrix combined;
120215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
121215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1,
122215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                                0, -SkIntToScalar(2) / fRenderTargetSize.fHeight, SK_Scalar1,
12347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                                0, 0, 1);
124215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            } else {
125215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1,
126215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                                0, SkIntToScalar(2) / fRenderTargetSize.fHeight, -SK_Scalar1,
12747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                                0, 0, 1);
128215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            }
129b930cc3dcb0645a8ce0689c5feb9c0defda57f28commit-bot@chromium.org            combined.preConcat(fViewMatrix);
130215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            GrGLGetMatrix<Size>(destMatrix, combined);
131215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        }
13247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org
13347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        /**
13447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * Gets a vec4 that adjusts the position from Skia device coords to GL's normalized device
13547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * coords. Assuming the transformed position, pos, is a homogeneous vec3, the vec, v, is
13647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * applied as such:
13747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * pos.x = dot(v.xy, pos.xz)
13847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * pos.y = dot(v.zq, pos.yz)
13947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         */
14047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        void getRTAdjustmentVec(GrGLfloat* destVec) {
14147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            destVec[0] = 2.f / fRenderTargetSize.fWidth;
14247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            destVec[1] = -1.f;
14347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
14447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                destVec[2] = -2.f / fRenderTargetSize.fHeight;
14547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                destVec[3] = 1.f;
14647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            } else {
14747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                destVec[2] = 2.f / fRenderTargetSize.fHeight;
14847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                destVec[3] = -1.f;
14947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            }
15047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        }
1516a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    };
1526a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
1536a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    /**
15434cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     * This function uploads uniforms and calls each GrGLEffect's setData. It is called before a
15534cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     * draw occurs using the program after the program has already been bound. It also uses the
1562c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com     * GrGpuGL object to bind the textures required by the GrGLEffects. The color and coverage
1572c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com     * stages come from GrGLProgramDesc::Build().
1584285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com     */
1599188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org    void setData(GrDrawState::BlendOptFlags,
1602c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                 const GrEffectStage* colorStages[],
1612c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                 const GrEffectStage* coverageStages[],
16226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com                 const GrDeviceCoordTexture* dstCopy, // can be NULL
16326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com                 SharedGLState*);
1649196130af83782fcac4334117142475a837dd74dbsalomon@google.com
1652a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.comprivate:
1667510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen    typedef GrGLProgramDataManager::UniformHandle UniformHandle;
167dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
168a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    GrGLProgram(GrGpuGL*,
169a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org                const GrGLProgramDesc&,
17030ba436f04e61d4505fb854d5fc56079636e0788joshualitt                const GrGLProgramBuilder&);
1712c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
172a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    // Sets the texture units for samplers.
1732c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void initSamplerUniforms();
1742c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1752c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Helper for setData(). Makes GL calls to specify the initial color when there is not
1762c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // per-vertex colors.
1772c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void setColor(const GrDrawState&, GrColor color, SharedGLState*);
1782c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1792c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Helper for setData(). Makes GL calls to specify the initial coverage when there is not
1802c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // per-vertex coverages.
1812c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void setCoverage(const GrDrawState&, GrColor coverage, SharedGLState*);
1822c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1832c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Helper for setData() that sets the view matrix and loads the render target height uniform
1842c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void setMatrixAndRenderTargetHeight(const GrDrawState&);
1852c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
18634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    // these reflect the current values of uniforms (GL uniform values travel with program)
1876eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    MatrixState                         fMatrixState;
1886eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    GrColor                             fColor;
1896eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    GrColor                             fCoverage;
1906eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    int                                 fDstCopyTexUnit;
1916eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org
192dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    BuiltinUniformHandles               fBuiltinUniformHandles;
193dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    SkAutoTUnref<GrGLProgramEffects>    fColorEffects;
194dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    SkAutoTUnref<GrGLProgramEffects>    fCoverageEffects;
195dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    GrGLuint                            fProgramID;
196dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    bool                                fHasVertexShader;
197dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    int                                 fTexCoordSetCnt;
1989681eebb0e441cee25b6faac82c3728512acda27skia.committer@gmail.com
1996eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    GrGLProgramDesc                     fDesc;
2006eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    GrGpuGL*                            fGpu;
2016eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org
202dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    GrGLProgramDataManager              fProgramDataManager;
2036b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org
204a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org    typedef SkRefCnt INHERITED;
205f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com};
206f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
207f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif
208