GrGLProgram.h revision a469c28c3c16214733a25201a286970f57b3d944
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED 10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED 11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 12d8f856c32b679d9f5a9926feac005e2c0186f83ftomhudson@google.com#include "GrDrawState.h" 1396399948dc2f1afd2e9d9e5be7d646c01d17f82bbsalomon@google.com#include "GrGLContextInfo.h" 14086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com#include "GrGLSL.h" 15890e3b58e78c0825820f75f1f0c5a5d71e855aa6bsalomon@google.com#include "GrGLTexture.h" 16dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com#include "GrGLUniformManager.h" 17f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 18f0a104e6f16dc095286d32f1e104894ae0b2b19fbsalomon@google.com#include "SkString.h" 1997c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h" 2097c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 21f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrBinHashKeyBuilder; 2207eecdca3e331eb4066c53a29305aeea6d692961tomhudson@google.comclass GrGLProgramStage; 23f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.comclass GrGLShaderBuilder; 24f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 25edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com// optionally compile the experimental GS code. Set to GR_DEBUG 26edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com// so that debug build bots will execute the code. 27edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com#define GR_GL_EXPERIMENTAL_GS GR_DEBUG 28edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com 29f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/** 30f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information. 31f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant 32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations 33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location 34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it 35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the 36f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change. 37f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 389ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.comclass GrGLProgram : public GrRefCnt { 39f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic: 409ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com SK_DECLARE_INST_COUNT(GrGLProgram) 414fa6694c587b3830932429766c99d08c8dd9b723bsalomon@google.com 429ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com struct Desc; 43f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 44ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com static GrGLProgram* Create(const GrGLContextInfo& gl, 45ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com const Desc& desc, 46a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com const GrEffect** customStages); 47ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com 489ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com virtual ~GrGLProgram(); 49f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 50ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com /** Call to abandon GL objects owned by this program */ 51ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com void abandon(); 52ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com 53f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 544285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com * The shader may modify the blend coefficients. Params are in/out 55f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 56ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const; 57f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 58ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com const Desc& getDesc() { return fDesc; } 599ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 60271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com /** 6128f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com * Attribute indices. These should not overlap. 62271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com */ 639196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int PositionAttributeIdx() { return 0; } 6428f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com static int ColorAttributeIdx() { return 1; } 6528f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com static int CoverageAttributeIdx() { return 2; } 6628f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com static int EdgeAttributeIdx() { return 3; } 6728f6ab4b6e63c7d1d8d46cc6998f91fbb39bfef9bsalomon@google.com static int TexCoordAttributeIdx(int tcIdx) { return 4 + tcIdx; } 68aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 694285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com /** 70a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com * This function uploads uniforms and calls each GrEffect's setData. It is called before a draw 71a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com * occurs using the program after the program has already been bound. 724285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com */ 73706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com void setData(const GrDrawState& drawState); 749196130af83782fcac4334117142475a837dd74dbsalomon@google.com 750d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // Parameters that affect code generation 760d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // These structs should be kept compact; they are the input to an 770d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // expensive hash key generator. 789ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com struct Desc { 799ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com Desc() { 804285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com // since we use this as part of a key we can't have any uninitialized 814be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com // padding 829ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com memset(this, 0, sizeof(Desc)); 839ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com } 849ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 859ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com // returns this as a uint32_t array to be used as a key in the program cache 869ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com const uint32_t* asKey() const { 879ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com return reinterpret_cast<const uint32_t*>(this); 884be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com } 894be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com 900d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com struct StageDesc { 910d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com enum OptFlagBits { 920d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kNoPerspective_OptFlagBit = 1 << 0, 930d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kIdentityMatrix_OptFlagBit = 1 << 1, 940d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kIsEnabled_OptFlagBit = 1 << 7 950d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 96b505a128efae9debcaa9642bade90bab5525d477bsalomon@google.com 970d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fOptFlags; 980d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com 9907eecdca3e331eb4066c53a29305aeea6d692961tomhudson@google.com /** Non-zero if user-supplied code will write the stage's 10007eecdca3e331eb4066c53a29305aeea6d692961tomhudson@google.com contribution to the fragment shader. */ 101a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com GrProgramStageFactory::StageKey fCustomStageKey; 10207eecdca3e331eb4066c53a29305aeea6d692961tomhudson@google.com 1030d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com inline bool isEnabled() const { 104c2c9b97e603fbccf04d29a550bf73709340ffe7dbsalomon@google.com return SkToBool(fOptFlags & kIsEnabled_OptFlagBit); 1050d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com } 1060d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com inline void setEnabled(bool newValue) { 1070d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com if (newValue) { 1080d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com fOptFlags |= kIsEnabled_OptFlagBit; 1090d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com } else { 1100d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com fOptFlags &= ~kIsEnabled_OptFlagBit; 1110d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com } 1120d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com } 1130d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 1140d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com 1154285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com // Specifies where the initial color comes from before the stages are applied. 11685b505bedc35369283ca3aa4449962622842b720bsalomon@google.com enum ColorInput { 11785b505bedc35369283ca3aa4449962622842b720bsalomon@google.com kSolidWhite_ColorInput, 11885b505bedc35369283ca3aa4449962622842b720bsalomon@google.com kTransBlack_ColorInput, 11985b505bedc35369283ca3aa4449962622842b720bsalomon@google.com kAttribute_ColorInput, 12085b505bedc35369283ca3aa4449962622842b720bsalomon@google.com kUniform_ColorInput, 12186c1f71625970610e768d3bf26c933db2cd685babsalomon@google.com 12285b505bedc35369283ca3aa4449962622842b720bsalomon@google.com kColorInputCnt 1230d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 1240d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // Dual-src blending makes use of a secondary output color that can be 1254285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com // used as a per-pixel blend coefficient. This controls whether a 126271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // secondary source is output and what value it holds. 127271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com enum DualSrcOutput { 128271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kNone_DualSrcOutput, 129271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kCoverage_DualSrcOutput, 130271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kCoverageISA_DualSrcOutput, 131271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kCoverageISC_DualSrcOutput, 1321e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com 133271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kDualSrcOutputCnt 1340d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 135f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1369381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com GrDrawState::VertexEdgeType fVertexEdgeType; 137aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 1384285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com // stripped of bits that don't affect program generation 1390d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com GrVertexLayout fVertexLayout; 14097c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 1419381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com StageDesc fStages[GrDrawState::kNumStages]; 142f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 143edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com // To enable experimental geometry shader code (not for use in 144edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com // production) 145edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com#if GR_GL_EXPERIMENTAL_GS 146edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com bool fExperimentalGS; 147edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com#endif 148edfe1aac5c6f3a3f3830e86ddea8dbceeb0e6df4bsalomon@google.com 14985b505bedc35369283ca3aa4449962622842b720bsalomon@google.com uint8_t fColorInput; // casts to enum ColorInput 1502401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com uint8_t fCoverageInput; // casts to enum CoverageInput 15185b505bedc35369283ca3aa4449962622842b720bsalomon@google.com uint8_t fDualSrcOutput; // casts to enum DualSrcOutput 1520d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com int8_t fFirstCoverageStage; 1530d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com SkBool8 fEmitsPointSize; 154f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1550d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fColorFilterXfermode; // casts to enum SkXfermode::Mode 1569ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com }; 1579ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GR_STATIC_ASSERT(!(sizeof(Desc) % 4)); 158f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 15922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com // for code readability 1609ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com typedef Desc::StageDesc StageDesc; 16122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com 1622a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.comprivate: 163f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com struct StageUniforms; 164f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com 165ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com GrGLProgram(const GrGLContextInfo& gl, 166ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com const Desc& desc, 167a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com const GrEffect** customStages); 168ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com 169ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com bool succeeded() const { return 0 != fProgramID; } 170ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com 171ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com /** 1724285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com * This is the heavy initialization routine for building a GLProgram. 173ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com */ 174a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com bool genProgram(const GrEffect** customStages); 175ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com 1769ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com void genInputColor(GrGLShaderBuilder* builder, SkString* inColor); 1772a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.com 178a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com static GrGLProgramStage* GenStageCode(const GrEffect* stage, 179f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com const StageDesc& desc, // TODO: Eliminate this 180f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com StageUniforms* stageUniforms, // TODO: Eliminate this 181f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com const char* fsInColor, // NULL means no incoming color 182f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com const char* fsOutColor, 183f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com const char* vsInCoord, 184f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com GrGLShaderBuilder* builder); 1852a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.com 186ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com void genGeometryShader(GrGLShaderBuilder* segments) const; 1879ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 188dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com typedef GrGLUniformManager::UniformHandle UniformHandle; 189dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 1909ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com void genUniformCoverage(GrGLShaderBuilder* segments, SkString* inOutCoverage); 1919ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 192d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com // generates code to compute coverage based on edge AA. Returns true if edge coverage was 193d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com // inserted in which case coverageVar will be updated to refer to a scalar. Otherwise, 194d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com // coverageVar is set to an empty string. 195d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com bool genEdgeCoverage(SkString* coverageVar, GrGLShaderBuilder* builder) const; 1969ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 1979ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com // Creates a GL program ID, binds shader attributes to GL vertex attrs, and links the program 198ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com bool bindOutputsAttribsAndLinkProgram(SkString texCoordAttrNames[GrDrawState::kMaxTexCoords], 1999ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com bool bindColorOut, 2009ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com bool bindDualSrcOut); 2019ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 202dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com // Sets the texture units for samplers 203dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com void initSamplerUniforms(); 2049ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 205ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com bool compileShaders(const GrGLShaderBuilder& builder); 2069ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 2079ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com const char* adjustInColor(const SkString& inColor) const; 2089196130af83782fcac4334117142475a837dd74dbsalomon@google.com 209dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com struct StageUniforms { 210dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com UniformHandle fTextureMatrixUni; 2110982d35187da7e1ed6c0eba5951bbdadca8b33e7bsalomon@google.com SkTArray<UniformHandle, true> fSamplerUniforms; 212dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com StageUniforms() { 213dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com fTextureMatrixUni = GrGLUniformManager::kInvalidUniformHandle; 2149196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 215f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 216f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 217dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com struct Uniforms { 218dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com UniformHandle fViewMatrixUni; 219dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com UniformHandle fColorUni; 220dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com UniformHandle fCoverageUni; 221dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com UniformHandle fColorFilterUni; 222706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com // We use the render target height to provide a y-down frag coord when specifying 223706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com // origin_upper_left is not supported. 224706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com UniformHandle fRTHeight; 225dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com StageUniforms fStages[GrDrawState::kNumStages]; 226dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com Uniforms() { 227dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com fViewMatrixUni = GrGLUniformManager::kInvalidUniformHandle; 228dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com fColorUni = GrGLUniformManager::kInvalidUniformHandle; 229dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com fCoverageUni = GrGLUniformManager::kInvalidUniformHandle; 230dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com fColorFilterUni = GrGLUniformManager::kInvalidUniformHandle; 231706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com fRTHeight = GrGLUniformManager::kInvalidUniformHandle; 2329196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 233f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 234f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 2359ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com // IDs 2369ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrGLuint fVShaderID; 2379ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrGLuint fGShaderID; 2389ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrGLuint fFShaderID; 2399ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrGLuint fProgramID; 2409ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 2419ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com // The matrix sent to GL is determined by both the client's matrix and 2429ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com // the size of the viewport. 2439ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrMatrix fViewMatrix; 2449ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com SkISize fViewportSize; 2459ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 2469ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com // these reflect the current values of uniforms 2479ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com // (GL uniform values travel with program) 2489ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrColor fColor; 2499ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrColor fCoverage; 2509ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrColor fColorFilterColor; 251706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com int fRTHeight; 2522f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com /// When it is sent to GL, the texture matrix will be flipped if the texture orientation 2532f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com /// (below) requires. 2549ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrMatrix fTextureMatrices[GrDrawState::kNumStages]; 2559ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrGLTexture::Orientation fTextureOrientation[GrDrawState::kNumStages]; 2569ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 2579ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com GrGLProgramStage* fProgramStage[GrDrawState::kNumStages]; 2589ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 2599ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com Desc fDesc; 260ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com const GrGLContextInfo& fContextInfo; 2619ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 262dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com GrGLUniformManager fUniformManager; 263dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com Uniforms fUniforms; 264dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 2659ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com friend class GrGpuGL; // TODO: remove this by adding getters and moving functionality. 2669ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 2679ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com typedef GrRefCnt INHERITED; 268f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}; 269f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 270f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif 271