GrGLProgram.h revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
1f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 8f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED 11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED 12f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 13f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#include "GrGLInterface.h" 149196130af83782fcac4334117142475a837dd74dbsalomon@google.com#include "GrStringBuilder.h" 15271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "GrGpu.h" 16f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1797c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h" 1897c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 19f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrBinHashKeyBuilder; 20d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com 21d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.comstruct ShaderCodeSegments { 22271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com GrStringBuilder fHeader; // VS+FS, GLSL version, etc 23d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com GrStringBuilder fVSUnis; 24d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com GrStringBuilder fVSAttrs; 25d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com GrStringBuilder fVaryings; 26d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com GrStringBuilder fFSUnis; 27271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com GrStringBuilder fFSOutputs; 28129b8e3237b80b9d258a8f48e8f54c0073cafbdcsenorblanco@chromium.org GrStringBuilder fFSFunctions; 29d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com GrStringBuilder fVSCode; 30d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com GrStringBuilder fFSCode; 31d31cbc465088a253b5574b0305e09f9301b2bf81junov@google.com}; 32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/** 34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information. 35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant 36f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations 37f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location 38f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it 39f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the 40f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change. 41f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 42f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrGLProgram { 43f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic: 44f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com class CachedData; 45f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 46f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLProgram(); 47f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com ~GrGLProgram(); 48f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 49f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 50f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Streams data that can uniquely identifies the generated 51f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * gpu program into a key, for cache indexing purposes. 52f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * 53f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * @param key The key object to receive the key data 54f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 55f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void buildKey(GrBinHashKeyBuilder& key) const; 56f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 57f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 58f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This is the heavy initilization routine for building a GLProgram. 59f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * The result of heavy init is not stored in datamembers of GrGLProgam, 60f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * but in a separate cacheable container. 61f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 629196130af83782fcac4334117142475a837dd74dbsalomon@google.com bool genProgram(CachedData* programData) const; 63f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 64271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com /** 65271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com * The shader may modify the blend coeffecients. Params are in/out 66271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com */ 67271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const; 68271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 69271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com /** 70271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com * Attribute indices 71271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com */ 729196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int PositionAttributeIdx() { return 0; } 739196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int TexCoordAttributeIdx(int tcIdx) { return 1 + tcIdx; } 749196130af83782fcac4334117142475a837dd74dbsalomon@google.com static int ColorAttributeIdx() { return 1 + GrDrawTarget::kMaxTexCoords; } 750d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com static int ViewMatrixAttributeIdx() { 760d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com return 2 + GrDrawTarget::kMaxTexCoords; 779196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 780d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com static int TextureMatrixAttributeIdx(int stage) { 790d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com return 5 + GrDrawTarget::kMaxTexCoords + 3 * stage; 809196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 819196130af83782fcac4334117142475a837dd74dbsalomon@google.com 82f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comprivate: 83f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 840d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // Parameters that affect code generation 850d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // These structs should be kept compact; they are the input to an 860d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // expensive hash key generator. 87f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com struct ProgramDesc { 884be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com ProgramDesc() { 894be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com // since we use this as part of a key we can't have any unitialized 904be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com // padding 914be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com memset(this, 0, sizeof(ProgramDesc)); 924be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com } 934be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com 940d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com struct StageDesc { 950d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com enum OptFlagBits { 960d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kNoPerspective_OptFlagBit = 1 << 0, 970d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kIdentityMatrix_OptFlagBit = 1 << 1, 980d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kCustomTextureDomain_OptFlagBit = 1 << 2, 990d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kIsEnabled_OptFlagBit = 1 << 7 1000d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 1010d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com enum Modulation { 1020d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kColor_Modulation, 1031e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com kAlpha_Modulation, 1041e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com 1051e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com kModulationCnt 1060d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 1070d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com enum FetchMode { 1080d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kSingle_FetchMode, 1091e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com k2x2_FetchMode, 110027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org kConvolution_FetchMode, 1111e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com 1121e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com kFetchModeCnt, 1130d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 1140d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com enum CoordMapping { 1150d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kIdentity_CoordMapping, 1160d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kRadialGradient_CoordMapping, 1170d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com kSweepGradient_CoordMapping, 1181e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com kRadial2Gradient_CoordMapping, 11922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com // need different shader computation when quadratic 12022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com // eq describing the gradient degenerates to a linear eq. 12122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com kRadial2GradientDegenerate_CoordMapping, 1221e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com kCoordMappingCnt 1230d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 124f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1250d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fOptFlags; 1260d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fModulation; // casts to enum Modulation 1270d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fFetchMode; // casts to enum FetchMode 1280d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fCoordMapping; // casts to enum CoordMapping 129027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org uint8_t fKernelWidth; 1300d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com 1310d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com inline bool isEnabled() const { 1320d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com return fOptFlags & kIsEnabled_OptFlagBit; 1330d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com } 1340d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com inline void setEnabled(bool newValue) { 1350d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com if (newValue) { 1360d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com fOptFlags |= kIsEnabled_OptFlagBit; 1370d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com } else { 1380d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com fOptFlags &= ~kIsEnabled_OptFlagBit; 1390d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com } 1400d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com } 1410d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 1420d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com 1430d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com enum ColorType { 1444be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com kNone_ColorType = 0, 1454be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com kAttribute_ColorType = 1, 1464be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com kUniform_ColorType = 2, 1470d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 1480d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // Dual-src blending makes use of a secondary output color that can be 149271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // used as a per-pixel blend coeffecient. This controls whether a 150271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // secondary source is output and what value it holds. 151271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com enum DualSrcOutput { 152271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kNone_DualSrcOutput, 153271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kCoverage_DualSrcOutput, 154271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kCoverageISA_DualSrcOutput, 155271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kCoverageISC_DualSrcOutput, 1561e257a5db32e1c9e3b0dba80f43470816ef948afbsalomon@google.com 157271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com kDualSrcOutputCnt 1580d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com }; 159f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1600d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com // stripped of bits that don't affect prog generation 1610d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com GrVertexLayout fVertexLayout; 16297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 1630d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com StageDesc fStages[GrDrawTarget::kNumStages]; 164f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1650d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fColorType; // casts to enum ColorType 1660d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fDualSrcOutput; // casts to enum DualSrcOutput 1670d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com int8_t fFirstCoverageStage; 1680d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com SkBool8 fEmitsPointSize; 169129b8e3237b80b9d258a8f48e8f54c0073cafbdcsenorblanco@chromium.org SkBool8 fEdgeAAConcave; 170f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1710d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com int8_t fEdgeAANumEdges; 1720d831725f6d3e68650c8d3cbcafd7f4986b4b2cctomhudson@google.com uint8_t fColorFilterXfermode; // casts to enum SkXfermode::Mode 1736aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com 174129b8e3237b80b9d258a8f48e8f54c0073cafbdcsenorblanco@chromium.org uint8_t fPadTo32bLengthMultiple [1]; 175f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 176f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } fProgramDesc; 177f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1784be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com const ProgramDesc& getDesc() { return fProgramDesc; } 1794be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com 18022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com // for code readability 18122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com typedef ProgramDesc::StageDesc StageDesc; 18222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com 183f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic: 1849196130af83782fcac4334117142475a837dd74dbsalomon@google.com enum { 1859196130af83782fcac4334117142475a837dd74dbsalomon@google.com kUnusedUniform = -1, 1869196130af83782fcac4334117142475a837dd74dbsalomon@google.com kSetAsAttribute = 1000, 1879196130af83782fcac4334117142475a837dd74dbsalomon@google.com }; 1889196130af83782fcac4334117142475a837dd74dbsalomon@google.com 189f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com struct StageUniLocations { 190f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fTextureMatrixUni; 1916aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com GrGLint fNormalizedTexelSizeUni; 192f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fSamplerUni; 193f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fRadial2Uni; 1946acc9b3d2b26d11d3da5eb81775d67a0410d1ae7junov@google.com GrGLint fTexDomUni; 195027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org GrGLint fKernelUni; 196027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org GrGLint fImageIncrementUni; 1979196130af83782fcac4334117142475a837dd74dbsalomon@google.com void reset() { 1989196130af83782fcac4334117142475a837dd74dbsalomon@google.com fTextureMatrixUni = kUnusedUniform; 1999196130af83782fcac4334117142475a837dd74dbsalomon@google.com fNormalizedTexelSizeUni = kUnusedUniform; 2009196130af83782fcac4334117142475a837dd74dbsalomon@google.com fSamplerUni = kUnusedUniform; 2019196130af83782fcac4334117142475a837dd74dbsalomon@google.com fRadial2Uni = kUnusedUniform; 2026acc9b3d2b26d11d3da5eb81775d67a0410d1ae7junov@google.com fTexDomUni = kUnusedUniform; 203027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org fKernelUni = kUnusedUniform; 204027de5f922e8ad1acc5402829f716b8c513fdd8dsenorblanco@chromium.org fImageIncrementUni = kUnusedUniform; 2059196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 206f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 207f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 208f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com struct UniLocations { 209f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLint fViewMatrixUni; 2104be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com GrGLint fColorUni; 21192e0f222fb311a296acd081c1216d6b9652347ebsenorblanco@chromium.org GrGLint fEdgesUni; 21297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo GrGLint fColorFilterUni; 213f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com StageUniLocations fStages[GrDrawTarget::kNumStages]; 2149196130af83782fcac4334117142475a837dd74dbsalomon@google.com void reset() { 2159196130af83782fcac4334117142475a837dd74dbsalomon@google.com fViewMatrixUni = kUnusedUniform; 2169196130af83782fcac4334117142475a837dd74dbsalomon@google.com fColorUni = kUnusedUniform; 21792e0f222fb311a296acd081c1216d6b9652347ebsenorblanco@chromium.org fEdgesUni = kUnusedUniform; 21897c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo fColorFilterUni = kUnusedUniform; 2199196130af83782fcac4334117142475a837dd74dbsalomon@google.com for (int s = 0; s < GrDrawTarget::kNumStages; ++s) { 2209196130af83782fcac4334117142475a837dd74dbsalomon@google.com fStages[s].reset(); 2219196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 2229196130af83782fcac4334117142475a837dd74dbsalomon@google.com } 223f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 224f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 225f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com class CachedData : public ::GrNoncopyable { 226f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com public: 227f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com CachedData() { 228f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 229f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 230f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com ~CachedData() { 231f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 232f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 233f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void copyAndTakeOwnership(CachedData& other) { 2342d9ddf9df12b900b7dbe9b9c627757595f8ed289bsalomon@google.com memcpy(this, &other, sizeof(*this)); 235f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com } 236f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 237f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com public: 238f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 239f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // IDs 240f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLuint fVShaderID; 241f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLuint fFShaderID; 242f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrGLuint fProgramID; 243f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // shader uniform locations (-1 if shader doesn't use them) 244f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com UniLocations fUniLocations; 245f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 246f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrMatrix fViewMatrix; 247f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 248f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // these reflect the current values of uniforms 249f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // (GL uniform values travel with program) 2504be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com GrColor fColor; 25197c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo GrColor fColorFilterColor; 252f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrMatrix fTextureMatrices[GrDrawTarget::kNumStages]; 2536aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com // width and height used for normalized texel size 2546aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com int fTextureWidth[GrDrawTarget::kNumStages]; 2556aef1fb4ebf8b8b2ed352eb81e961565fbbd56cbbsalomon@google.com int fTextureHeight[GrDrawTarget::kNumStages]; 256f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrScalar fRadial2CenterX1[GrDrawTarget::kNumStages]; 257f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrScalar fRadial2Radius0[GrDrawTarget::kNumStages]; 258f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com bool fRadial2PosRoot[GrDrawTarget::kNumStages]; 2592f83940c4db5d17dcb4fd7df24d8002022730a85junov@google.com GrRect fTextureDomain[GrDrawTarget::kNumStages]; 260f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 261f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com private: 262f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com enum Constants { 263f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com kUniLocationPreAllocSize = 8 264f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; 265f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 266f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com }; // CachedData 267f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 268f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comprivate: 2699196130af83782fcac4334117142475a837dd74dbsalomon@google.com enum { 2709196130af83782fcac4334117142475a837dd74dbsalomon@google.com kUseUniform = 2000 2719196130af83782fcac4334117142475a837dd74dbsalomon@google.com }; 2729196130af83782fcac4334117142475a837dd74dbsalomon@google.com 2739196130af83782fcac4334117142475a837dd74dbsalomon@google.com // should set all fields in locations var to kUseUniform if the 2749196130af83782fcac4334117142475a837dd74dbsalomon@google.com // corresponding uniform is required for the program. 275f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com void genStageCode(int stageNum, 276f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const ProgramDesc::StageDesc& desc, 277f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const char* fsInColor, // NULL means no incoming color 278f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const char* fsOutColor, 279f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const char* vsInCoord, 280f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com ShaderCodeSegments* segments, 281f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com StageUniLocations* locations) const; 282f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 2839196130af83782fcac4334117142475a837dd74dbsalomon@google.com static bool CompileFSAndVS(const ShaderCodeSegments& segments, 2849196130af83782fcac4334117142475a837dd74dbsalomon@google.com CachedData* programData); 2859196130af83782fcac4334117142475a837dd74dbsalomon@google.com 286f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // Compiles a GL shader, returns shader ID or 0 if failed 287f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com // params have same meaning as glShaderSource 288f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com static GrGLuint CompileShader(GrGLenum type, int stringCnt, 289f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com const char** strings, 290f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com int* stringLengths); 291f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 2929196130af83782fcac4334117142475a837dd74dbsalomon@google.com // Creates a GL program ID, binds shader attributes to GL vertex attrs, and 2939196130af83782fcac4334117142475a837dd74dbsalomon@google.com // links the program 294271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com bool bindOutputsAttribsAndLinkProgram( 295271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com GrStringBuilder texCoordAttrNames[GrDrawTarget::kMaxTexCoords], 296271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com bool bindColorOut, 297271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com bool bindDualSrcOut, 298271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com CachedData* programData) const; 2999196130af83782fcac4334117142475a837dd74dbsalomon@google.com 3009196130af83782fcac4334117142475a837dd74dbsalomon@google.com // Gets locations for all uniforms set to kUseUniform and initializes cache 3019196130af83782fcac4334117142475a837dd74dbsalomon@google.com // to invalid values. 3029196130af83782fcac4334117142475a837dd74dbsalomon@google.com void getUniformLocationsAndInitCache(CachedData* programData) const; 3039196130af83782fcac4334117142475a837dd74dbsalomon@google.com 304f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com friend class GrGpuGLShaders; 305f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}; 306f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 307f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif 308