GrGLProgram.h revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
1f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
8f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED
11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED
12f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
13f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#include "GrGLInterface.h"
149196130af83782fcac4334117142475a837dd74dbsalomon@google.com#include "GrStringBuilder.h"
15271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "GrGpu.h"
16f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1797c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
1897c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
19f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrBinHashKeyBuilder;
20d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com
21d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.comstruct ShaderCodeSegments {
22271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    GrStringBuilder fHeader; // VS+FS, GLSL version, etc
23d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com    GrStringBuilder fVSUnis;
24d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com    GrStringBuilder fVSAttrs;
25d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com    GrStringBuilder fVaryings;
26d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com    GrStringBuilder fFSUnis;
27271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    GrStringBuilder fFSOutputs;
28129b8e3237b80b9d258a8f48e8f54c0073cafbdcsenorblanco@chromium.org    GrStringBuilder fFSFunctions;
29d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com    GrStringBuilder fVSCode;
30d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com    GrStringBuilder fFSCode;
31d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com};
32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/**
34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information.
35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant
36f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations
37f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location
38f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it
39f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the
40f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change.
41f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
42f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrGLProgram {
43f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic:
44f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    class CachedData;
45f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
46f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    GrGLProgram();
47f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    ~GrGLProgram();
48f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
49f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
50f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  Streams data that can uniquely identifies the generated
51f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  gpu program into a key, for cache indexing purposes.
52f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *
53f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  @param key The key object to receive the key data
54f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
55f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    void buildKey(GrBinHashKeyBuilder& key) const;
56f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
57f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
58f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  This is the heavy initilization routine for building a GLProgram.
59f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  The result of heavy init is not stored in datamembers of GrGLProgam,
60f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  but in a separate cacheable container.
61f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
629196130af83782fcac4334117142475a837dd74dbsalomon@google.com    bool genProgram(CachedData* programData) const;
63f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
64271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com     /**
65271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com      * The shader may modify the blend coeffecients. Params are in/out
66271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com      */
67271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com     void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const;
68271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
69271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    /**
70271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com     * Attribute indices
71271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com     */
729196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int PositionAttributeIdx() { return 0; }
739196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int TexCoordAttributeIdx(int tcIdx) { return 1 + tcIdx; }
749196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int ColorAttributeIdx() { return 1 + GrDrawTarget::kMaxTexCoords; }
750d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com    static int ViewMatrixAttributeIdx() {
760d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        return 2 + GrDrawTarget::kMaxTexCoords;
779196130af83782fcac4334117142475a837dd74dbsalomon@google.com    }
780d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com    static int TextureMatrixAttributeIdx(int stage) {
790d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        return 5 + GrDrawTarget::kMaxTexCoords + 3 * stage;
809196130af83782fcac4334117142475a837dd74dbsalomon@google.com    }
819196130af83782fcac4334117142475a837dd74dbsalomon@google.com
82f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comprivate:
83f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
840d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com    // Parameters that affect code generation
850d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com    // These structs should be kept compact; they are the input to an
860d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com    // expensive hash key generator.
87f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    struct ProgramDesc {
884be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        ProgramDesc() {
894be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            // since we use this as part of a key we can't have any unitialized
904be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            // padding
914be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            memset(this, 0, sizeof(ProgramDesc));
924be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        }
934be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com
940d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        struct StageDesc {
950d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            enum OptFlagBits {
960d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kNoPerspective_OptFlagBit       = 1 << 0,
970d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kIdentityMatrix_OptFlagBit      = 1 << 1,
980d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kCustomTextureDomain_OptFlagBit = 1 << 2,
990d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kIsEnabled_OptFlagBit           = 1 << 7
1000d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            };
1010d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            enum Modulation {
1020d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kColor_Modulation,
1031e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com                kAlpha_Modulation,
1041e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com
1051e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com                kModulationCnt
1060d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            };
1070d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            enum FetchMode {
1080d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kSingle_FetchMode,
1091e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com                k2x2_FetchMode,
110027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org                kConvolution_FetchMode,
1111e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com
1121e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com                kFetchModeCnt,
1130d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            };
1140d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            enum CoordMapping {
1150d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kIdentity_CoordMapping,
1160d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kRadialGradient_CoordMapping,
1170d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                kSweepGradient_CoordMapping,
1181e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com                kRadial2Gradient_CoordMapping,
11922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com                // need different shader computation when quadratic
12022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com                // eq describing the gradient degenerates to a linear eq.
12122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com                kRadial2GradientDegenerate_CoordMapping,
1221e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com                kCoordMappingCnt
1230d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            };
124f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1250d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            uint8_t fOptFlags;
1260d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            uint8_t fModulation;  // casts to enum Modulation
1270d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            uint8_t fFetchMode;  // casts to enum FetchMode
1280d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            uint8_t fCoordMapping;  // casts to enum CoordMapping
129027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org            uint8_t fKernelWidth;
1300d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com
1310d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            inline bool isEnabled() const {
1320d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                return fOptFlags & kIsEnabled_OptFlagBit;
1330d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            }
1340d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            inline void setEnabled(bool newValue) {
1350d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                if (newValue) {
1360d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                    fOptFlags |= kIsEnabled_OptFlagBit;
1370d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                } else {
1380d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                    fOptFlags &= ~kIsEnabled_OptFlagBit;
1390d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com                }
1400d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com            }
1410d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        };
1420d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com
1430d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        enum ColorType {
1444be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            kNone_ColorType         = 0,
1454be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            kAttribute_ColorType    = 1,
1464be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            kUniform_ColorType      = 2,
1470d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        };
1480d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        // Dual-src blending makes use of a secondary output color that can be
149271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // used as a per-pixel blend coeffecient. This controls whether a
150271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // secondary source is output and what value it holds.
151271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        enum DualSrcOutput {
152271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kNone_DualSrcOutput,
153271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kCoverage_DualSrcOutput,
154271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kCoverageISA_DualSrcOutput,
155271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kCoverageISC_DualSrcOutput,
1561e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com
157271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            kDualSrcOutputCnt
1580d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        };
159f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1600d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        // stripped of bits that don't affect prog generation
1610d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        GrVertexLayout fVertexLayout;
16297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
1630d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        StageDesc fStages[GrDrawTarget::kNumStages];
164f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1650d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        uint8_t fColorType;  // casts to enum ColorType
1660d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        uint8_t fDualSrcOutput;  // casts to enum DualSrcOutput
1670d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        int8_t fFirstCoverageStage;
1680d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        SkBool8 fEmitsPointSize;
169129b8e3237b80b9d258a8f48e8f54c0073cafbdcsenorblanco@chromium.org        SkBool8 fEdgeAAConcave;
170f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1710d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        int8_t fEdgeAANumEdges;
1720d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com        uint8_t fColorFilterXfermode;  // casts to enum SkXfermode::Mode
1736aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com
174129b8e3237b80b9d258a8f48e8f54c0073cafbdcsenorblanco@chromium.org        uint8_t fPadTo32bLengthMultiple [1];
175f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
176f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    } fProgramDesc;
177f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1784be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com    const ProgramDesc& getDesc() { return fProgramDesc; }
1794be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com
18022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    // for code readability
18122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    typedef ProgramDesc::StageDesc StageDesc;
18222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
183f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic:
1849196130af83782fcac4334117142475a837dd74dbsalomon@google.com    enum {
1859196130af83782fcac4334117142475a837dd74dbsalomon@google.com        kUnusedUniform = -1,
1869196130af83782fcac4334117142475a837dd74dbsalomon@google.com        kSetAsAttribute = 1000,
1879196130af83782fcac4334117142475a837dd74dbsalomon@google.com    };
1889196130af83782fcac4334117142475a837dd74dbsalomon@google.com
189f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    struct StageUniLocations {
190f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint fTextureMatrixUni;
1916aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com        GrGLint fNormalizedTexelSizeUni;
192f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint fSamplerUni;
193f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint fRadial2Uni;
1946acc9b3d2b26d11d3da5eb81775d67a0410d1ae7junov@google.com        GrGLint fTexDomUni;
195027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org        GrGLint fKernelUni;
196027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org        GrGLint fImageIncrementUni;
1979196130af83782fcac4334117142475a837dd74dbsalomon@google.com        void reset() {
1989196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fTextureMatrixUni = kUnusedUniform;
1999196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fNormalizedTexelSizeUni = kUnusedUniform;
2009196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fSamplerUni = kUnusedUniform;
2019196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fRadial2Uni = kUnusedUniform;
2026acc9b3d2b26d11d3da5eb81775d67a0410d1ae7junov@google.com            fTexDomUni = kUnusedUniform;
203027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org            fKernelUni = kUnusedUniform;
204027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org            fImageIncrementUni = kUnusedUniform;
2059196130af83782fcac4334117142475a837dd74dbsalomon@google.com        }
206f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    };
207f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
208f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    struct UniLocations {
209f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint fViewMatrixUni;
2104be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        GrGLint fColorUni;
21192e0f222fb311a296acd081c1216d6b9652347ebsenorblanco@chromium.org        GrGLint fEdgesUni;
21297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo        GrGLint fColorFilterUni;
213f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        StageUniLocations fStages[GrDrawTarget::kNumStages];
2149196130af83782fcac4334117142475a837dd74dbsalomon@google.com        void reset() {
2159196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fViewMatrixUni = kUnusedUniform;
2169196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fColorUni = kUnusedUniform;
21792e0f222fb311a296acd081c1216d6b9652347ebsenorblanco@chromium.org            fEdgesUni = kUnusedUniform;
21897c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo            fColorFilterUni = kUnusedUniform;
2199196130af83782fcac4334117142475a837dd74dbsalomon@google.com            for (int s = 0; s < GrDrawTarget::kNumStages; ++s) {
2209196130af83782fcac4334117142475a837dd74dbsalomon@google.com                fStages[s].reset();
2219196130af83782fcac4334117142475a837dd74dbsalomon@google.com            }
2229196130af83782fcac4334117142475a837dd74dbsalomon@google.com        }
223f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    };
224f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
225f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    class CachedData : public ::GrNoncopyable {
226f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    public:
227f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        CachedData() {
228f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        }
229f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
230f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        ~CachedData() {
231f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        }
232f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
233f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        void copyAndTakeOwnership(CachedData& other) {
2342d9ddf9df12b900b7dbe9b9c627757595f8ed289bsalomon@google.com            memcpy(this, &other, sizeof(*this));
235f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        }
236f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
237f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    public:
238f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
239f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        // IDs
240f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLuint    fVShaderID;
241f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLuint    fFShaderID;
242f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLuint    fProgramID;
243f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        // shader uniform locations (-1 if shader doesn't use them)
244f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        UniLocations fUniLocations;
245f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
246f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrMatrix  fViewMatrix;
247f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
248f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        // these reflect the current values of uniforms
249f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        // (GL uniform values travel with program)
2504be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        GrColor                     fColor;
25197c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo        GrColor                     fColorFilterColor;
252f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrMatrix                    fTextureMatrices[GrDrawTarget::kNumStages];
2536aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com        // width and height used for normalized texel size
2546aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com        int                         fTextureWidth[GrDrawTarget::kNumStages];
2556aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com        int                         fTextureHeight[GrDrawTarget::kNumStages];
256f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrScalar                    fRadial2CenterX1[GrDrawTarget::kNumStages];
257f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrScalar                    fRadial2Radius0[GrDrawTarget::kNumStages];
258f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        bool                        fRadial2PosRoot[GrDrawTarget::kNumStages];
2592f83940c4db5d17dcb4fd7df24d8002022730a85junov@google.com        GrRect                      fTextureDomain[GrDrawTarget::kNumStages];
260f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
261f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    private:
262f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        enum Constants {
263f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            kUniLocationPreAllocSize = 8
264f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        };
265f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
266f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    }; // CachedData
267f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
268f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comprivate:
2699196130af83782fcac4334117142475a837dd74dbsalomon@google.com    enum {
2709196130af83782fcac4334117142475a837dd74dbsalomon@google.com        kUseUniform = 2000
2719196130af83782fcac4334117142475a837dd74dbsalomon@google.com    };
2729196130af83782fcac4334117142475a837dd74dbsalomon@google.com
2739196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // should set all fields in locations var to kUseUniform if the
2749196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // corresponding uniform is required for the program.
275f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    void genStageCode(int stageNum,
276f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      const ProgramDesc::StageDesc& desc,
277f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      const char* fsInColor, // NULL means no incoming color
278f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      const char* fsOutColor,
279f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      const char* vsInCoord,
280f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      ShaderCodeSegments* segments,
281f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      StageUniLocations* locations) const;
282f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
2839196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static bool CompileFSAndVS(const ShaderCodeSegments& segments,
2849196130af83782fcac4334117142475a837dd74dbsalomon@google.com                               CachedData* programData);
2859196130af83782fcac4334117142475a837dd74dbsalomon@google.com
286f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    // Compiles a GL shader, returns shader ID or 0 if failed
287f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    // params have same meaning as glShaderSource
288f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    static GrGLuint CompileShader(GrGLenum type, int stringCnt,
289f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                                  const char** strings,
290f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                                  int* stringLengths);
291f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
2929196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // Creates a GL program ID, binds shader attributes to GL vertex attrs, and
2939196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // links the program
294271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    bool bindOutputsAttribsAndLinkProgram(
295271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                GrStringBuilder texCoordAttrNames[GrDrawTarget::kMaxTexCoords],
296271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                bool bindColorOut,
297271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                bool bindDualSrcOut,
298271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                CachedData* programData) const;
2999196130af83782fcac4334117142475a837dd74dbsalomon@google.com
3009196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // Gets locations for all uniforms set to kUseUniform and initializes cache
3019196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // to invalid values.
3029196130af83782fcac4334117142475a837dd74dbsalomon@google.com    void getUniformLocationsAndInitCache(CachedData* programData) const;
3039196130af83782fcac4334117142475a837dd74dbsalomon@google.com
304f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    friend class GrGpuGLShaders;
305f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com};
306f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
307f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif
308