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