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