GrGLProgram.h revision 410552a73d59611901033b2bc5147cc6ade0207c
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
12d8f856c32b679d9f5a9926feac005e2c0186f83ftomhudson@google.com#include "GrDrawState.h"
136177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.com#include "GrGLContext.h"
1431ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com#include "GrGLProgramDesc.h"
155a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org#include "GrGLShaderBuilder.h"
16086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com#include "GrGLSL.h"
17890e3b58e78c0825820f75f1f0c5a5d71e855aa6bsalomon@google.com#include "GrGLTexture.h"
18dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com#include "GrGLUniformManager.h"
19f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
20f0a104e6f16dc095286d32f1e104894ae0b2b19fbsalomon@google.com#include "SkString.h"
2197c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
2297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
23f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrBinHashKeyBuilder;
24d698f77c13d97c61109b861eac4d25b14a5de935bsalomon@google.comclass GrGLEffect;
25f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.comclass GrGLShaderBuilder;
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
409188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org    static GrGLProgram* Create(GrGpuGL* gpu,
4131ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com                               const GrGLProgramDesc& desc,
422c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                               const GrEffectStage* colorStages[],
432c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                               const GrEffectStage* coverageStages[]);
44ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
459ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    virtual ~GrGLProgram();
46f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
4734cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    /**
4834cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     * Call to abandon GL objects owned by this program.
4934cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     */
50ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    void abandon();
51ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
52f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
532db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com     * The shader may modify the blend coefficients. Params are in/out.
54f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
55ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const;
56f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
5731ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com    const GrGLProgramDesc& getDesc() { return fDesc; }
589ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
59271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    /**
606a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * Gets the GL program ID for this program.
616a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     */
626a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    GrGLuint programID() const { return fProgramID; }
636a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
646a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    /**
65054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com     * Some GL state that is relevant to programs is not stored per-program. In particular color
6605a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com     * and coverage attributes can be global state. This struct is read and updated by
6705a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com     * GrGLProgram::setColor and GrGLProgram::setCoverage to allow us to avoid setting this state
68054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com     * redundantly.
6991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com     */
7091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    struct SharedGLState {
7191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        GrColor fConstAttribColor;
72054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        int     fConstAttribColorIndex;
7391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        GrColor fConstAttribCoverage;
74054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        int     fConstAttribCoverageIndex;
7591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
7691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        SharedGLState() { this->invalidate(); }
7791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        void invalidate() {
7891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com            fConstAttribColor = GrColor_ILLEGAL;
79054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com            fConstAttribColorIndex = -1;
8091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com            fConstAttribCoverage = GrColor_ILLEGAL;
81054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com            fConstAttribCoverageIndex = -1;
8291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        }
8391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    };
8491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
8591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    /**
866a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * The GrDrawState's view matrix along with the aspects of the render target determine the
876a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * matrix sent to GL. The size of the render target affects the GL matrix because we must
886a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * convert from Skia device coords to GL's normalized coords. Also the origin of the render
896a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * target may require us to perform a mirror-flip.
906a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     */
916a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    struct MatrixState {
926a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        SkMatrix        fViewMatrix;
936a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        SkISize         fRenderTargetSize;
946a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        GrSurfaceOrigin fRenderTargetOrigin;
956a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
966a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        MatrixState() { this->invalidate(); }
976a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        void invalidate() {
986a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com            fViewMatrix = SkMatrix::InvalidMatrix();
9945a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com            fRenderTargetSize.fWidth = -1;
10045a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com            fRenderTargetSize.fHeight = -1;
1016a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com            fRenderTargetOrigin = (GrSurfaceOrigin) -1;
1026a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        }
103215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        template<int Size> void getGLMatrix(GrGLfloat* destMatrix) {
104215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            SkMatrix combined;
105215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
106215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1,
107215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                                0, -SkIntToScalar(2) / fRenderTargetSize.fHeight, SK_Scalar1,
108215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                                0, 0, SkMatrix::I()[8]);
109215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            } else {
110215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1,
111215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                                0, SkIntToScalar(2) / fRenderTargetSize.fHeight, -SK_Scalar1,
112215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                                0, 0, SkMatrix::I()[8]);
113215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            }
114215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            combined.setConcat(combined, fViewMatrix);
115215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            GrGLGetMatrix<Size>(destMatrix, combined);
116215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        }
1176a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    };
1186a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
1196a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    /**
12034cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     * This function uploads uniforms and calls each GrGLEffect's setData. It is called before a
12134cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     * draw occurs using the program after the program has already been bound. It also uses the
1222c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com     * GrGpuGL object to bind the textures required by the GrGLEffects. The color and coverage
1232c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com     * stages come from GrGLProgramDesc::Build().
1244285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com     */
1259188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org    void setData(GrDrawState::BlendOptFlags,
1262c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                 const GrEffectStage* colorStages[],
1272c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                 const GrEffectStage* coverageStages[],
12826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com                 const GrDeviceCoordTexture* dstCopy, // can be NULL
12926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com                 SharedGLState*);
1309196130af83782fcac4334117142475a837dd74dbsalomon@google.com
1312a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.comprivate:
132dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    typedef GrGLUniformManager::UniformHandle UniformHandle;
133dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
134804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com    // handles for uniforms (aside from per-effect samplers)
13534cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    struct UniformHandles {
13634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com        UniformHandle       fViewMatrixUni;
13734cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com        UniformHandle       fColorUni;
13834cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com        UniformHandle       fCoverageUni;
13934cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com        UniformHandle       fColorFilterUni;
14026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com
141706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com        // We use the render target height to provide a y-down frag coord when specifying
142706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com        // origin_upper_left is not supported.
14334cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com        UniformHandle       fRTHeightUni;
14426e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com
14526e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com        // Uniforms for computing texture coords to do the dst-copy lookup
14626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com        UniformHandle       fDstCopyTopLeftUni;
14726e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com        UniformHandle       fDstCopyScaleUni;
14826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com        UniformHandle       fDstCopySamplerUni;
149f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    };
150f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
151804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com    typedef SkSTArray<4, UniformHandle, true> SamplerUniSArray;
152804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com    typedef SkSTArray<4, int, true> TextureUnitSArray;
153804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com
154804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com    struct EffectAndSamplers {
155804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com        EffectAndSamplers() : fGLEffect(NULL) {}
156804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com        ~EffectAndSamplers() { delete fGLEffect; }
157804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com        GrGLEffect*         fGLEffect;
158804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com        SamplerUniSArray    fSamplerUnis;  // sampler uni handles for effect's GrTextureAccess
159804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com        TextureUnitSArray   fTextureUnits; // texture unit used for each entry of fSamplerUnis
160804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com    };
161804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com
1629188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org    GrGLProgram(GrGpuGL* gpu,
1632c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                const GrGLProgramDesc& desc,
1642c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                const GrEffectStage* colorStages[],
1652c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                const GrEffectStage* coverageStages[]);
1662c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1672c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    bool succeeded() const { return 0 != fProgramID; }
1682c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1692c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    /**
1702c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com     * This is the heavy initialization routine for building a GLProgram. colorStages and
1712c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com     * coverageStages correspond to the output of GrGLProgramDesc::Build().
1722c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com     */
1732c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    bool genProgram(const GrEffectStage* colorStages[], const GrEffectStage* coverageStages[]);
1742c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1752c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Sets the texture units for samplers
1762c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void initSamplerUniforms();
1772c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void initEffectSamplerUniforms(EffectAndSamplers* effect, int* texUnitIdx);
1782c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1792c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Helper for setData().
1809188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org    void setEffectData(const GrEffectStage& stage, const EffectAndSamplers& effect);
1812c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1822c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Helper for setData(). Makes GL calls to specify the initial color when there is not
1832c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // per-vertex colors.
1842c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void setColor(const GrDrawState&, GrColor color, SharedGLState*);
1852c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1862c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Helper for setData(). Makes GL calls to specify the initial coverage when there is not
1872c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // per-vertex coverages.
1882c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void setCoverage(const GrDrawState&, GrColor coverage, SharedGLState*);
1892c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
1902c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Helper for setData() that sets the view matrix and loads the render target height uniform
1912c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void setMatrixAndRenderTargetHeight(const GrDrawState&);
1922c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
193410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org    // GL program ID
19434cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    GrGLuint                    fProgramID;
1959ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
19634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    // these reflect the current values of uniforms (GL uniform values travel with program)
1976a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    MatrixState                 fMatrixState;
1989ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrColor                     fColor;
1999ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrColor                     fCoverage;
2009ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrColor                     fColorFilterColor;
201804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com    int                         fDstCopyTexUnit;
2029ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
2032c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    SkTArray<EffectAndSamplers> fColorEffects;
2042c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    SkTArray<EffectAndSamplers> fCoverageEffects;
2059ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
20631ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com    GrGLProgramDesc             fDesc;
2079188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org    GrGpuGL*                    fGpu;
2089ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
209dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    GrGLUniformManager          fUniformManager;
21034cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    UniformHandles              fUniformHandles;
211dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
212a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org    typedef SkRefCnt INHERITED;
213f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com};
214f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
215f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif
216