1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrGLProgramEffects_DEFINED 9 #define GrGLProgramEffects_DEFINED 10 11 #include "GrBackendProcessorFactory.h" 12 #include "GrGLProgramDataManager.h" 13 #include "GrGpu.h" 14 #include "GrTexture.h" 15 #include "GrTextureAccess.h" 16 17 class GrProcessor; 18 class GrProcessorStage; 19 class GrGLVertexProgramEffectsBuilder; 20 class GrGLProgramBuilder; 21 class GrGLFullProgramBuilder; 22 class GrGLFragmentOnlyProgramBuilder; 23 24 /** 25 * This class encapsulates an array of GrGLProcessors and their supporting data (coord transforms 26 * and textures). It is built with GrGLProgramEffectsBuilder, then used to manage the necessary GL 27 * state and shader uniforms. 28 */ 29 class GrGLProgramEffects : public SkRefCnt { 30 public: 31 typedef GrGLProgramDataManager::UniformHandle UniformHandle; 32 typedef GrGLProgramDataManager::VaryingHandle VaryingHandle; 33 virtual ~GrGLProgramEffects(); 34 35 /** 36 * Assigns a texture unit to each sampler. It starts on *texUnitIdx and writes the next 37 * available unit to *texUnitIdx when it returns. 38 */ 39 void initSamplers(const GrGLProgramDataManager&, int* texUnitIdx); 40 41 /** 42 * Calls setData() on each effect, and sets their transformation matrices and texture bindings. 43 */ 44 virtual void setData(GrGpuGL*, 45 GrGpu::DrawType, 46 const GrGLProgramDataManager&, 47 const GrGeometryStage* effectStages) { 48 SkFAIL("For geometry processor only"); 49 } 50 51 virtual void setData(GrGpuGL*, 52 GrGpu::DrawType, 53 const GrGLProgramDataManager&, 54 const GrFragmentStage* effectStages[]) = 0; 55 56 protected: 57 GrGLProgramEffects(int reserveCount) 58 : fGLProcessors(reserveCount) 59 , fSamplers(reserveCount) { 60 } 61 62 /** 63 * Helper for setData(). Binds all the textures for an effect. 64 */ 65 void bindTextures(GrGpuGL*, const GrProcessor&, int effectIdx); 66 67 struct Sampler { 68 SkDEBUGCODE(Sampler() : fTextureUnit(-1) {}) 69 UniformHandle fUniform; 70 int fTextureUnit; 71 }; 72 73 /* 74 * Helpers for shader builders to build up program effects objects alongside shader code 75 */ 76 void addEffect(GrGLProcessor* effect) { fGLProcessors.push_back(effect); } 77 SkTArray<Sampler, true>& addSamplers() { return fSamplers.push_back(); } 78 79 SkTArray<GrGLProcessor*> fGLProcessors; 80 SkTArray<SkSTArray<4, Sampler, true> > fSamplers; 81 82 private: 83 friend class GrGLProgramBuilder; 84 friend class GrGLFullProgramBuilder; 85 friend class GrGLFragmentOnlyShaderBuilder; 86 87 typedef SkRefCnt INHERITED; 88 }; 89 90 //////////////////////////////////////////////////////////////////////////////// 91 92 /** 93 * This is a GrGLProgramEffects implementation that does coord transforms with the vertex shader. 94 */ 95 class GrGLVertexProgramEffects : public GrGLProgramEffects { 96 public: 97 virtual void setData(GrGpuGL*, 98 GrGpu::DrawType, 99 const GrGLProgramDataManager&, 100 const GrGeometryStage* effectStages) SK_OVERRIDE; 101 102 virtual void setData(GrGpuGL*, 103 GrGpu::DrawType, 104 const GrGLProgramDataManager&, 105 const GrFragmentStage* effectStages[]) SK_OVERRIDE; 106 107 private: 108 GrGLVertexProgramEffects(int reserveCount, bool explicitLocalCoords) 109 : INHERITED(reserveCount) 110 , fTransforms(reserveCount) 111 , fHasExplicitLocalCoords(explicitLocalCoords) { 112 } 113 114 struct Transform { 115 Transform() { fCurrentValue = SkMatrix::InvalidMatrix(); } 116 UniformHandle fHandle; 117 SkMatrix fCurrentValue; 118 }; 119 120 struct PathTransform { 121 PathTransform() { fCurrentValue = SkMatrix::InvalidMatrix(); } 122 VaryingHandle fHandle; 123 SkMatrix fCurrentValue; 124 GrSLType fType; 125 }; 126 127 /* 128 * These functions are used by the builders to build up program effects along side the shader 129 * code itself 130 */ 131 SkSTArray<2, Transform, true>& addTransforms() { return fTransforms.push_back(); } 132 SkTArray<PathTransform, true>& addPathTransforms() { return fPathTransforms.push_back(); } 133 134 /** 135 * Helper for setData(). Sets all the transform matrices for an effect. 136 */ 137 void setDataInternal(GrGpuGL* gpu, 138 GrGpu::DrawType drawType, 139 const GrGLProgramDataManager& programDataManager, 140 const GrProcessorStage& effectStage, 141 int index); 142 void setTransformData(GrGpuGL* gpu, const GrGLProgramDataManager&, const GrProcessorStage&, 143 int effectIdx); 144 void setPathTransformData(GrGpuGL* gpu, const GrGLProgramDataManager&, 145 const GrProcessorStage&, int effectIdx); 146 147 148 SkTArray<SkSTArray<2, Transform, true> > fTransforms; 149 SkTArray<SkTArray<PathTransform, true> > fPathTransforms; 150 bool fHasExplicitLocalCoords; 151 152 friend class GrGLFullProgramBuilder; 153 154 typedef GrGLProgramEffects INHERITED; 155 }; 156 157 //////////////////////////////////////////////////////////////////////////////// 158 159 /** 160 * This is a GrGLProgramEffects implementation that does coord transforms with 161 * the the NV_path_rendering PathTexGen functionality. 162 */ 163 class GrGLPathTexGenProgramEffects : public GrGLProgramEffects { 164 public: 165 virtual void setData(GrGpuGL*, 166 GrGpu::DrawType, 167 const GrGLProgramDataManager&, 168 const GrFragmentStage* effectStages[]) SK_OVERRIDE; 169 170 private: 171 GrGLPathTexGenProgramEffects(int reserveCount) 172 : INHERITED(reserveCount) 173 , fTransforms(reserveCount) { 174 } 175 176 /** 177 * Helper for setData(). Sets the PathTexGen state for each transform in an effect. 178 */ 179 void setPathTexGenState(GrGpuGL*, const GrProcessorStage&, int effectIdx); 180 181 struct Transforms { 182 Transforms(int texCoordIndex) 183 : fTexCoordIndex(texCoordIndex) {} 184 int fTexCoordIndex; 185 }; 186 187 /* 188 * Helper for fragment only shader builder to build up the program effects alongside the shader 189 */ 190 void addTransforms(int coordIndex) { 191 fTransforms.push_back(Transforms(coordIndex)); 192 } 193 194 SkTArray<Transforms> fTransforms; 195 196 friend class GrGLFragmentOnlyProgramBuilder; 197 198 typedef GrGLProgramEffects INHERITED; 199 }; 200 201 #endif 202