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 */
723e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt
8f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#include "GrGLProgram.h"
9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
10408d6125b32c86e1f81ce60465e3bf4491e755fcjoshualitt#include "builders/GrGLFullProgramBuilder.h"
11b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "builders/GrGLFragmentOnlyProgramBuilder.h"
12d8f856c32b679d9f5a9926feac005e2c0186f83ftomhudson@google.com#include "GrAllocator.h"
13b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrProcessor.h"
1477af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com#include "GrCoordTransform.h"
15b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrGLProcessor.h"
1634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com#include "GrGpuGL.h"
17ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen#include "GrGLPathRendering.h"
184fa6694c587b3830932429766c99d08c8dd9b723bsalomon@google.com#include "GrGLShaderVar.h"
19018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com#include "GrGLSL.h"
20170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel#include "GrOptDrawState.h"
2197c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h"
2297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
239188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org#define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X)
249188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org#define GL_CALL_RET(R, X) GR_GL_CALL_RET(fGpu->glInterface(), R, X)
25ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
269188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.orgGrGLProgram* GrGLProgram::Create(GrGpuGL* gpu,
2731ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com                                 const GrGLProgramDesc& desc,
28b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                 const GrGeometryStage* geometryProcessor,
29b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                 const GrFragmentStage* colorStages[],
30b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                 const GrFragmentStage* coverageStages[]) {
3130ba436f04e61d4505fb854d5fc56079636e0788joshualitt    SkAutoTDelete<GrGLProgramBuilder> builder;
32ae444965c43ad16575730ce8e3abdcaded296d94egdaniel    if (desc.getHeader().fUseFragShaderOnly) {
33ae444965c43ad16575730ce8e3abdcaded296d94egdaniel        SkASSERT(gpu->glCaps().pathRenderingSupport());
34ae444965c43ad16575730ce8e3abdcaded296d94egdaniel        SkASSERT(gpu->glPathRendering()->texturingMode() ==
35ae444965c43ad16575730ce8e3abdcaded296d94egdaniel                 GrGLPathRendering::FixedFunction_TexturingMode);
36bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt        SkASSERT(NULL == geometryProcessor);
3730ba436f04e61d4505fb854d5fc56079636e0788joshualitt        builder.reset(SkNEW_ARGS(GrGLFragmentOnlyProgramBuilder, (gpu, desc)));
38ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen    } else {
39ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen        builder.reset(SkNEW_ARGS(GrGLFullProgramBuilder, (gpu, desc)));
40dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    }
41bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    if (builder->genProgram(geometryProcessor, colorStages, coverageStages)) {
42dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        SkASSERT(0 != builder->getProgramID());
43dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        return SkNEW_ARGS(GrGLProgram, (gpu, desc, *builder));
44ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    }
456eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    return NULL;
46ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com}
47ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
489188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.orgGrGLProgram::GrGLProgram(GrGpuGL* gpu,
4931ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com                         const GrGLProgramDesc& desc,
5030ba436f04e61d4505fb854d5fc56079636e0788joshualitt                         const GrGLProgramBuilder& builder)
51a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org    : fColor(GrColor_ILLEGAL)
526eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    , fCoverage(GrColor_ILLEGAL)
536eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    , fDstCopyTexUnit(-1)
54dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    , fBuiltinUniformHandles(builder.getBuiltinUniformHandles())
55bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    , fGeometryProcessor(SkSafeRef(builder.getGeometryProcessor()))
56dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    , fColorEffects(SkRef(builder.getColorEffects()))
57dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    , fCoverageEffects(SkRef(builder.getCoverageEffects()))
58dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    , fProgramID(builder.getProgramID())
59dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    , fHasVertexShader(builder.hasVertexShader())
60dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    , fTexCoordSetCnt(builder.getTexCoordSetCount())
616eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    , fDesc(desc)
626eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    , fGpu(gpu)
63dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    , fProgramDataManager(gpu, this, builder) {
646eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org    this->initSamplerUniforms();
65f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}
66f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
67f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comGrGLProgram::~GrGLProgram() {
68dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    if (fProgramID) {
69dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        GL_CALL(DeleteProgram(fProgramID));
70ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com    }
71f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}
72f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
73ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.comvoid GrGLProgram::abandon() {
74dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    fProgramID = 0;
75ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com}
76ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com
77dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.comvoid GrGLProgram::initSamplerUniforms() {
78dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    GL_CALL(UseProgram(fProgramID));
7934cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com    GrGLint texUnitIdx = 0;
80dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    if (fBuiltinUniformHandles.fDstCopySamplerUni.isValid()) {
81dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        fProgramDataManager.setSampler(fBuiltinUniformHandles.fDstCopySamplerUni, texUnitIdx);
82804e9941ebd6217c592ecee2b5a5d1cbeaea1c42bsalomon@google.com        fDstCopyTexUnit = texUnitIdx++;
8326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com    }
8449f085dddff10473b6ebf832a974288300224e60bsalomon    if (fGeometryProcessor.get()) {
85bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt        fGeometryProcessor->initSamplers(fProgramDataManager, &texUnitIdx);
86bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    }
87dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    fColorEffects->initSamplers(fProgramDataManager, &texUnitIdx);
88dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    fCoverageEffects->initSamplers(fProgramDataManager, &texUnitIdx);
89f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}
90f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com
91eb715c8d5caa2191d611c4f9cfb22b4afc6c8d02bsalomon@google.com///////////////////////////////////////////////////////////////////////////////
924285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com
93170f90b4576f291879371ecd6ae4bc2b1d85c64aegdanielvoid GrGLProgram::setData(const GrOptDrawState& optState,
94170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel                          GrGpu::DrawType drawType,
95b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrGeometryStage* geometryProcessor,
96b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrFragmentStage* colorStages[],
97b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrFragmentStage* coverageStages[],
9826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com                          const GrDeviceCoordTexture* dstCopy,
9991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                          SharedGLState* sharedState) {
100170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    GrColor color = optState.getColor();
101170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    GrColor coverage = optState.getCoverageColor();
1022db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
103170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    this->setColor(optState, color, sharedState);
104170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    this->setCoverage(optState, coverage, sharedState);
105170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    this->setMatrixAndRenderTargetHeight(drawType, optState);
10691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
10749f085dddff10473b6ebf832a974288300224e60bsalomon    if (dstCopy) {
108dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        if (fBuiltinUniformHandles.fDstCopyTopLeftUni.isValid()) {
109dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen            fProgramDataManager.set2f(fBuiltinUniformHandles.fDstCopyTopLeftUni,
1107510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen                                       static_cast<GrGLfloat>(dstCopy->offset().fX),
1117510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen                                       static_cast<GrGLfloat>(dstCopy->offset().fY));
112dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen            fProgramDataManager.set2f(fBuiltinUniformHandles.fDstCopyScaleUni,
1137510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen                                       1.f / dstCopy->texture()->width(),
1147510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen                                       1.f / dstCopy->texture()->height());
11526e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com            GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture());
11626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com            static GrTextureParams kParams; // the default is clamp, nearest filtering.
1179188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org            fGpu->bindTexture(fDstCopyTexUnit, kParams, texture);
11826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com        } else {
119dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen            SkASSERT(!fBuiltinUniformHandles.fDstCopyScaleUni.isValid());
120dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen            SkASSERT(!fBuiltinUniformHandles.fDstCopySamplerUni.isValid());
12126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com        }
12226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com    } else {
123dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        SkASSERT(!fBuiltinUniformHandles.fDstCopyTopLeftUni.isValid());
124dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        SkASSERT(!fBuiltinUniformHandles.fDstCopyScaleUni.isValid());
125dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        SkASSERT(!fBuiltinUniformHandles.fDstCopySamplerUni.isValid());
1262db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    }
1272db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
12849f085dddff10473b6ebf832a974288300224e60bsalomon    if (fGeometryProcessor.get()) {
12949f085dddff10473b6ebf832a974288300224e60bsalomon        SkASSERT(geometryProcessor);
130b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        fGeometryProcessor->setData(fGpu, drawType, fProgramDataManager, geometryProcessor);
131bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    }
13223e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt    fColorEffects->setData(fGpu, drawType, fProgramDataManager, colorStages);
13323e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt    fCoverageEffects->setData(fGpu, drawType, fProgramDataManager, coverageStages);
13420807224936f8040424022a6bd6442b94b333d7fcommit-bot@chromium.org
1350a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org    // PathTexGen state applies to the the fixed function vertex shader. For
1360a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org    // custom shaders, it's ignored, so we don't need to change the texgen
1370a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org    // settings in that case.
138dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    if (!fHasVertexShader) {
139ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen        fGpu->glPathRendering()->flushPathTexGenSettings(fTexCoordSetCnt);
1406b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org    }
1418ae714b186ae5f4eaddee239281fbfe7282320c9skia.committer@gmail.com}
14291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
143170f90b4576f291879371ecd6ae4bc2b1d85c64aegdanielvoid GrGLProgram::setColor(const GrOptDrawState& optState,
14491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                           GrColor color,
14591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                           SharedGLState* sharedState) {
1462db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
147170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    if (!optState.hasColorVertexAttribute()) {
1482db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        switch (header.fColorInput) {
14931ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kAttribute_ColorInput:
150f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org                SkASSERT(-1 != header.fColorAttributeIndex);
151054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                if (sharedState->fConstAttribColor != color ||
1522db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    sharedState->fConstAttribColorIndex != header.fColorAttributeIndex) {
15391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    // OpenGL ES only supports the float varieties of glVertexAttrib
15491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrGLfloat c[4];
15591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrColorToRGBAFloat(color, c);
1562db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c));
15791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    sharedState->fConstAttribColor = color;
1582db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    sharedState->fConstAttribColorIndex = header.fColorAttributeIndex;
15991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                }
16091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
16131ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kUniform_ColorInput:
162dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen                if (fColor != color && fBuiltinUniformHandles.fColorUni.isValid()) {
16391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    // OpenGL ES doesn't support unsigned byte varieties of glUniform
16491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrGLfloat c[4];
16591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrColorToRGBAFloat(color, c);
166dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen                    fProgramDataManager.set4fv(fBuiltinUniformHandles.fColorUni, 1, c);
16791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    fColor = color;
16891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                }
169054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                sharedState->fConstAttribColorIndex = -1;
17091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
171842b086a3c876061e1279d47e6009629c9818b03egdaniel            case GrGLProgramDesc::kAllOnes_ColorInput:
172842b086a3c876061e1279d47e6009629c9818b03egdaniel                sharedState->fConstAttribColorIndex = -1;
173842b086a3c876061e1279d47e6009629c9818b03egdaniel                break;
17491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com            default:
17502cafcc1bf6e2968c2efdf459871167970da150eegdaniel                SkFAIL("Unexpected color type.");
17691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        }
177054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    } else {
178054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        sharedState->fConstAttribColorIndex = -1;
17991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    }
18091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com}
18191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
182170f90b4576f291879371ecd6ae4bc2b1d85c64aegdanielvoid GrGLProgram::setCoverage(const GrOptDrawState& optState,
18391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                              GrColor coverage,
18491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                              SharedGLState* sharedState) {
1852db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
186170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    if (!optState.hasCoverageVertexAttribute()) {
1872db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        switch (header.fCoverageInput) {
18831ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kAttribute_ColorInput:
189054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                if (sharedState->fConstAttribCoverage != coverage ||
1902db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    sharedState->fConstAttribCoverageIndex != header.fCoverageAttributeIndex) {
19191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    // OpenGL ES only supports the float varieties of  glVertexAttrib
19291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrGLfloat c[4];
19391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrColorToRGBAFloat(coverage, c);
1942db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c));
19591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    sharedState->fConstAttribCoverage = coverage;
1962db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                    sharedState->fConstAttribCoverageIndex = header.fCoverageAttributeIndex;
19791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                }
19891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
19931ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com            case GrGLProgramDesc::kUniform_ColorInput:
20091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                if (fCoverage != coverage) {
20191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    // OpenGL ES doesn't support unsigned byte varieties of glUniform
20291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrGLfloat c[4];
20391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    GrColorToRGBAFloat(coverage, c);
204dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen                    fProgramDataManager.set4fv(fBuiltinUniformHandles.fCoverageUni, 1, c);
20591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                    fCoverage = coverage;
20691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                }
207054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                sharedState->fConstAttribCoverageIndex = -1;
20891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
209842b086a3c876061e1279d47e6009629c9818b03egdaniel            case GrGLProgramDesc::kAllOnes_ColorInput:
210054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                sharedState->fConstAttribCoverageIndex = -1;
21191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com                break;
21291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com            default:
21302cafcc1bf6e2968c2efdf459871167970da150eegdaniel                SkFAIL("Unexpected coverage type.");
21491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        }
215054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    } else {
216054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        sharedState->fConstAttribCoverageIndex = -1;
21791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    }
21891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com}
2196a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
220ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunenvoid GrGLProgram::setMatrixAndRenderTargetHeight(GrGpu::DrawType drawType,
221170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel                                                 const GrOptDrawState& optState) {
222170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    const GrRenderTarget* rt = optState.getRenderTarget();
2236a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    SkISize size;
2246a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    size.set(rt->width(), rt->height());
2256a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
2266a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    // Load the RT height uniform if it is needed to y-flip gl_FragCoord.
227dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen    if (fBuiltinUniformHandles.fRTHeightUni.isValid() &&
2286a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        fMatrixState.fRenderTargetSize.fHeight != size.fHeight) {
229dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        fProgramDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni,
2307510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen                                   SkIntToScalar(size.fHeight));
2316a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    }
2326a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com
233ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen    if (GrGpu::IsPathRenderingDrawType(drawType)) {
234170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel        fGpu->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), size, rt->origin());
2356b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org    } else if (fMatrixState.fRenderTargetOrigin != rt->origin() ||
2366b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org               fMatrixState.fRenderTargetSize != size ||
237170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel               !fMatrixState.fViewMatrix.cheapEqualTo(optState.getViewMatrix())) {
238dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        SkASSERT(fBuiltinUniformHandles.fViewMatrixUni.isValid());
239215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
240170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel        fMatrixState.fViewMatrix = optState.getViewMatrix();
2416a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        fMatrixState.fRenderTargetSize = size;
2426a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com        fMatrixState.fRenderTargetOrigin = rt->origin();
243215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
244215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        GrGLfloat viewMatrix[3 * 3];
245215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org        fMatrixState.getGLMatrix<3>(viewMatrix);
246dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        fProgramDataManager.setMatrix3f(fBuiltinUniformHandles.fViewMatrixUni, viewMatrix);
24747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org
24847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        GrGLfloat rtAdjustmentVec[4];
24947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org        fMatrixState.getRTAdjustmentVec(rtAdjustmentVec);
250dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen        fProgramDataManager.set4fv(fBuiltinUniformHandles.fRTAdjustmentUni, 1, rtAdjustmentVec);
2516a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com    }
2526a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com}
253