GrGLProgram.h revision 861e1037017bbb7ac52ec5ebecab3a636a82a3e8
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED
10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED
11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
1230ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "builders/GrGLProgramBuilder.h"
1347bb38283072dc87dc93220cd2f370ca109972ffjoshualitt#include "builders/GrGLNvprProgramBuilder.h"
14d8f856c32b679d9f5a9926feac005e2c0186f83ftomhudson@google.com#include "GrDrawState.h"
156177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.com#include "GrGLContext.h"
1631ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com#include "GrGLProgramDesc.h"
17086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com#include "GrGLSL.h"
18890e3b58e78c0825820f75f1f0c5a5d71e855aa6bsalomon@google.com#include "GrGLTexture.h"
197510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen#include "GrGLProgramDataManager.h"
20f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
21f0a104e6f16dc095286d32f1e104894ae0b2b19fbsalomon@google.com#include "SkString.h"
2297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
2397c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
24b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrGLProcessor;
2547bb38283072dc87dc93220cd2f370ca109972ffjoshualittclass GrGLInstalledProcessors;
2630ba436f04e61d4505fb854d5fc56079636e0788joshualittclass GrGLProgramBuilder;
27f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
28f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/**
29f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information.
30f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant
31f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations
32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location
33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it
34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the
35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change.
36f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */
37a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.orgclass GrGLProgram : public SkRefCnt {
38f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic:
399ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    SK_DECLARE_INST_COUNT(GrGLProgram)
404fa6694c587b3830932429766c99d08c8dd9b723bsalomon@google.com
4130ba436f04e61d4505fb854d5fc56079636e0788joshualitt    typedef GrGLProgramBuilder::BuiltinUniformHandles BuiltinUniformHandles;
42dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen
439ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com    virtual ~GrGLProgram();
44f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
4534cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    /**
4634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     * Call to abandon GL objects owned by this program.
4734cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     */
48ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    void abandon();
49ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
5079f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt    const GrProgramDesc& getDesc() { return fDesc; }
519ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com
52271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    /**
536a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * Gets the GL program ID for this program.
546a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     */
55dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    GrGLuint programID() const { return fProgramID; }
566a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
5747bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    /*
5847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt     * The base class always has a vertex shader, only the NVPR variants may omit a vertex shader
5947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt     */
6047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    virtual bool hasVertexShader() const { return true; }
616b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org
626a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    /**
636a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * The GrDrawState's view matrix along with the aspects of the render target determine the
646a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * matrix sent to GL. The size of the render target affects the GL matrix because we must
656a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * convert from Skia device coords to GL's normalized coords. Also the origin of the render
666a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     * target may require us to perform a mirror-flip.
676a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com     */
686a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    struct MatrixState {
696a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        SkMatrix        fViewMatrix;
706a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        SkISize         fRenderTargetSize;
716a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        GrSurfaceOrigin fRenderTargetOrigin;
726a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
736a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        MatrixState() { this->invalidate(); }
746a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        void invalidate() {
756a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com            fViewMatrix = SkMatrix::InvalidMatrix();
7645a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com            fRenderTargetSize.fWidth = -1;
7745a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com            fRenderTargetSize.fHeight = -1;
786a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com            fRenderTargetOrigin = (GrSurfaceOrigin) -1;
796a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        }
8047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org
8147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        /**
8247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * Gets a matrix that goes from local coords to Skia's device coordinates.
8347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         */
84215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        template<int Size> void getGLMatrix(GrGLfloat* destMatrix) {
8547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            GrGLGetMatrix<Size>(destMatrix, fViewMatrix);
8647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        }
8747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org
8847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        /**
8947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * Gets a matrix that goes from local coordinates to GL normalized device coords.
9047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         */
9147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        template<int Size> void getRTAdjustedGLMatrix(GrGLfloat* destMatrix) {
92215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            SkMatrix combined;
93215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
94215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1,
95215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                                0, -SkIntToScalar(2) / fRenderTargetSize.fHeight, SK_Scalar1,
9647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                                0, 0, 1);
97215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            } else {
98215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1,
99215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org                                0, SkIntToScalar(2) / fRenderTargetSize.fHeight, -SK_Scalar1,
10047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                                0, 0, 1);
101215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            }
102b930cc3dcb0645a8ce0689c5feb9c0defda57f28commit-bot@chromium.org            combined.preConcat(fViewMatrix);
103215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org            GrGLGetMatrix<Size>(destMatrix, combined);
104215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        }
10547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org
10647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        /**
10747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * Gets a vec4 that adjusts the position from Skia device coords to GL's normalized device
10847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * coords. Assuming the transformed position, pos, is a homogeneous vec3, the vec, v, is
10947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * applied as such:
11047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * pos.x = dot(v.xy, pos.xz)
11147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         * pos.y = dot(v.zq, pos.yz)
11247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org         */
11347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        void getRTAdjustmentVec(GrGLfloat* destVec) {
11447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            destVec[0] = 2.f / fRenderTargetSize.fWidth;
11547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            destVec[1] = -1.f;
11647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
11747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                destVec[2] = -2.f / fRenderTargetSize.fHeight;
11847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                destVec[3] = 1.f;
11947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            } else {
12047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                destVec[2] = 2.f / fRenderTargetSize.fHeight;
12147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org                destVec[3] = -1.f;
12247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org            }
12347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        }
1246a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    };
1256a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
1266a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    /**
127b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt     * This function uploads uniforms and calls each GrGLProcessor's setData. It is called before a
12834cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com     * draw occurs using the program after the program has already been bound. It also uses the
129861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon     * GrGLGpu object to bind the textures required by the GrGLProcessors. The color and coverage
1302c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com     * stages come from GrGLProgramDesc::Build().
1314285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com     */
132dafa4d09cbe66943b2414bdeaa0f6ef7f900dc4ajoshualitt    void setData(const GrOptDrawState&);
1339196130af83782fcac4334117142475a837dd74dbsalomon@google.com
13447bb38283072dc87dc93220cd2f370ca109972ffjoshualittprotected:
1357510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen    typedef GrGLProgramDataManager::UniformHandle UniformHandle;
13647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
137dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com
138861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon    GrGLProgram(GrGLGpu*,
13979f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt                const GrProgramDesc&,
14047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                const BuiltinUniformHandles&,
14147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                GrGLuint programID,
14247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                const UniformInfoArray&,
143a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt                GrGLInstalledGeoProc* geometryProcessor,
144c230414861558ce20b74281b1ca363e56c441832egdaniel                GrGLInstalledXferProc* xferProcessor,
145a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt                GrGLInstalledFragProcs* fragmentProcessors);
1462c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
147a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    // Sets the texture units for samplers.
1482c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    void initSamplerUniforms();
149a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt    void initSamplers(GrGLInstalledProc*, int* texUnitIdx);
1502c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
15147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    // A templated helper to loop over effects, set the transforms(via subclass) and bind textures
152a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt    void setFragmentData(const GrOptDrawState&);
153ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    virtual void setTransformData(const GrPendingFragmentStage&, GrGLInstalledFragProc*);
154a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt    void bindTextures(const GrGLInstalledProc*, const GrProcessor&);
15547bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
15647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    /*
15747bb38283072dc87dc93220cd2f370ca109972ffjoshualitt     * Legacy NVPR needs a hook here to flush path tex gen settings.
15847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt     * TODO when legacy nvpr is removed, remove this call.
15947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt     */
16047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    virtual void didSetData(GrGpu::DrawType);
16147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
1622c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com    // Helper for setData() that sets the view matrix and loads the render target height uniform
163dafa4d09cbe66943b2414bdeaa0f6ef7f900dc4ajoshualitt    void setMatrixAndRenderTargetHeight(const GrOptDrawState&);
164dafa4d09cbe66943b2414bdeaa0f6ef7f900dc4ajoshualitt    virtual void onSetMatrixAndRenderTargetHeight(const GrOptDrawState&);
1652c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com
16634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    // these reflect the current values of uniforms (GL uniform values travel with program)
16747bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    MatrixState fMatrixState;
16847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    GrColor fColor;
16937b4d866b1446d35c989f9a97885a777ddc7d1c8egdaniel    uint8_t fCoverage;
17047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    int fDstCopyTexUnit;
17147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    BuiltinUniformHandles fBuiltinUniformHandles;
17247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    GrGLuint fProgramID;
1736eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org
17447bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    // the installed effects
175a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt    SkAutoTDelete<GrGLInstalledGeoProc> fGeometryProcessor;
176c230414861558ce20b74281b1ca363e56c441832egdaniel    SkAutoTDelete<GrGLInstalledXferProc> fXferProcessor;
177a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt    SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
1789681eebb0e441cee25b6faac82c3728512acda27skia.committer@gmail.com
17979f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt    GrProgramDesc fDesc;
180861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon    GrGLGpu* fGpu;
18147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    GrGLProgramDataManager fProgramDataManager;
1826eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org
18347bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    friend class GrGLProgramBuilder;
1846b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org
185a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org    typedef SkRefCnt INHERITED;
186f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com};
187f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
18847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt/*
18947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt * Below are slight specializations of the program object for the different types of programs
19047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt * The default GrGL programs consist of at the very least a vertex and fragment shader.
19147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt * Legacy Nvpr only has a fragment shader, 1.3+ Nvpr ignores the vertex shader, but both require
19247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt * specialized methods for setting transform data. Both types of NVPR also require setting the
19347bb38283072dc87dc93220cd2f370ca109972ffjoshualitt * projection matrix through a special function call
19447bb38283072dc87dc93220cd2f370ca109972ffjoshualitt */
19547bb38283072dc87dc93220cd2f370ca109972ffjoshualittclass GrGLNvprProgramBase : public GrGLProgram {
19647bb38283072dc87dc93220cd2f370ca109972ffjoshualittprotected:
197861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon    GrGLNvprProgramBase(GrGLGpu*,
19879f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt                        const GrProgramDesc&,
19947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                        const BuiltinUniformHandles&,
20047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                        GrGLuint programID,
20147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                        const UniformInfoArray&,
2029b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                        GrGLInstalledGeoProc*,
203c230414861558ce20b74281b1ca363e56c441832egdaniel                        GrGLInstalledXferProc* xferProcessor,
204a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt                        GrGLInstalledFragProcs* fragmentProcessors);
205dafa4d09cbe66943b2414bdeaa0f6ef7f900dc4ajoshualitt    virtual void onSetMatrixAndRenderTargetHeight(const GrOptDrawState&);
20647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
20747bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    typedef GrGLProgram INHERITED;
20847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt};
20947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
21047bb38283072dc87dc93220cd2f370ca109972ffjoshualittclass GrGLNvprProgram : public GrGLNvprProgramBase {
21147bb38283072dc87dc93220cd2f370ca109972ffjoshualittpublic:
212ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    virtual bool hasVertexShader() const SK_OVERRIDE { return true; }
21347bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
21447bb38283072dc87dc93220cd2f370ca109972ffjoshualittprivate:
21547bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    typedef GrGLNvprProgramBuilder::SeparableVaryingInfo SeparableVaryingInfo;
21647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    typedef GrGLNvprProgramBuilder::SeparableVaryingInfoArray SeparableVaryingInfoArray;
217861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon    GrGLNvprProgram(GrGLGpu*,
21879f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt                    const GrProgramDesc&,
21947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                    const BuiltinUniformHandles&,
22047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                    GrGLuint programID,
22147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                    const UniformInfoArray&,
2229b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                    GrGLInstalledGeoProc*,
223c230414861558ce20b74281b1ca363e56c441832egdaniel                    GrGLInstalledXferProc* xferProcessor,
224a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt                    GrGLInstalledFragProcs* fragmentProcessors,
22547bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                    const SeparableVaryingInfoArray& separableVaryings);
22647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    virtual void didSetData(GrGpu::DrawType) SK_OVERRIDE;
227ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    virtual void setTransformData(const GrPendingFragmentStage&,
228ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon                                  GrGLInstalledFragProc*) SK_OVERRIDE;
22947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
23047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    struct Varying {
23147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt        GrGLint     fLocation;
23247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt        SkDEBUGCODE(
23347bb38283072dc87dc93220cd2f370ca109972ffjoshualitt            GrSLType    fType;
23447bb38283072dc87dc93220cd2f370ca109972ffjoshualitt        );
23547bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    };
23647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    SkTArray<Varying, true> fVaryings;
23747bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
23847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    friend class GrGLNvprProgramBuilder;
23947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
24047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    typedef GrGLNvprProgramBase INHERITED;
24147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt};
24247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
24347bb38283072dc87dc93220cd2f370ca109972ffjoshualittclass GrGLLegacyNvprProgram : public GrGLNvprProgramBase {
24447bb38283072dc87dc93220cd2f370ca109972ffjoshualittpublic:
24547bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    virtual bool hasVertexShader() const SK_OVERRIDE { return false; }
24647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
24747bb38283072dc87dc93220cd2f370ca109972ffjoshualittprivate:
248861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon    GrGLLegacyNvprProgram(GrGLGpu* gpu,
24979f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt                          const GrProgramDesc& desc,
25047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                          const BuiltinUniformHandles&,
25147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                          GrGLuint programID,
25247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                          const UniformInfoArray&,
2539b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                          GrGLInstalledGeoProc*,
254c230414861558ce20b74281b1ca363e56c441832egdaniel                          GrGLInstalledXferProc* xp,
255c230414861558ce20b74281b1ca363e56c441832egdaniel                          GrGLInstalledFragProcs* fps,
25647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt                          int texCoordSetCnt);
25747bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    virtual void didSetData(GrGpu::DrawType) SK_OVERRIDE;
258ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    virtual void setTransformData(const GrPendingFragmentStage&,
259ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon                                  GrGLInstalledFragProc*) SK_OVERRIDE;
26047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
26147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    int fTexCoordSetCnt;
26247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
26347bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    friend class GrGLLegacyNvprProgramBuilder;
26447bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
26547bb38283072dc87dc93220cd2f370ca109972ffjoshualitt    typedef GrGLNvprProgramBase INHERITED;
26647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt};
26747bb38283072dc87dc93220cd2f370ca109972ffjoshualitt
268f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif
269