GrGLProgram.h revision 97c88c255cff3dbb8343c5d090526fdbedad6dd6
1f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/*
2f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    Copyright 2011 Google Inc.
3f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
4f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    Licensed under the Apache License, Version 2.0 (the "License");
5f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    you may not use this file except in compliance with the License.
6f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    You may obtain a copy of the License at
7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
8f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com         http://www.apache.org/licenses/LICENSE-2.0
9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    Unless required by applicable law or agreed to in writing, software
11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    distributed under the License is distributed on an "AS IS" BASIS,
12f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    See the License for the specific language governing permissions and
14f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    limitations under the License.
15f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
16f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
17f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED
18f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED
19f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
20f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#include "GrGLInterface.h"
219196130af83782fcac4334117142475a837dd74dbsalomon@google.com#include "GrStringBuilder.h"
22f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#include "GrDrawTarget.h"
23f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
2497c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
2597c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
26f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrBinHashKeyBuilder;
27f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrGLEffect;
28f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comstruct ShaderCodeSegments;
29f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
30f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/**
31f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information.
32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant
33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations
34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location
35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it
36f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the
37f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change.
38f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
39f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrGLProgram {
40f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic:
41f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    class CachedData;
42f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
43f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    GrGLProgram();
44f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    ~GrGLProgram();
45f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
46f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
47f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  Streams data that can uniquely identifies the generated
48f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  gpu program into a key, for cache indexing purposes.
49f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *
50f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  @param key The key object to receive the key data
51f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
52f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    void buildKey(GrBinHashKeyBuilder& key) const;
53f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
54f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
55f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  This is the heavy initilization routine for building a GLProgram.
56f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  The result of heavy init is not stored in datamembers of GrGLProgam,
57f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  but in a separate cacheable container.
58f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
599196130af83782fcac4334117142475a837dd74dbsalomon@google.com    bool genProgram(CachedData* programData) const;
60f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
61f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
62f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  Routine that is called before rendering. Sets-up all the state and
63f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  other initializations required for the Gpu Program to run.
64f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
65f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    bool doGLSetup(GrPrimitiveType type, CachedData* programData) const;
66f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
67f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
68f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  Routine that is called after rendering. Performs state restoration.
69f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  May perform secondary render passes.
70f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
71f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    void doGLPost() const;
72f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
73f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    /**
74f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  Configures the GrGLProgram based on the state of a GrDrawTarget
75f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  object.  This is the fast and light initialization. Retrieves all the
76f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  state that is required for performing the heavy init (i.e. genProgram),
77f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     *  or for retrieving heavy init results from cache.
78f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com     */
79f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    void buildFromTarget(const GrDrawTarget* target);
80f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
819196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int PositionAttributeIdx() { return 0; }
829196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int TexCoordAttributeIdx(int tcIdx) { return 1 + tcIdx; }
839196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int ColorAttributeIdx() { return 1 + GrDrawTarget::kMaxTexCoords; }
849196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int ViewMatrixAttributeIdx() {
859196130af83782fcac4334117142475a837dd74dbsalomon@google.com        return 2 + GrDrawTarget::kMaxTexCoords;
869196130af83782fcac4334117142475a837dd74dbsalomon@google.com    }
879196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static int TextureMatrixAttributeIdx(int stage) {
889196130af83782fcac4334117142475a837dd74dbsalomon@google.com        return 5 + GrDrawTarget::kMaxTexCoords + 3 * stage;
899196130af83782fcac4334117142475a837dd74dbsalomon@google.com    }
909196130af83782fcac4334117142475a837dd74dbsalomon@google.com
91f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comprivate:
92f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
93f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    //Parameters that affect code generation
94f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    struct ProgramDesc {
954be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        ProgramDesc() {
964be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            // since we use this as part of a key we can't have any unitialized
974be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            // padding
984be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            memset(this, 0, sizeof(ProgramDesc));
994be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        }
1004be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com
1014be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        // stripped of bits that don't affect prog generation
102f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrVertexLayout fVertexLayout;
103f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
104f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        enum {
1054be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            kNone_ColorType         = 0,
1064be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            kAttribute_ColorType    = 1,
1074be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com            kUniform_ColorType      = 2,
1084be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        } fColorType;
1094be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com
1104be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        bool fEmitsPointSize;
111f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
11297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo        GrColor fColorFilterColor;
11397c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo        SkXfermode::Mode fColorFilterXfermode;
11497c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
115f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        struct StageDesc {
116f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            enum OptFlagBits {
117f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                kNoPerspective_OptFlagBit  = 0x1,
118f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                kIdentityMatrix_OptFlagBit = 0x2
119f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            };
120f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1216aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com            unsigned fOptFlags;
1226aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com            bool fEnabled;
123f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
124f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            enum Modulation {
125f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                kColor_Modulation,
126f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                kAlpha_Modulation
1276aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com            } fModulation;
1286aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com
1296aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com            enum FetchMode {
1306aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com                kSingle_FetchMode,
1316aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com                k2x2_FetchMode
1326aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com            } fFetchMode;
133f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
134f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            enum CoordMapping {
135f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                kIdentity_CoordMapping,
136f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                kRadialGradient_CoordMapping,
137f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                kSweepGradient_CoordMapping,
138f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                kRadial2Gradient_CoordMapping
1396aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com            } fCoordMapping;
140f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        } fStages[GrDrawTarget::kNumStages];
141f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    } fProgramDesc;
142f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1434be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com    const ProgramDesc& getDesc() { return fProgramDesc; }
1444be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com
145f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic:
1469196130af83782fcac4334117142475a837dd74dbsalomon@google.com    enum {
1479196130af83782fcac4334117142475a837dd74dbsalomon@google.com        kUnusedUniform = -1,
1489196130af83782fcac4334117142475a837dd74dbsalomon@google.com        kSetAsAttribute = 1000,
1499196130af83782fcac4334117142475a837dd74dbsalomon@google.com    };
1509196130af83782fcac4334117142475a837dd74dbsalomon@google.com
151f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    struct StageUniLocations {
152f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint fTextureMatrixUni;
1536aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com        GrGLint fNormalizedTexelSizeUni;
154f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint fSamplerUni;
155f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint fRadial2Uni;
1569196130af83782fcac4334117142475a837dd74dbsalomon@google.com        void reset() {
1579196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fTextureMatrixUni = kUnusedUniform;
1589196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fNormalizedTexelSizeUni = kUnusedUniform;
1599196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fSamplerUni = kUnusedUniform;
1609196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fRadial2Uni = kUnusedUniform;
1619196130af83782fcac4334117142475a837dd74dbsalomon@google.com        }
162f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    };
163f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
164f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    struct UniLocations {
165f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint fViewMatrixUni;
1664be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        GrGLint fColorUni;
16797c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo        GrGLint fColorFilterUni;
168f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        StageUniLocations fStages[GrDrawTarget::kNumStages];
1699196130af83782fcac4334117142475a837dd74dbsalomon@google.com        void reset() {
1709196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fViewMatrixUni = kUnusedUniform;
1719196130af83782fcac4334117142475a837dd74dbsalomon@google.com            fColorUni = kUnusedUniform;
17297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo            fColorFilterUni = kUnusedUniform;
1739196130af83782fcac4334117142475a837dd74dbsalomon@google.com            for (int s = 0; s < GrDrawTarget::kNumStages; ++s) {
1749196130af83782fcac4334117142475a837dd74dbsalomon@google.com                fStages[s].reset();
1759196130af83782fcac4334117142475a837dd74dbsalomon@google.com            }
1769196130af83782fcac4334117142475a837dd74dbsalomon@google.com        }
177f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    };
178f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
179f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    class CachedData : public ::GrNoncopyable {
180f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    public:
181f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        CachedData() {
182f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            GR_DEBUGCODE(fEffectUniCount = 0;)
183f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            fEffectUniLocationsExtended = NULL;
184f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        }
185f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
186f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        ~CachedData() {
187f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            GrFree(fEffectUniLocationsExtended);
188f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        }
189f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
190f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        void copyAndTakeOwnership(CachedData& other) {
191f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            memcpy(this, &other, sizeof(this));
192f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            other.fEffectUniLocationsExtended = NULL; // ownership transfer
193f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            GR_DEBUGCODE(other.fEffectUniCount = 0;)
194f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        }
195f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
196f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        void setEffectUniformCount(size_t effectUniforms) {
197f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            GR_DEBUGCODE(fEffectUniCount = effectUniforms;)
198f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            GrFree(fEffectUniLocationsExtended);
199f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            if (effectUniforms > kUniLocationPreAllocSize) {
200f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                fEffectUniLocationsExtended = (GrGLint*)GrMalloc(sizeof(GrGLint)*(effectUniforms-kUniLocationPreAllocSize));
201f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            } else {
202f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                fEffectUniLocationsExtended = NULL;
203f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            }
204f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        }
205f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
206f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint&  effectUniLocation(size_t index) {
207f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            GrAssert(index < fEffectUniCount);
208f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            return (index < kUniLocationPreAllocSize) ?
209f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                fEffectUniLocations[index] :
210f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                fEffectUniLocationsExtended[index - kUniLocationPreAllocSize];
211f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        }
212f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
213f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    public:
214f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
215f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        // IDs
216f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLuint    fVShaderID;
217f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLuint    fFShaderID;
218f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLuint    fProgramID;
219f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        // shader uniform locations (-1 if shader doesn't use them)
220f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        UniLocations fUniLocations;
221f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
222f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrMatrix  fViewMatrix;
223f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
224f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        // these reflect the current values of uniforms
225f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        // (GL uniform values travel with program)
2264be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com        GrColor                     fColor;
22797c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo        GrColor                     fColorFilterColor;
228f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrMatrix                    fTextureMatrices[GrDrawTarget::kNumStages];
2296aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com        // width and height used for normalized texel size
2306aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com        int                         fTextureWidth[GrDrawTarget::kNumStages];
2316aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com        int                         fTextureHeight[GrDrawTarget::kNumStages];
232f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrScalar                    fRadial2CenterX1[GrDrawTarget::kNumStages];
233f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrScalar                    fRadial2Radius0[GrDrawTarget::kNumStages];
234f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        bool                        fRadial2PosRoot[GrDrawTarget::kNumStages];
235f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
236f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    private:
237f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        enum Constants {
238f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com            kUniLocationPreAllocSize = 8
239f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        };
240f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
241f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint     fEffectUniLocations[kUniLocationPreAllocSize];
242f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GrGLint*    fEffectUniLocationsExtended;
243f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com        GR_DEBUGCODE(size_t fEffectUniCount;)
244f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    }; // CachedData
245f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
246f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    GrGLEffect* fStageEffects[GrDrawTarget::kNumStages];
247f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
248f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comprivate:
2499196130af83782fcac4334117142475a837dd74dbsalomon@google.com    enum {
2509196130af83782fcac4334117142475a837dd74dbsalomon@google.com        kUseUniform = 2000
2519196130af83782fcac4334117142475a837dd74dbsalomon@google.com    };
2529196130af83782fcac4334117142475a837dd74dbsalomon@google.com
2539196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // should set all fields in locations var to kUseUniform if the
2549196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // corresponding uniform is required for the program.
255f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    void genStageCode(int stageNum,
256f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      const ProgramDesc::StageDesc& desc,
257f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      const char* fsInColor, // NULL means no incoming color
258f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      const char* fsOutColor,
259f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      const char* vsInCoord,
260f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      ShaderCodeSegments* segments,
261f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                      StageUniLocations* locations) const;
262f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
2639196130af83782fcac4334117142475a837dd74dbsalomon@google.com    static bool CompileFSAndVS(const ShaderCodeSegments& segments,
2649196130af83782fcac4334117142475a837dd74dbsalomon@google.com                               CachedData* programData);
2659196130af83782fcac4334117142475a837dd74dbsalomon@google.com
266f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    // Compiles a GL shader, returns shader ID or 0 if failed
267f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    // params have same meaning as glShaderSource
268f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    static GrGLuint CompileShader(GrGLenum type, int stringCnt,
269f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                                  const char** strings,
270f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com                                  int* stringLengths);
271f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
2729196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // Creates a GL program ID, binds shader attributes to GL vertex attrs, and
2739196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // links the program
2749196130af83782fcac4334117142475a837dd74dbsalomon@google.com    bool bindAttribsAndLinkProgram(GrStringBuilder texCoordAttrNames[GrDrawTarget::kMaxTexCoords],
2759196130af83782fcac4334117142475a837dd74dbsalomon@google.com                                   CachedData* programData) const;
2769196130af83782fcac4334117142475a837dd74dbsalomon@google.com
2779196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // Gets locations for all uniforms set to kUseUniform and initializes cache
2789196130af83782fcac4334117142475a837dd74dbsalomon@google.com    // to invalid values.
2799196130af83782fcac4334117142475a837dd74dbsalomon@google.com    void getUniformLocationsAndInitCache(CachedData* programData) const;
2809196130af83782fcac4334117142475a837dd74dbsalomon@google.com
281f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com    friend class GrGpuGLShaders;
282f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com};
283f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
284f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif
285