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
8f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#include "GrGLProgram.h"
9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
10d8f856c32b679d9f5a9926feac005e2c0186f83ftomhudson@google.com#include "GrAllocator.h"
11a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com#include "GrEffect.h"
1277af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com#include "GrCoordTransform.h"
13c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com#include "GrDrawEffect.h"
14d698f77c13d97c61109b861eac4d25b14a5de935bsalomon@google.com#include "GrGLEffect.h"
1534cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com#include "GrGpuGL.h"
164fa6694c587b3830932429766c99d08c8dd9b723bsalomon@google.com#include "GrGLShaderVar.h"
17018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com#include "GrGLSL.h"
1897c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
1997c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
209188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org#define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X)
219188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org#define GL_CALL_RET(R, X) GR_GL_CALL_RET(fGpu->glInterface(), R, X)
22ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
239188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.orgGrGLProgram* GrGLProgram::Create(GrGpuGL* gpu,
2431ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com                                 const GrGLProgramDesc& desc,
252c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                                 const GrEffectStage* colorStages[],
262c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                                 const GrEffectStage* coverageStages[]) {
276eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    GrGLShaderBuilder::GenProgramOutput output;
286eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    SkAutoTUnref<GrGLUniformManager> uman(SkNEW_ARGS(GrGLUniformManager, (gpu)));
296eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    if (GrGLShaderBuilder::GenProgram(gpu, uman, desc, colorStages, coverageStages,
306eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org                                      &output)) {
316eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org        SkASSERT(0 != output.fProgramID);
326eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org        return SkNEW_ARGS(GrGLProgram, (gpu, desc, uman, output));
33ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    }
346eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    return NULL;
35ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com}
36ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
379188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.orgGrGLProgram::GrGLProgram(GrGpuGL* gpu,
3831ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com                         const GrGLProgramDesc& desc,
396eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org                         GrGLUniformManager* uman,
406eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org                         const GrGLShaderBuilder::GenProgramOutput& builderOutput)
41a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    : fColor(GrColor_ILLEGAL)
426eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    , fCoverage(GrColor_ILLEGAL)
436eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    , fDstCopyTexUnit(-1)
44a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    , fBuilderOutput(builderOutput)
456eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    , fDesc(desc)
466eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    , fGpu(gpu)
47a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    , fUniformManager(SkRef(uman)) {
486eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    this->initSamplerUniforms();
49f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}
50f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
51f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comGrGLProgram::~GrGLProgram() {
52a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    if (fBuilderOutput.fProgramID) {
53a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        GL_CALL(DeleteProgram(fBuilderOutput.fProgramID));
54ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    }
55f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}
56f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
57ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.comvoid GrGLProgram::abandon() {
58a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    fBuilderOutput.fProgramID = 0;
59ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com}
60ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
610d3f1fbd6ba91a297e42b20ea9967b3a33cc9b28tomhudson@google.comvoid GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff,
62271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                                GrBlendCoeff* dstCoeff) const {
632db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    switch (fDesc.getHeader().fCoverageOutput) {
645920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com        case GrGLProgramDesc::kModulate_CoverageOutput:
65271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            break;
665920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com        // The prog will write a coverage value to the secondary
67271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // output and the dst is blended by one minus that value.
685920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com        case GrGLProgramDesc::kSecondaryCoverage_CoverageOutput:
695920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com        case GrGLProgramDesc::kSecondaryCoverageISA_CoverageOutput:
705920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com        case GrGLProgramDesc::kSecondaryCoverageISC_CoverageOutput:
715920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com            *dstCoeff = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff;
725920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com            break;
735920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com        case GrGLProgramDesc::kCombineWithDst_CoverageOutput:
745920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com            // We should only have set this if the blend was specified as (1, 0)
75f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(kOne_GrBlendCoeff == *srcCoeff && kZero_GrBlendCoeff == *dstCoeff);
765920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com            break;
77271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        default:
7888cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org            SkFAIL("Unexpected coverage output");
79271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            break;
80271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
81271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com}
82271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
83dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.comvoid GrGLProgram::initSamplerUniforms() {
84a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    GL_CALL(UseProgram(fBuilderOutput.fProgramID));
8534cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    GrGLint texUnitIdx = 0;
86a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    if (fBuilderOutput.fUniformHandles.fDstCopySamplerUni.isValid()) {
87a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        fUniformManager->setSampler(fBuilderOutput.fUniformHandles.fDstCopySamplerUni, texUnitIdx);
88804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com        fDstCopyTexUnit = texUnitIdx++;
8926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com    }
90a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    fBuilderOutput.fColorEffects->initSamplers(*fUniformManager, &texUnitIdx);
91a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    fBuilderOutput.fCoverageEffects->initSamplers(*fUniformManager, &texUnitIdx);
92f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}
93f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
94eb715c8d5caa2191d611c4f9cfb22b4afc6c8d02bsalomon@google.com///////////////////////////////////////////////////////////////////////////////
954285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com
969188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.orgvoid GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts,
972c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                          const GrEffectStage* colorStages[],
982c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                          const GrEffectStage* coverageStages[],
9926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com                          const GrDeviceCoordTexture* dstCopy,
10091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                          SharedGLState* sharedState) {
1019188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org    const GrDrawState& drawState = fGpu->getDrawState();
10234cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com
1032db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    GrColor color;
1042db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    GrColor coverage;
1052db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    if (blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag) {
1062db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        color = 0;
1072db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        coverage = 0;
1082db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    } else if (blendOpts & GrDrawState::kEmitCoverage_BlendOptFlag) {
1092db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        color = 0xffffffff;
110e0a868c84ebc34c5a16b5faa1546016abb9ca0accommit-bot@chromium.org        coverage = drawState.getCoverageColor();
1112db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    } else {
1122db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        color = drawState.getColor();
113e0a868c84ebc34c5a16b5faa1546016abb9ca0accommit-bot@chromium.org        coverage = drawState.getCoverageColor();
1142db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    }
1152db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
11691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    this->setColor(drawState, color, sharedState);
11791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    this->setCoverage(drawState, coverage, sharedState);
1186a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    this->setMatrixAndRenderTargetHeight(drawState);
11991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
12026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com    if (NULL != dstCopy) {
121a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        if (fBuilderOutput.fUniformHandles.fDstCopyTopLeftUni.isValid()) {
122a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org            fUniformManager->set2f(fBuilderOutput.fUniformHandles.fDstCopyTopLeftUni,
1236eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org                                   static_cast<GrGLfloat>(dstCopy->offset().fX),
1246eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org                                   static_cast<GrGLfloat>(dstCopy->offset().fY));
125a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org            fUniformManager->set2f(fBuilderOutput.fUniformHandles.fDstCopyScaleUni,
1266eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org                                   1.f / dstCopy->texture()->width(),
1276eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org                                   1.f / dstCopy->texture()->height());
12826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com            GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture());
12926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com            static GrTextureParams kParams; // the default is clamp, nearest filtering.
1309188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org            fGpu->bindTexture(fDstCopyTexUnit, kParams, texture);
13126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com        } else {
132a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org            SkASSERT(!fBuilderOutput.fUniformHandles.fDstCopyScaleUni.isValid());
133a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org            SkASSERT(!fBuilderOutput.fUniformHandles.fDstCopySamplerUni.isValid());
13426e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com        }
13526e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com    } else {
136a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        SkASSERT(!fBuilderOutput.fUniformHandles.fDstCopyTopLeftUni.isValid());
137a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        SkASSERT(!fBuilderOutput.fUniformHandles.fDstCopyScaleUni.isValid());
138a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        SkASSERT(!fBuilderOutput.fUniformHandles.fDstCopySamplerUni.isValid());
1392db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    }
1402db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
141a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    fBuilderOutput.fColorEffects->setData(fGpu, *fUniformManager, colorStages);
142a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    fBuilderOutput.fCoverageEffects->setData(fGpu, *fUniformManager, coverageStages);
1436b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org
14420807224936f8040424022a6bd6442b94b333d7fcommit-bot@chromium.org
1450a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org    // PathTexGen state applies to the the fixed function vertex shader. For
1460a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org    // custom shaders, it's ignored, so we don't need to change the texgen
1470a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org    // settings in that case.
148a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    if (!fBuilderOutput.fHasVertexShader) {
149a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        fGpu->flushPathTexGenSettings(fBuilderOutput.fTexCoordSetCnt);
1506b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org    }
1518ae714b186ae5f4eaddee239281fbfe7282320c9skia.committer@gmail.com}
15291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
15391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.comvoid GrGLProgram::setColor(const GrDrawState& drawState,
15491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                           GrColor color,
15591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                           SharedGLState* sharedState) {
1562db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
157054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    if (!drawState.hasColorVertexAttribute()) {
1582db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        switch (header.fColorInput) {
15931ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kAttribute_ColorInput:
160f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org                SkASSERT(-1 != header.fColorAttributeIndex);
161054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                if (sharedState->fConstAttribColor != color ||
1622db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    sharedState->fConstAttribColorIndex != header.fColorAttributeIndex) {
16391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    // OpenGL ES only supports the float varieties of glVertexAttrib
16491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrGLfloat c[4];
16591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrColorToRGBAFloat(color, c);
1662db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c));
16791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    sharedState->fConstAttribColor = color;
1682db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    sharedState->fConstAttribColorIndex = header.fColorAttributeIndex;
16991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                }
17091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
17131ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kUniform_ColorInput:
172a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org                if (fColor != color && fBuilderOutput.fUniformHandles.fColorUni.isValid()) {
17391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    // OpenGL ES doesn't support unsigned byte varieties of glUniform
17491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrGLfloat c[4];
17591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrColorToRGBAFloat(color, c);
176a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org                    fUniformManager->set4fv(fBuilderOutput.fUniformHandles.fColorUni, 1, c);
17791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    fColor = color;
17891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                }
179054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                sharedState->fConstAttribColorIndex = -1;
18091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
18131ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kSolidWhite_ColorInput:
18231ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kTransBlack_ColorInput:
183054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                sharedState->fConstAttribColorIndex = -1;
18491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
18591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com            default:
18688cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org                SkFAIL("Unknown color type.");
18791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        }
188054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    } else {
189054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        sharedState->fConstAttribColorIndex = -1;
19091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    }
19191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com}
19291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
19391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.comvoid GrGLProgram::setCoverage(const GrDrawState& drawState,
19491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                              GrColor coverage,
19591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                              SharedGLState* sharedState) {
1962db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
197054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    if (!drawState.hasCoverageVertexAttribute()) {
1982db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        switch (header.fCoverageInput) {
19931ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kAttribute_ColorInput:
200054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                if (sharedState->fConstAttribCoverage != coverage ||
2012db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    sharedState->fConstAttribCoverageIndex != header.fCoverageAttributeIndex) {
20291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    // OpenGL ES only supports the float varieties of  glVertexAttrib
20391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrGLfloat c[4];
20491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrColorToRGBAFloat(coverage, c);
2052db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c));
20691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    sharedState->fConstAttribCoverage = coverage;
2072db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    sharedState->fConstAttribCoverageIndex = header.fCoverageAttributeIndex;
20891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                }
20991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
21031ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kUniform_ColorInput:
21191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                if (fCoverage != coverage) {
21291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    // OpenGL ES doesn't support unsigned byte varieties of glUniform
21391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrGLfloat c[4];
21491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrColorToRGBAFloat(coverage, c);
215a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org                    fUniformManager->set4fv(fBuilderOutput.fUniformHandles.fCoverageUni, 1, c);
21691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    fCoverage = coverage;
21791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                }
218054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                sharedState->fConstAttribCoverageIndex = -1;
21991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
22031ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kSolidWhite_ColorInput:
22131ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kTransBlack_ColorInput:
222054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                sharedState->fConstAttribCoverageIndex = -1;
22391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
22491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com            default:
22588cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org                SkFAIL("Unknown coverage type.");
22691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        }
227054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    } else {
228054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        sharedState->fConstAttribCoverageIndex = -1;
22991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    }
23091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com}
2316a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
2326a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.comvoid GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) {
2336a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    const GrRenderTarget* rt = drawState.getRenderTarget();
2346a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    SkISize size;
2356a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    size.set(rt->width(), rt->height());
2366a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
2376a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    // Load the RT height uniform if it is needed to y-flip gl_FragCoord.
238a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    if (fBuilderOutput.fUniformHandles.fRTHeightUni.isValid() &&
2396a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        fMatrixState.fRenderTargetSize.fHeight != size.fHeight) {
240a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        fUniformManager->set1f(fBuilderOutput.fUniformHandles.fRTHeightUni,
241a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org                               SkIntToScalar(size.fHeight));
2426a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    }
2436a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
244a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    if (!fBuilderOutput.fHasVertexShader) {
245a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        SkASSERT(!fBuilderOutput.fUniformHandles.fViewMatrixUni.isValid());
246a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        SkASSERT(!fBuilderOutput.fUniformHandles.fRTAdjustmentUni.isValid());
2476b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org        fGpu->setProjectionMatrix(drawState.getViewMatrix(), size, rt->origin());
2486b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org    } else if (fMatrixState.fRenderTargetOrigin != rt->origin() ||
2496b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org               fMatrixState.fRenderTargetSize != size ||
2506b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org               !fMatrixState.fViewMatrix.cheapEqualTo(drawState.getViewMatrix())) {
251a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        SkASSERT(fBuilderOutput.fUniformHandles.fViewMatrixUni.isValid());
252215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
2536a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        fMatrixState.fViewMatrix = drawState.getViewMatrix();
2546a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        fMatrixState.fRenderTargetSize = size;
2556a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        fMatrixState.fRenderTargetOrigin = rt->origin();
256215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
257215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        GrGLfloat viewMatrix[3 * 3];
258215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        fMatrixState.getGLMatrix<3>(viewMatrix);
259a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        fUniformManager->setMatrix3f(fBuilderOutput.fUniformHandles.fViewMatrixUni, viewMatrix);
26047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org
26147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        GrGLfloat rtAdjustmentVec[4];
26247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        fMatrixState.getRTAdjustmentVec(rtAdjustmentVec);
263a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org        fUniformManager->set4fv(fBuilderOutput.fUniformHandles.fRTAdjustmentUni, 1, rtAdjustmentVec);
2646a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    }
2656a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com}
266