GrGLProgram.h revision a469c28c3c16214733a25201a286970f57b3d944
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"
1396399948dc2f1afd2e9d9e5be7d646c01d17f82bbsalomon@google.com#include "GrGLContextInfo.h"
14086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com#include "GrGLSL.h"
15890e3b58e78c0825820f75f1f0c5a5d71e855aa6bsalomon@google.com#include "GrGLTexture.h"
16dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com#include "GrGLUniformManager.h"
17f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
18f0a104e6f16dc095286d32f1e104894ae0b2b19fbsalomon@google.com#include "SkString.h"
1997c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
2097c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
21f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrBinHashKeyBuilder;
2207eecdca3e331eb4066c53a29305aeea6d692961tomhudson@google.comclass GrGLProgramStage;
23f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.comclass GrGLShaderBuilder;
24f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
25edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com// optionally compile the experimental GS code. Set to GR_DEBUG
26edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com// so that debug build bots will execute the code.
27edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com#define GR_GL_EXPERIMENTAL_GS GR_DEBUG
28edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com
29f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/**
30f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information.
31f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant
32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations
33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location
34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it
35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the
36f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change.
37f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
389ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.comclass GrGLProgram : public GrRefCnt {
39f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic:
409ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    SK_DECLARE_INST_COUNT(GrGLProgram)
414fa6694c587b3830932429766c99d08c8dd9b723bsalomon@google.com
429ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    struct Desc;
43f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
44ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    static GrGLProgram* Create(const GrGLContextInfo& gl,
45ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com                               const Desc& desc,
46a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com                               const GrEffect** customStages);
47ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
489ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    virtual ~GrGLProgram();
49f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
50ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    /** Call to abandon GL objects owned by this program */
51ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    void abandon();
52ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
53f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
544285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com     * The shader may modify the blend coefficients. Params are in/out
55f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
56ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const;
57f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
58ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    const Desc& getDesc() { return fDesc; }
599ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
60271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    /**
6128f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com     * Attribute indices. These should not overlap.
62271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com     */
639196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int PositionAttributeIdx() { return 0; }
6428f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com    static int ColorAttributeIdx() { return 1; }
6528f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com    static int CoverageAttributeIdx() { return 2; }
6628f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com    static int EdgeAttributeIdx() { return 3; }
6728f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com    static int TexCoordAttributeIdx(int tcIdx) { return 4 + tcIdx; }
68aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
694285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com    /**
70a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com     * This function uploads uniforms and calls each GrEffect's setData. It is called before a draw
71a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com     * occurs using the program after the program has already been bound.
724285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com     */
73706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com    void setData(const GrDrawState& drawState);
749196130af83782fcac4334117142475a837dd74dbsalomon@google.com
750d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com    // Parameters that affect code generation
760d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com    // These structs should be kept compact; they are the input to an
770d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com    // expensive hash key generator.
789ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    struct Desc {
799ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com        Desc() {
804285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com            // since we use this as part of a key we can't have any uninitialized
814be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            // padding
829ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com            memset(this, 0, sizeof(Desc));
839ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com        }
849ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
859ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com        // returns this as a uint32_t array to be used as a key in the program cache
869ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com        const uint32_t* asKey() const {
879ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com            return reinterpret_cast<const uint32_t*>(this);
884be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        }
894be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com
900d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        struct StageDesc {
910d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            enum OptFlagBits {
920d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kNoPerspective_OptFlagBit       = 1 << 0,
930d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kIdentityMatrix_OptFlagBit      = 1 << 1,
940d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kIsEnabled_OptFlagBit           = 1 << 7
950d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            };
96b505a128efae9debcaa9642bade90bab5525d477bsalomon@google.com
970d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            uint8_t fOptFlags;
980d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com
9907eecdca3e331eb4066c53a29305aeea6d692961tomhudson@google.com            /** Non-zero if user-supplied code will write the stage's
10007eecdca3e331eb4066c53a29305aeea6d692961tomhudson@google.com                contribution to the fragment shader. */
101a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com            GrProgramStageFactory::StageKey fCustomStageKey;
10207eecdca3e331eb4066c53a29305aeea6d692961tomhudson@google.com
1030d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            inline bool isEnabled() const {
104c2c9b97e603fbccf04d29a550bf73709340ffe7dbsalomon@google.com                return SkToBool(fOptFlags & kIsEnabled_OptFlagBit);
1050d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            }
1060d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            inline void setEnabled(bool newValue) {
1070d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                if (newValue) {
1080d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                    fOptFlags |= kIsEnabled_OptFlagBit;
1090d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                } else {
1100d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                    fOptFlags &= ~kIsEnabled_OptFlagBit;
1110d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                }
1120d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            }
1130d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        };
1140d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com
1154285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com        // Specifies where the initial color comes from before the stages are applied.
11685b505bedc35369283ca3aa4449962622842b720bsalomon@google.com        enum ColorInput {
11785b505bedc35369283ca3aa4449962622842b720bsalomon@google.com            kSolidWhite_ColorInput,
11885b505bedc35369283ca3aa4449962622842b720bsalomon@google.com            kTransBlack_ColorInput,
11985b505bedc35369283ca3aa4449962622842b720bsalomon@google.com            kAttribute_ColorInput,
12085b505bedc35369283ca3aa4449962622842b720bsalomon@google.com            kUniform_ColorInput,
12186c1f71625970610e768d3bf26c933db2cd685babsalomon@google.com
12285b505bedc35369283ca3aa4449962622842b720bsalomon@google.com            kColorInputCnt
1230d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        };
1240d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        // Dual-src blending makes use of a secondary output color that can be
1254285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com        // used as a per-pixel blend coefficient. This controls whether a
126271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // secondary source is output and what value it holds.
127271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        enum DualSrcOutput {
128271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kNone_DualSrcOutput,
129271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kCoverage_DualSrcOutput,
130271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kCoverageISA_DualSrcOutput,
131271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kCoverageISC_DualSrcOutput,
1321e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com
133271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kDualSrcOutputCnt
1340d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        };
135f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1369381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com        GrDrawState::VertexEdgeType fVertexEdgeType;
137aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
1384285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com        // stripped of bits that don't affect program generation
1390d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        GrVertexLayout fVertexLayout;
14097c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
1419381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com        StageDesc fStages[GrDrawState::kNumStages];
142f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
143edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com        // To enable experimental geometry shader code (not for use in
144edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com        // production)
145edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com#if GR_GL_EXPERIMENTAL_GS
146edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com        bool fExperimentalGS;
147edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com#endif
148edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com
14985b505bedc35369283ca3aa4449962622842b720bsalomon@google.com        uint8_t fColorInput;        // casts to enum ColorInput
1502401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com        uint8_t fCoverageInput;     // casts to enum CoverageInput
15185b505bedc35369283ca3aa4449962622842b720bsalomon@google.com        uint8_t fDualSrcOutput;     // casts to enum DualSrcOutput
1520d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        int8_t fFirstCoverageStage;
1530d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        SkBool8 fEmitsPointSize;
154f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1550d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        uint8_t fColorFilterXfermode;  // casts to enum SkXfermode::Mode
1569ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    };
1579ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GR_STATIC_ASSERT(!(sizeof(Desc) % 4));
158f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
15922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    // for code readability
1609ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    typedef Desc::StageDesc StageDesc;
16122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
1622a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.comprivate:
163f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com    struct StageUniforms;
164f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com
165ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    GrGLProgram(const GrGLContextInfo& gl,
166ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com                const Desc& desc,
167a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com                const GrEffect** customStages);
168ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
169ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    bool succeeded() const { return 0 != fProgramID; }
170ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
171ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    /**
1724285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com     *  This is the heavy initialization routine for building a GLProgram.
173ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com     */
174a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com    bool genProgram(const GrEffect** customStages);
175ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
1769ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    void genInputColor(GrGLShaderBuilder* builder, SkString* inColor);
1772a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.com
178a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com    static GrGLProgramStage* GenStageCode(const GrEffect* stage,
179f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com                                          const StageDesc& desc, // TODO: Eliminate this
180f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com                                          StageUniforms* stageUniforms, // TODO: Eliminate this
181f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com                                          const char* fsInColor, // NULL means no incoming color
182f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com                                          const char* fsOutColor,
183f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com                                          const char* vsInCoord,
184f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com                                          GrGLShaderBuilder* builder);
1852a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.com
186ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    void genGeometryShader(GrGLShaderBuilder* segments) const;
1879ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
188dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    typedef GrGLUniformManager::UniformHandle UniformHandle;
189dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
1909ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    void genUniformCoverage(GrGLShaderBuilder* segments, SkString* inOutCoverage);
1919ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
192d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    // generates code to compute coverage based on edge AA. Returns true if edge coverage was
193d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    // inserted in which case coverageVar will be updated to refer to a scalar. Otherwise,
194d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    // coverageVar is set to an empty string.
195d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    bool genEdgeCoverage(SkString* coverageVar, GrGLShaderBuilder* builder) const;
1969ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
1979ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    // Creates a GL program ID, binds shader attributes to GL vertex attrs, and links the program
198ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    bool bindOutputsAttribsAndLinkProgram(SkString texCoordAttrNames[GrDrawState::kMaxTexCoords],
1999ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com                                          bool bindColorOut,
2009ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com                                          bool bindDualSrcOut);
2019ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
202dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    // Sets the texture units for samplers
203dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    void initSamplerUniforms();
2049ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
205ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    bool compileShaders(const GrGLShaderBuilder& builder);
2069ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
2079ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    const char* adjustInColor(const SkString& inColor) const;
2089196130af83782fcac4334117142475a837dd74dbsalomon@google.com
209dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    struct StageUniforms {
210dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        UniformHandle fTextureMatrixUni;
2110982d35187da7e1ed6c0eba5951bbdadca8b33e7bsalomon@google.com        SkTArray<UniformHandle, true> fSamplerUniforms;
212dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        StageUniforms() {
213dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com            fTextureMatrixUni = GrGLUniformManager::kInvalidUniformHandle;
2149196130af83782fcac4334117142475a837dd74dbsalomon@google.com        }
215f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    };
216f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
217dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    struct Uniforms {
218dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        UniformHandle fViewMatrixUni;
219dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        UniformHandle fColorUni;
220dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        UniformHandle fCoverageUni;
221dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        UniformHandle fColorFilterUni;
222706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com        // We use the render target height to provide a y-down frag coord when specifying
223706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com        // origin_upper_left is not supported.
224706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com        UniformHandle fRTHeight;
225dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        StageUniforms fStages[GrDrawState::kNumStages];
226dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com        Uniforms() {
227dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com            fViewMatrixUni = GrGLUniformManager::kInvalidUniformHandle;
228dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com            fColorUni = GrGLUniformManager::kInvalidUniformHandle;
229dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com            fCoverageUni = GrGLUniformManager::kInvalidUniformHandle;
230dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com            fColorFilterUni = GrGLUniformManager::kInvalidUniformHandle;
231706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com            fRTHeight = GrGLUniformManager::kInvalidUniformHandle;
2329196130af83782fcac4334117142475a837dd74dbsalomon@google.com        }
233f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    };
234f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
2359ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    // IDs
2369ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrGLuint    fVShaderID;
2379ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrGLuint    fGShaderID;
2389ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrGLuint    fFShaderID;
2399ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrGLuint    fProgramID;
2409ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
2419ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    // The matrix sent to GL is determined by both the client's matrix and
2429ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    // the size of the viewport.
2439ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrMatrix  fViewMatrix;
2449ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    SkISize   fViewportSize;
2459ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
2469ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    // these reflect the current values of uniforms
2479ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    // (GL uniform values travel with program)
2489ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrColor                     fColor;
2499ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrColor                     fCoverage;
2509ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrColor                     fColorFilterColor;
251706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com    int                         fRTHeight;
2522f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com    /// When it is sent to GL, the texture matrix will be flipped if the texture orientation
2532f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com    /// (below) requires.
2549ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrMatrix                    fTextureMatrices[GrDrawState::kNumStages];
2559ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrGLTexture::Orientation    fTextureOrientation[GrDrawState::kNumStages];
2569ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
2579ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    GrGLProgramStage*           fProgramStage[GrDrawState::kNumStages];
2589ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
2599ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    Desc fDesc;
260ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    const GrGLContextInfo&      fContextInfo;
2619ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
262dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    GrGLUniformManager          fUniformManager;
263dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com    Uniforms                    fUniforms;
264dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
2659ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    friend class GrGpuGL; // TODO: remove this by adding getters and moving functionality.
2669ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
2679ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    typedef GrRefCnt INHERITED;
268f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com};
269f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
270f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif
271