| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 | 8 |
| 9 #ifndef GrGLProgram_DEFINED | 9 #ifndef GrGLProgram_DEFINED |
| 10 #define GrGLProgram_DEFINED | 10 #define GrGLProgram_DEFINED |
| 11 | 11 |
| 12 #include "GrDrawState.h" | 12 #include "GrDrawState.h" |
| 13 #include "GrGLEffect.h" | |
| 14 #include "GrGLContext.h" | 13 #include "GrGLContext.h" |
| 14 #include "GrGLProgramDesc.h" |
| 15 #include "GrGLSL.h" | 15 #include "GrGLSL.h" |
| 16 #include "GrGLTexture.h" | 16 #include "GrGLTexture.h" |
| 17 #include "GrGLUniformManager.h" | 17 #include "GrGLUniformManager.h" |
| 18 | 18 |
| 19 #include "SkString.h" | 19 #include "SkString.h" |
| 20 #include "SkXfermode.h" | 20 #include "SkXfermode.h" |
| 21 | 21 |
| 22 class GrBinHashKeyBuilder; | 22 class GrBinHashKeyBuilder; |
| 23 class GrGLEffect; | 23 class GrGLEffect; |
| 24 class GrGLShaderBuilder; | 24 class GrGLShaderBuilder; |
| 25 class SkMWCRandom; | 25 class SkMWCRandom; |
| 26 | 26 |
| 27 // optionally compile the experimental GS code. Set to GR_DEBUG | |
| 28 // so that debug build bots will execute the code. | |
| 29 #define GR_GL_EXPERIMENTAL_GS GR_DEBUG | |
| 30 | |
| 31 /** | 27 /** |
| 32 * This class manages a GPU program and records per-program information. | 28 * This class manages a GPU program and records per-program information. |
| 33 * We can specify the attribute locations so that they are constant | 29 * We can specify the attribute locations so that they are constant |
| 34 * across our shaders. But the driver determines the uniform locations | 30 * across our shaders. But the driver determines the uniform locations |
| 35 * at link time. We don't need to remember the sampler uniform location | 31 * at link time. We don't need to remember the sampler uniform location |
| 36 * because we will bind a texture slot to it and never change it | 32 * because we will bind a texture slot to it and never change it |
| 37 * Uniforms are program-local so we can't rely on fHWState to hold the | 33 * Uniforms are program-local so we can't rely on fHWState to hold the |
| 38 * previous uniform state after a program change. | 34 * previous uniform state after a program change. |
| 39 */ | 35 */ |
| 40 class GrGLProgram : public GrRefCnt { | 36 class GrGLProgram : public GrRefCnt { |
| 41 public: | 37 public: |
| 42 SK_DECLARE_INST_COUNT(GrGLProgram) | 38 SK_DECLARE_INST_COUNT(GrGLProgram) |
| 43 | 39 |
| 44 class Desc; | |
| 45 | |
| 46 /** | |
| 47 * Builds a program descriptor from a GrDrawState. Whether the primitive typ
e is points, the | |
| 48 * output of GrDrawState::getBlendOpts, and the caps of the GrGpuGL are also
inputs. | |
| 49 */ | |
| 50 static void BuildDesc(const GrDrawState&, | |
| 51 bool isPoints, | |
| 52 GrDrawState::BlendOptFlags, | |
| 53 GrBlendCoeff srcCoeff, | |
| 54 GrBlendCoeff dstCoeff, | |
| 55 const GrGpuGL* gpu, | |
| 56 Desc* outDesc); | |
| 57 | |
| 58 static GrGLProgram* Create(const GrGLContext& gl, | 40 static GrGLProgram* Create(const GrGLContext& gl, |
| 59 const Desc& desc, | 41 const GrGLProgramDesc& desc, |
| 60 const GrEffectStage* stages[]); | 42 const GrEffectStage* stages[]); |
| 61 | 43 |
| 62 virtual ~GrGLProgram(); | 44 virtual ~GrGLProgram(); |
| 63 | 45 |
| 64 /** | 46 /** |
| 65 * Call to abandon GL objects owned by this program. | 47 * Call to abandon GL objects owned by this program. |
| 66 */ | 48 */ |
| 67 void abandon(); | 49 void abandon(); |
| 68 | 50 |
| 69 /** | 51 /** |
| 70 * The shader may modify the blend coefficients. Params are in/out | 52 * The shader may modify the blend coefficients. Params are in/out |
| 71 */ | 53 */ |
| 72 void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const; | 54 void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const; |
| 73 | 55 |
| 74 const Desc& getDesc() { return fDesc; } | 56 const GrGLProgramDesc& getDesc() { return fDesc; } |
| 75 | 57 |
| 76 /** | 58 /** |
| 77 * Gets the GL program ID for this program. | 59 * Gets the GL program ID for this program. |
| 78 */ | 60 */ |
| 79 GrGLuint programID() const { return fProgramID; } | 61 GrGLuint programID() const { return fProgramID; } |
| 80 | 62 |
| 81 /** | 63 /** |
| 82 * Some GL state that is relevant to programs is not stored per-program. In
particular vertex | 64 * Some GL state that is relevant to programs is not stored per-program. In
particular vertex |
| 83 * attributes are global state. This struct is read and updated by GrGLProgr
am::setData to | 65 * attributes are global state. This struct is read and updated by GrGLProgr
am::setData to |
| 84 * allow us to avoid setting this state redundantly. | 66 * allow us to avoid setting this state redundantly. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 | 98 |
| 117 /** | 99 /** |
| 118 * This function uploads uniforms and calls each GrGLEffect's setData. It is
called before a | 100 * This function uploads uniforms and calls each GrGLEffect's setData. It is
called before a |
| 119 * draw occurs using the program after the program has already been bound. I
t also uses the | 101 * draw occurs using the program after the program has already been bound. I
t also uses the |
| 120 * GrGpuGL object to bind the textures required by the GrGLEffects. | 102 * GrGpuGL object to bind the textures required by the GrGLEffects. |
| 121 * | 103 * |
| 122 * The color and coverage params override the GrDrawState's getColor() and g
etCoverage() values. | 104 * The color and coverage params override the GrDrawState's getColor() and g
etCoverage() values. |
| 123 */ | 105 */ |
| 124 void setData(GrGpuGL*, GrColor color, GrColor coverage, SharedGLState*); | 106 void setData(GrGpuGL*, GrColor color, GrColor coverage, SharedGLState*); |
| 125 | 107 |
| 126 // Parameters that affect code generation | |
| 127 // This structs should be kept compact; it is input to an expensive hash key
generator. | |
| 128 class Desc { | |
| 129 public: | |
| 130 Desc() { | |
| 131 // since we use this as part of a key we can't have any uninitialize
d | |
| 132 // padding | |
| 133 memset(this, 0, sizeof(Desc)); | |
| 134 } | |
| 135 | |
| 136 // returns this as a uint32_t array to be used as a key in the program c
ache | |
| 137 const uint32_t* asKey() const { | |
| 138 return reinterpret_cast<const uint32_t*>(this); | |
| 139 } | |
| 140 | |
| 141 // For unit testing. | |
| 142 void setRandom(SkMWCRandom*, | |
| 143 const GrGpuGL* gpu, | |
| 144 const GrEffectStage stages[GrDrawState::kNumStages]); | |
| 145 | |
| 146 private: | |
| 147 // Specifies where the initial color comes from before the stages are ap
plied. | |
| 148 enum ColorInput { | |
| 149 kSolidWhite_ColorInput, | |
| 150 kTransBlack_ColorInput, | |
| 151 kAttribute_ColorInput, | |
| 152 kUniform_ColorInput, | |
| 153 | |
| 154 kColorInputCnt | |
| 155 }; | |
| 156 // Dual-src blending makes use of a secondary output color that can be | |
| 157 // used as a per-pixel blend coefficient. This controls whether a | |
| 158 // secondary source is output and what value it holds. | |
| 159 enum DualSrcOutput { | |
| 160 kNone_DualSrcOutput, | |
| 161 kCoverage_DualSrcOutput, | |
| 162 kCoverageISA_DualSrcOutput, | |
| 163 kCoverageISC_DualSrcOutput, | |
| 164 | |
| 165 kDualSrcOutputCnt | |
| 166 }; | |
| 167 | |
| 168 // should the FS discard if the coverage is zero (to avoid stencil manip
ulation) | |
| 169 bool fDiscardIfZeroCoverage; | |
| 170 | |
| 171 // stripped of bits that don't affect program generation | |
| 172 GrAttribBindings fAttribBindings; | |
| 173 | |
| 174 /** Non-zero if this stage has an effect */ | |
| 175 GrGLEffect::EffectKey fEffectKeys[GrDrawState::kNumStages]; | |
| 176 | |
| 177 // To enable experimental geometry shader code (not for use in | |
| 178 // production) | |
| 179 #if GR_GL_EXPERIMENTAL_GS | |
| 180 bool fExperimentalGS; | |
| 181 #endif | |
| 182 uint8_t fColorInput; // casts to enum Col
orInput | |
| 183 uint8_t fCoverageInput; // casts to enum Col
orInput | |
| 184 uint8_t fDualSrcOutput; // casts to enum Dua
lSrcOutput | |
| 185 int8_t fFirstCoverageStage; | |
| 186 SkBool8 fEmitsPointSize; | |
| 187 uint8_t fColorFilterXfermode; // casts to enum SkX
fermode::Mode | |
| 188 | |
| 189 int8_t fPositionAttributeIndex; | |
| 190 int8_t fColorAttributeIndex; | |
| 191 int8_t fCoverageAttributeIndex; | |
| 192 int8_t fLocalCoordsAttributeIndex; | |
| 193 | |
| 194 friend class GrGLProgram; | |
| 195 }; | |
| 196 | |
| 197 // Layout information for OpenGL vertex attributes | |
| 198 struct AttribLayout { | |
| 199 GrGLint fCount; | |
| 200 GrGLenum fType; | |
| 201 GrGLboolean fNormalized; | |
| 202 }; | |
| 203 static const AttribLayout kAttribLayouts[kGrVertexAttribTypeCount]; | |
| 204 | |
| 205 private: | 108 private: |
| 206 GrGLProgram(const GrGLContext& gl, | 109 GrGLProgram(const GrGLContext& gl, |
| 207 const Desc& desc, | 110 const GrGLProgramDesc& desc, |
| 208 const GrEffectStage* stages[]); | 111 const GrEffectStage* stages[]); |
| 209 | 112 |
| 210 bool succeeded() const { return 0 != fProgramID; } | 113 bool succeeded() const { return 0 != fProgramID; } |
| 211 | 114 |
| 212 /** | 115 /** |
| 213 * This is the heavy initialization routine for building a GLProgram. | 116 * This is the heavy initialization routine for building a GLProgram. |
| 214 */ | 117 */ |
| 215 bool genProgram(const GrEffectStage* stages[]); | 118 bool genProgram(const GrEffectStage* stages[]); |
| 216 | 119 |
| 217 void genInputColor(GrGLShaderBuilder* builder, SkString* inColor); | 120 void genInputColor(GrGLShaderBuilder* builder, SkString* inColor); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 GrGLuint fProgramID; | 177 GrGLuint fProgramID; |
| 275 | 178 |
| 276 // these reflect the current values of uniforms (GL uniform values travel wi
th program) | 179 // these reflect the current values of uniforms (GL uniform values travel wi
th program) |
| 277 MatrixState fMatrixState; | 180 MatrixState fMatrixState; |
| 278 GrColor fColor; | 181 GrColor fColor; |
| 279 GrColor fCoverage; | 182 GrColor fCoverage; |
| 280 GrColor fColorFilterColor; | 183 GrColor fColorFilterColor; |
| 281 | 184 |
| 282 GrGLEffect* fEffects[GrDrawState::kNumStages]; | 185 GrGLEffect* fEffects[GrDrawState::kNumStages]; |
| 283 | 186 |
| 284 Desc fDesc; | 187 GrGLProgramDesc fDesc; |
| 285 const GrGLContext& fContext; | 188 const GrGLContext& fContext; |
| 286 | 189 |
| 287 GrGLUniformManager fUniformManager; | 190 GrGLUniformManager fUniformManager; |
| 288 UniformHandles fUniformHandles; | 191 UniformHandles fUniformHandles; |
| 289 | 192 |
| 290 typedef GrRefCnt INHERITED; | 193 typedef GrRefCnt INHERITED; |
| 291 }; | 194 }; |
| 292 | 195 |
| 293 #endif | 196 #endif |
| OLD | NEW |