GrGLProgram.h revision 97c88c255cff3dbb8343c5d090526fdbedad6dd6
1f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/* 2f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com Copyright 2011 Google Inc. 3f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 4f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com Licensed under the Apache License, Version 2.0 (the "License"); 5f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com you may not use this file except in compliance with the License. 6f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com You may obtain a copy of the License at 7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 8f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com http://www.apache.org/licenses/LICENSE-2.0 9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com Unless required by applicable law or agreed to in writing, software 11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com distributed under the License is distributed on an "AS IS" BASIS, 12f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com See the License for the specific language governing permissions and 14f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com limitations under the License. 15f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 16f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 17f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED 18f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED 19f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 20f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#include "GrGLInterface.h" 219196130af83782fcac4334117142475a837dd74dbsalomon@google.com#include "GrStringBuilder.h" 22f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#include "GrDrawTarget.h" 23f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 2497c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h" 2597c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 26f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrBinHashKeyBuilder; 27f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrGLEffect; 28f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comstruct ShaderCodeSegments; 29f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 30f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/** 31f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information. 32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant 33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations 34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location 35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it 36f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the 37f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change. 38f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 39f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrGLProgram { 40f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic: 41f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com class CachedData; 42f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 43f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLProgram(); 44f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com ~GrGLProgram(); 45f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 46f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 47f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Streams data that can uniquely identifies the generated 48f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * gpu program into a key, for cache indexing purposes. 49f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * 50f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * @param key The key object to receive the key data 51f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 52f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void buildKey(GrBinHashKeyBuilder& key) const; 53f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 54f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 55f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This is the heavy initilization routine for building a GLProgram. 56f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * The result of heavy init is not stored in datamembers of GrGLProgam, 57f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * but in a separate cacheable container. 58f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 599196130af83782fcac4334117142475a837dd74dbsalomon@google.com bool genProgram(CachedData* programData) const; 60f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 61f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 62f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Routine that is called before rendering. Sets-up all the state and 63f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * other initializations required for the Gpu Program to run. 64f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 65f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com bool doGLSetup(GrPrimitiveType type, CachedData* programData) const; 66f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 67f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 68f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Routine that is called after rendering. Performs state restoration. 69f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * May perform secondary render passes. 70f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 71f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void doGLPost() const; 72f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 73f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 74f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Configures the GrGLProgram based on the state of a GrDrawTarget 75f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * object. This is the fast and light initialization. Retrieves all the 76f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * state that is required for performing the heavy init (i.e. genProgram), 77f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * or for retrieving heavy init results from cache. 78f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 79f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void buildFromTarget(const GrDrawTarget* target); 80f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 819196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int PositionAttributeIdx() { return 0; } 829196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int TexCoordAttributeIdx(int tcIdx) { return 1 + tcIdx; } 839196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int ColorAttributeIdx() { return 1 + GrDrawTarget::kMaxTexCoords; } 849196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int ViewMatrixAttributeIdx() { 859196130af83782fcac4334117142475a837dd74dbsalomon@google.com return 2 + GrDrawTarget::kMaxTexCoords; 869196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 879196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int TextureMatrixAttributeIdx(int stage) { 889196130af83782fcac4334117142475a837dd74dbsalomon@google.com return 5 + GrDrawTarget::kMaxTexCoords + 3 * stage; 899196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 909196130af83782fcac4334117142475a837dd74dbsalomon@google.com 91f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comprivate: 92f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 93f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com //Parameters that affect code generation 94f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com struct ProgramDesc { 954be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com ProgramDesc() { 964be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com // since we use this as part of a key we can't have any unitialized 974be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com // padding 984be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com memset(this, 0, sizeof(ProgramDesc)); 994be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com } 1004be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com 1014be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com // stripped of bits that don't affect prog generation 102f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrVertexLayout fVertexLayout; 103f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 104f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com enum { 1054be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com kNone_ColorType = 0, 1064be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com kAttribute_ColorType = 1, 1074be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com kUniform_ColorType = 2, 1084be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com } fColorType; 1094be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com 1104be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com bool fEmitsPointSize; 111f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 11297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo GrColor fColorFilterColor; 11397c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo SkXfermode::Mode fColorFilterXfermode; 11497c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 115f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com struct StageDesc { 116f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com enum OptFlagBits { 117f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kNoPerspective_OptFlagBit = 0x1, 118f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kIdentityMatrix_OptFlagBit = 0x2 119f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 120f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1216aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com unsigned fOptFlags; 1226aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com bool fEnabled; 123f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 124f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com enum Modulation { 125f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kColor_Modulation, 126f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kAlpha_Modulation 1276aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com } fModulation; 1286aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com 1296aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com enum FetchMode { 1306aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com kSingle_FetchMode, 1316aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com k2x2_FetchMode 1326aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com } fFetchMode; 133f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 134f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com enum CoordMapping { 135f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kIdentity_CoordMapping, 136f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kRadialGradient_CoordMapping, 137f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kSweepGradient_CoordMapping, 138f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kRadial2Gradient_CoordMapping 1396aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com } fCoordMapping; 140f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } fStages[GrDrawTarget::kNumStages]; 141f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } fProgramDesc; 142f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1434be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com const ProgramDesc& getDesc() { return fProgramDesc; } 1444be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com 145f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic: 1469196130af83782fcac4334117142475a837dd74dbsalomon@google.com enum { 1479196130af83782fcac4334117142475a837dd74dbsalomon@google.com kUnusedUniform = -1, 1489196130af83782fcac4334117142475a837dd74dbsalomon@google.com kSetAsAttribute = 1000, 1499196130af83782fcac4334117142475a837dd74dbsalomon@google.com }; 1509196130af83782fcac4334117142475a837dd74dbsalomon@google.com 151f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com struct StageUniLocations { 152f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fTextureMatrixUni; 1536aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com GrGLint fNormalizedTexelSizeUni; 154f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fSamplerUni; 155f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fRadial2Uni; 1569196130af83782fcac4334117142475a837dd74dbsalomon@google.com void reset() { 1579196130af83782fcac4334117142475a837dd74dbsalomon@google.com fTextureMatrixUni = kUnusedUniform; 1589196130af83782fcac4334117142475a837dd74dbsalomon@google.com fNormalizedTexelSizeUni = kUnusedUniform; 1599196130af83782fcac4334117142475a837dd74dbsalomon@google.com fSamplerUni = kUnusedUniform; 1609196130af83782fcac4334117142475a837dd74dbsalomon@google.com fRadial2Uni = kUnusedUniform; 1619196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 162f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 163f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 164f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com struct UniLocations { 165f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fViewMatrixUni; 1664be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com GrGLint fColorUni; 16797c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo GrGLint fColorFilterUni; 168f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com StageUniLocations fStages[GrDrawTarget::kNumStages]; 1699196130af83782fcac4334117142475a837dd74dbsalomon@google.com void reset() { 1709196130af83782fcac4334117142475a837dd74dbsalomon@google.com fViewMatrixUni = kUnusedUniform; 1719196130af83782fcac4334117142475a837dd74dbsalomon@google.com fColorUni = kUnusedUniform; 17297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo fColorFilterUni = kUnusedUniform; 1739196130af83782fcac4334117142475a837dd74dbsalomon@google.com for (int s = 0; s < GrDrawTarget::kNumStages; ++s) { 1749196130af83782fcac4334117142475a837dd74dbsalomon@google.com fStages[s].reset(); 1759196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 1769196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 177f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 178f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 179f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com class CachedData : public ::GrNoncopyable { 180f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com public: 181f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com CachedData() { 182f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GR_DEBUGCODE(fEffectUniCount = 0;) 183f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com fEffectUniLocationsExtended = NULL; 184f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 185f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 186f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com ~CachedData() { 187f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrFree(fEffectUniLocationsExtended); 188f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 189f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 190f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void copyAndTakeOwnership(CachedData& other) { 191f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com memcpy(this, &other, sizeof(this)); 192f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com other.fEffectUniLocationsExtended = NULL; // ownership transfer 193f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GR_DEBUGCODE(other.fEffectUniCount = 0;) 194f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 195f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 196f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void setEffectUniformCount(size_t effectUniforms) { 197f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GR_DEBUGCODE(fEffectUniCount = effectUniforms;) 198f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrFree(fEffectUniLocationsExtended); 199f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com if (effectUniforms > kUniLocationPreAllocSize) { 200f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com fEffectUniLocationsExtended = (GrGLint*)GrMalloc(sizeof(GrGLint)*(effectUniforms-kUniLocationPreAllocSize)); 201f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } else { 202f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com fEffectUniLocationsExtended = NULL; 203f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 204f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 205f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 206f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint& effectUniLocation(size_t index) { 207f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrAssert(index < fEffectUniCount); 208f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com return (index < kUniLocationPreAllocSize) ? 209f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com fEffectUniLocations[index] : 210f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com fEffectUniLocationsExtended[index - kUniLocationPreAllocSize]; 211f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 212f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 213f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com public: 214f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 215f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // IDs 216f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLuint fVShaderID; 217f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLuint fFShaderID; 218f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLuint fProgramID; 219f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // shader uniform locations (-1 if shader doesn't use them) 220f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com UniLocations fUniLocations; 221f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 222f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrMatrix fViewMatrix; 223f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 224f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // these reflect the current values of uniforms 225f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // (GL uniform values travel with program) 2264be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com GrColor fColor; 22797c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo GrColor fColorFilterColor; 228f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrMatrix fTextureMatrices[GrDrawTarget::kNumStages]; 2296aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com // width and height used for normalized texel size 2306aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com int fTextureWidth[GrDrawTarget::kNumStages]; 2316aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com int fTextureHeight[GrDrawTarget::kNumStages]; 232f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrScalar fRadial2CenterX1[GrDrawTarget::kNumStages]; 233f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrScalar fRadial2Radius0[GrDrawTarget::kNumStages]; 234f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com bool fRadial2PosRoot[GrDrawTarget::kNumStages]; 235f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 236f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com private: 237f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com enum Constants { 238f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kUniLocationPreAllocSize = 8 239f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 240f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 241f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fEffectUniLocations[kUniLocationPreAllocSize]; 242f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint* fEffectUniLocationsExtended; 243f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GR_DEBUGCODE(size_t fEffectUniCount;) 244f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; // CachedData 245f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 246f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLEffect* fStageEffects[GrDrawTarget::kNumStages]; 247f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 248f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comprivate: 2499196130af83782fcac4334117142475a837dd74dbsalomon@google.com enum { 2509196130af83782fcac4334117142475a837dd74dbsalomon@google.com kUseUniform = 2000 2519196130af83782fcac4334117142475a837dd74dbsalomon@google.com }; 2529196130af83782fcac4334117142475a837dd74dbsalomon@google.com 2539196130af83782fcac4334117142475a837dd74dbsalomon@google.com // should set all fields in locations var to kUseUniform if the 2549196130af83782fcac4334117142475a837dd74dbsalomon@google.com // corresponding uniform is required for the program. 255f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void genStageCode(int stageNum, 256f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const ProgramDesc::StageDesc& desc, 257f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const char* fsInColor, // NULL means no incoming color 258f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const char* fsOutColor, 259f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const char* vsInCoord, 260f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com ShaderCodeSegments* segments, 261f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com StageUniLocations* locations) const; 262f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 2639196130af83782fcac4334117142475a837dd74dbsalomon@google.com static bool CompileFSAndVS(const ShaderCodeSegments& segments, 2649196130af83782fcac4334117142475a837dd74dbsalomon@google.com CachedData* programData); 2659196130af83782fcac4334117142475a837dd74dbsalomon@google.com 266f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // Compiles a GL shader, returns shader ID or 0 if failed 267f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // params have same meaning as glShaderSource 268f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com static GrGLuint CompileShader(GrGLenum type, int stringCnt, 269f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const char** strings, 270f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com int* stringLengths); 271f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 2729196130af83782fcac4334117142475a837dd74dbsalomon@google.com // Creates a GL program ID, binds shader attributes to GL vertex attrs, and 2739196130af83782fcac4334117142475a837dd74dbsalomon@google.com // links the program 2749196130af83782fcac4334117142475a837dd74dbsalomon@google.com bool bindAttribsAndLinkProgram(GrStringBuilder texCoordAttrNames[GrDrawTarget::kMaxTexCoords], 2759196130af83782fcac4334117142475a837dd74dbsalomon@google.com CachedData* programData) const; 2769196130af83782fcac4334117142475a837dd74dbsalomon@google.com 2779196130af83782fcac4334117142475a837dd74dbsalomon@google.com // Gets locations for all uniforms set to kUseUniform and initializes cache 2789196130af83782fcac4334117142475a837dd74dbsalomon@google.com // to invalid values. 2799196130af83782fcac4334117142475a837dd74dbsalomon@google.com void getUniformLocationsAndInitCache(CachedData* programData) const; 2809196130af83782fcac4334117142475a837dd74dbsalomon@google.com 281f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com friend class GrGpuGLShaders; 282f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}; 283f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 284f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif 285