Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Side by Side Diff: src/gpu/gl/GrGLProgram.cpp

Issue 12942014: Move GrGLProgram::Desc out of GrGLProgram. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Move #include below dbl include check Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 #include "GrGLProgram.h" 8 #include "GrGLProgram.h"
9 9
10 #include "GrAllocator.h" 10 #include "GrAllocator.h"
(...skipping 18 matching lines...) Expand all
29 29
30 #define COL_ATTR_NAME "aColor" 30 #define COL_ATTR_NAME "aColor"
31 #define COV_ATTR_NAME "aCoverage" 31 #define COV_ATTR_NAME "aCoverage"
32 #define EDGE_ATTR_NAME "aEdge" 32 #define EDGE_ATTR_NAME "aEdge"
33 33
34 namespace { 34 namespace {
35 inline const char* declared_color_output_name() { return "fsColorOut"; } 35 inline const char* declared_color_output_name() { return "fsColorOut"; }
36 inline const char* dual_source_output_name() { return "dualSourceOut"; } 36 inline const char* dual_source_output_name() { return "dualSourceOut"; }
37 } 37 }
38 38
39 const GrGLProgram::AttribLayout GrGLProgram::kAttribLayouts[kGrVertexAttribTypeC ount] = { 39 void GrGLProgramDesc::Build(const GrDrawState& drawState,
40 {1, GR_GL_FLOAT, false}, // kFloat_GrVertexAttribType
41 {2, GR_GL_FLOAT, false}, // kVec2f_GrVertexAttribType
42 {3, GR_GL_FLOAT, false}, // kVec3f_GrVertexAttribType
43 {4, GR_GL_FLOAT, false}, // kVec4f_GrVertexAttribType
44 {4, GR_GL_UNSIGNED_BYTE, true}, // kVec4ub_GrVertexAttribType
45 };
46
47 void GrGLProgram::BuildDesc(const GrDrawState& drawState,
48 bool isPoints, 40 bool isPoints,
49 GrDrawState::BlendOptFlags blendOpts, 41 GrDrawState::BlendOptFlags blendOpts,
50 GrBlendCoeff srcCoeff, 42 GrBlendCoeff srcCoeff,
51 GrBlendCoeff dstCoeff, 43 GrBlendCoeff dstCoeff,
52 const GrGpuGL* gpu, 44 const GrGpuGL* gpu,
53 Desc* desc) { 45 GrGLProgramDesc* desc) {
54 46
55 // This should already have been caught 47 // This should already have been caught
56 GrAssert(!(GrDrawState::kSkipDraw_BlendOptFlag & blendOpts)); 48 GrAssert(!(GrDrawState::kSkipDraw_BlendOptFlag & blendOpts));
57 49
58 bool skipCoverage = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_BlendO ptFlag); 50 bool skipCoverage = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_BlendO ptFlag);
59 51
60 bool skipColor = SkToBool(blendOpts & (GrDrawState::kEmitTransBlack_BlendOpt Flag | 52 bool skipColor = SkToBool(blendOpts & (GrDrawState::kEmitTransBlack_BlendOpt Flag |
61 GrDrawState::kEmitCoverage_BlendOptFl ag)); 53 GrDrawState::kEmitCoverage_BlendOptFl ag));
62 54
63 // The descriptor is used as a cache key. Thus when a field of the 55 // The descriptor is used as a cache key. Thus when a field of the
(...skipping 23 matching lines...) Expand all
87 79
88 // no reason to do edge aa or look at per-vertex coverage if coverage is ign ored 80 // no reason to do edge aa or look at per-vertex coverage if coverage is ign ored
89 if (skipCoverage) { 81 if (skipCoverage) {
90 desc->fAttribBindings &= ~(GrDrawState::kCoverage_AttribBindingsBit); 82 desc->fAttribBindings &= ~(GrDrawState::kCoverage_AttribBindingsBit);
91 } 83 }
92 84
93 bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_B lendOptFlag); 85 bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_B lendOptFlag);
94 bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFla g) || 86 bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFla g) ||
95 (!requiresAttributeColors && 0xffffffff == drawStat e.getColor()); 87 (!requiresAttributeColors && 0xffffffff == drawStat e.getColor());
96 if (colorIsTransBlack) { 88 if (colorIsTransBlack) {
97 desc->fColorInput = Desc::kTransBlack_ColorInput; 89 desc->fColorInput = kTransBlack_ColorInput;
98 } else if (colorIsSolidWhite) { 90 } else if (colorIsSolidWhite) {
99 desc->fColorInput = Desc::kSolidWhite_ColorInput; 91 desc->fColorInput = kSolidWhite_ColorInput;
100 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeColors) { 92 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeColors) {
101 desc->fColorInput = Desc::kUniform_ColorInput; 93 desc->fColorInput = kUniform_ColorInput;
102 } else { 94 } else {
103 desc->fColorInput = Desc::kAttribute_ColorInput; 95 desc->fColorInput = kAttribute_ColorInput;
104 } 96 }
105 97
106 bool covIsSolidWhite = !requiresAttributeCoverage && 0xffffffff == drawState .getCoverage(); 98 bool covIsSolidWhite = !requiresAttributeCoverage && 0xffffffff == drawState .getCoverage();
107 99
108 if (skipCoverage) { 100 if (skipCoverage) {
109 desc->fCoverageInput = Desc::kTransBlack_ColorInput; 101 desc->fCoverageInput = kTransBlack_ColorInput;
110 } else if (covIsSolidWhite) { 102 } else if (covIsSolidWhite) {
111 desc->fCoverageInput = Desc::kSolidWhite_ColorInput; 103 desc->fCoverageInput = kSolidWhite_ColorInput;
112 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeCoverage) { 104 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeCoverage) {
113 desc->fCoverageInput = Desc::kUniform_ColorInput; 105 desc->fCoverageInput = kUniform_ColorInput;
114 } else { 106 } else {
115 desc->fCoverageInput = Desc::kAttribute_ColorInput; 107 desc->fCoverageInput = kAttribute_ColorInput;
116 } 108 }
117 109
118 int lastEnabledStage = -1; 110 int lastEnabledStage = -1;
119 111
120 for (int s = 0; s < GrDrawState::kNumStages; ++s) { 112 for (int s = 0; s < GrDrawState::kNumStages; ++s) {
121 113
122 bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCove rage; 114 bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCove rage;
123 if (!skip && drawState.isStageEnabled(s)) { 115 if (!skip && drawState.isStageEnabled(s)) {
124 lastEnabledStage = s; 116 lastEnabledStage = s;
125 const GrEffectRef& effect = *drawState.getStage(s).getEffect(); 117 const GrEffectRef& effect = *drawState.getStage(s).getEffect();
126 const GrBackendEffectFactory& factory = effect->getFactory(); 118 const GrBackendEffectFactory& factory = effect->getFactory();
127 bool explicitLocalCoords = (drawState.getAttribBindings() & 119 bool explicitLocalCoords = (drawState.getAttribBindings() &
128 GrDrawState::kLocalCoords_AttribBindings Bit); 120 GrDrawState::kLocalCoords_AttribBindings Bit);
129 GrDrawEffect drawEffect(drawState.getStage(s), explicitLocalCoords); 121 GrDrawEffect drawEffect(drawState.getStage(s), explicitLocalCoords);
130 desc->fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps() ); 122 desc->fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps() );
131 } else { 123 } else {
132 desc->fEffectKeys[s] = 0; 124 desc->fEffectKeys[s] = 0;
133 } 125 }
134 } 126 }
135 127
136 desc->fDualSrcOutput = Desc::kNone_DualSrcOutput; 128 desc->fDualSrcOutput = kNone_DualSrcOutput;
137 129
138 // Currently the experimental GS will only work with triangle prims (and it doesn't do anything 130 // Currently the experimental GS will only work with triangle prims (and it doesn't do anything
139 // other than pass through values from the VS to the FS anyway). 131 // other than pass through values from the VS to the FS anyway).
140 #if GR_GL_EXPERIMENTAL_GS 132 #if GR_GL_EXPERIMENTAL_GS
141 #if 0 133 #if 0
142 desc->fExperimentalGS = gpu->caps().geometryShaderSupport(); 134 desc->fExperimentalGS = gpu->caps().geometryShaderSupport();
143 #else 135 #else
144 desc->fExperimentalGS = false; 136 desc->fExperimentalGS = false;
145 #endif 137 #endif
146 #endif 138 #endif
(...skipping 27 matching lines...) Expand all
174 if (drawState.getStencil().doesWrite()) { 166 if (drawState.getStencil().doesWrite()) {
175 desc->fDiscardIfZeroCoverage = true; 167 desc->fDiscardIfZeroCoverage = true;
176 desc->fFirstCoverageStage = firstCoverageStage; 168 desc->fFirstCoverageStage = firstCoverageStage;
177 } 169 }
178 170
179 if (gpu->caps()->dualSourceBlendingSupport() && 171 if (gpu->caps()->dualSourceBlendingSupport() &&
180 !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag | 172 !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag |
181 GrDrawState::kCoverageAsAlpha_BlendOptFlag))) { 173 GrDrawState::kCoverageAsAlpha_BlendOptFlag))) {
182 if (kZero_GrBlendCoeff == dstCoeff) { 174 if (kZero_GrBlendCoeff == dstCoeff) {
183 // write the coverage value to second color 175 // write the coverage value to second color
184 desc->fDualSrcOutput = Desc::kCoverage_DualSrcOutput; 176 desc->fDualSrcOutput = kCoverage_DualSrcOutput;
185 desc->fFirstCoverageStage = firstCoverageStage; 177 desc->fFirstCoverageStage = firstCoverageStage;
186 } else if (kSA_GrBlendCoeff == dstCoeff) { 178 } else if (kSA_GrBlendCoeff == dstCoeff) {
187 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered. 179 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
188 desc->fDualSrcOutput = Desc::kCoverageISA_DualSrcOutput; 180 desc->fDualSrcOutput = kCoverageISA_DualSrcOutput;
189 desc->fFirstCoverageStage = firstCoverageStage; 181 desc->fFirstCoverageStage = firstCoverageStage;
190 } else if (kSC_GrBlendCoeff == dstCoeff) { 182 } else if (kSC_GrBlendCoeff == dstCoeff) {
191 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered. 183 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
192 desc->fDualSrcOutput = Desc::kCoverageISC_DualSrcOutput; 184 desc->fDualSrcOutput = kCoverageISC_DualSrcOutput;
193 desc->fFirstCoverageStage = firstCoverageStage; 185 desc->fFirstCoverageStage = firstCoverageStage;
194 } 186 }
195 } 187 }
196 } 188 }
197 189
198 desc->fPositionAttributeIndex = drawState.getAttribIndex(GrDrawState::kPosit ion_AttribIndex); 190 desc->fPositionAttributeIndex = drawState.getAttribIndex(GrDrawState::kPosit ion_AttribIndex);
199 if (requiresAttributeColors) { 191 if (requiresAttributeColors) {
200 desc->fColorAttributeIndex = drawState.getAttribIndex(GrDrawState::kColo r_AttribIndex); 192 desc->fColorAttributeIndex = drawState.getAttribIndex(GrDrawState::kColo r_AttribIndex);
201 } else { 193 } else {
202 desc->fColorAttributeIndex = GrDrawState::kColorOverrideAttribIndexValue ; 194 desc->fColorAttributeIndex = GrDrawState::kColorOverrideAttribIndexValue ;
203 } 195 }
204 if (requiresAttributeCoverage) { 196 if (requiresAttributeCoverage) {
205 desc->fCoverageAttributeIndex = drawState.getAttribIndex(GrDrawState::kC overage_AttribIndex); 197 desc->fCoverageAttributeIndex = drawState.getAttribIndex(GrDrawState::kC overage_AttribIndex);
206 } else { 198 } else {
207 desc->fCoverageAttributeIndex = GrDrawState::kCoverageOverrideAttribInde xValue; 199 desc->fCoverageAttributeIndex = GrDrawState::kCoverageOverrideAttribInde xValue;
208 } 200 }
209 if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { 201 if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
210 desc->fLocalCoordsAttributeIndex = drawState.getAttribIndex(GrDrawState: :kLocalCoords_AttribIndex); 202 desc->fLocalCoordsAttributeIndex = drawState.getAttribIndex(GrDrawState: :kLocalCoords_AttribIndex);
211 } 203 }
212 204
213 #if GR_DEBUG 205 #if GR_DEBUG
214 // verify valid vertex attribute state 206 // Verify valid vertex attribute state. These assertions should probably be done somewhere
207 // higher up the callstack
215 const GrVertexAttrib* vertexAttribs = drawState.getVertexAttribs(); 208 const GrVertexAttrib* vertexAttribs = drawState.getVertexAttribs();
216 GrAssert(desc->fPositionAttributeIndex < GrDrawState::kVertexAttribCnt); 209 GrAssert(desc->fPositionAttributeIndex < GrDrawState::kVertexAttribCnt);
217 GrAssert(kAttribLayouts[vertexAttribs[desc->fPositionAttributeIndex].fType]. fCount == 2); 210 GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fPositionAttributeIndex] .fType).fCount == 2);
218 if (requiresAttributeColors) { 211 if (requiresAttributeColors) {
219 GrAssert(desc->fColorAttributeIndex < GrDrawState::kVertexAttribCnt); 212 GrAssert(desc->fColorAttributeIndex < GrDrawState::kVertexAttribCnt);
220 GrAssert(kAttribLayouts[vertexAttribs[desc->fColorAttributeIndex].fType] .fCount == 4); 213 GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fColorAttributeIndex ].fType).fCount == 4);
221 } 214 }
222 if (requiresAttributeCoverage) { 215 if (requiresAttributeCoverage) {
223 GrAssert(desc->fCoverageAttributeIndex < GrDrawState::kVertexAttribCnt); 216 GrAssert(desc->fCoverageAttributeIndex < GrDrawState::kVertexAttribCnt);
224 GrAssert(kAttribLayouts[vertexAttribs[desc->fCoverageAttributeIndex].fTy pe].fCount == 4); 217 GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fCoverageAttributeIn dex].fType).fCount == 4);
225 } 218 }
226 if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { 219 if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
227 GrAssert(desc->fLocalCoordsAttributeIndex < GrDrawState::kVertexAttribCn t); 220 GrAssert(desc->fLocalCoordsAttributeIndex < GrDrawState::kVertexAttribCn t);
228 GrAssert(kAttribLayouts[vertexAttribs[desc->fLocalCoordsAttributeIndex]. fType].fCount == 2); 221 GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fLocalCoordsAttribut eIndex].fType).fCount == 2);
229 } 222 }
230 #endif 223 #endif
231 } 224 }
232 225
233 GrGLProgram* GrGLProgram::Create(const GrGLContext& gl, 226 GrGLProgram* GrGLProgram::Create(const GrGLContext& gl,
234 const Desc& desc, 227 const GrGLProgramDesc& desc,
235 const GrEffectStage* stages[]) { 228 const GrEffectStage* stages[]) {
236 GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gl, desc, stages)); 229 GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gl, desc, stages));
237 if (!program->succeeded()) { 230 if (!program->succeeded()) {
238 delete program; 231 delete program;
239 program = NULL; 232 program = NULL;
240 } 233 }
241 return program; 234 return program;
242 } 235 }
243 236
244 GrGLProgram::GrGLProgram(const GrGLContext& gl, 237 GrGLProgram::GrGLProgram(const GrGLContext& gl,
245 const Desc& desc, 238 const GrGLProgramDesc& desc,
246 const GrEffectStage* stages[]) 239 const GrEffectStage* stages[])
247 : fContext(gl) 240 : fContext(gl)
248 , fUniformManager(gl) { 241 , fUniformManager(gl) {
249 fDesc = desc; 242 fDesc = desc;
250 fVShaderID = 0; 243 fVShaderID = 0;
251 fGShaderID = 0; 244 fGShaderID = 0;
252 fFShaderID = 0; 245 fFShaderID = 0;
253 fProgramID = 0; 246 fProgramID = 0;
254 247
255 fColor = GrColor_ILLEGAL; 248 fColor = GrColor_ILLEGAL;
(...skipping 28 matching lines...) Expand all
284 void GrGLProgram::abandon() { 277 void GrGLProgram::abandon() {
285 fVShaderID = 0; 278 fVShaderID = 0;
286 fGShaderID = 0; 279 fGShaderID = 0;
287 fFShaderID = 0; 280 fFShaderID = 0;
288 fProgramID = 0; 281 fProgramID = 0;
289 } 282 }
290 283
291 void GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff, 284 void GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff,
292 GrBlendCoeff* dstCoeff) const { 285 GrBlendCoeff* dstCoeff) const {
293 switch (fDesc.fDualSrcOutput) { 286 switch (fDesc.fDualSrcOutput) {
294 case Desc::kNone_DualSrcOutput: 287 case GrGLProgramDesc::kNone_DualSrcOutput:
295 break; 288 break;
296 // the prog will write a coverage value to the secondary 289 // the prog will write a coverage value to the secondary
297 // output and the dst is blended by one minus that value. 290 // output and the dst is blended by one minus that value.
298 case Desc::kCoverage_DualSrcOutput: 291 case GrGLProgramDesc::kCoverage_DualSrcOutput:
299 case Desc::kCoverageISA_DualSrcOutput: 292 case GrGLProgramDesc::kCoverageISA_DualSrcOutput:
300 case Desc::kCoverageISC_DualSrcOutput: 293 case GrGLProgramDesc::kCoverageISC_DualSrcOutput:
301 *dstCoeff = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; 294 *dstCoeff = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff;
302 break; 295 break;
303 default: 296 default:
304 GrCrash("Unexpected dual source blend output"); 297 GrCrash("Unexpected dual source blend output");
305 break; 298 break;
306 } 299 }
307 } 300 }
308 301
309 namespace { 302 namespace {
310 303
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 blend_term_string(&constStr, uniformCoeff, filterColor, inColor, filterColor ); 399 blend_term_string(&constStr, uniformCoeff, filterColor, inColor, filterColor );
407 400
408 SkString sum; 401 SkString sum;
409 GrGLSLAdd4f(&sum, colorStr.c_str(), constStr.c_str()); 402 GrGLSLAdd4f(&sum, colorStr.c_str(), constStr.c_str());
410 builder->fsCodeAppendf("\t%s = %s;\n", outputVar, sum.c_str()); 403 builder->fsCodeAppendf("\t%s = %s;\n", outputVar, sum.c_str());
411 } 404 }
412 } 405 }
413 406
414 void GrGLProgram::genInputColor(GrGLShaderBuilder* builder, SkString* inColor) { 407 void GrGLProgram::genInputColor(GrGLShaderBuilder* builder, SkString* inColor) {
415 switch (fDesc.fColorInput) { 408 switch (fDesc.fColorInput) {
416 case GrGLProgram::Desc::kAttribute_ColorInput: { 409 case GrGLProgramDesc::kAttribute_ColorInput: {
417 builder->addAttribute(kVec4f_GrSLType, COL_ATTR_NAME); 410 builder->addAttribute(kVec4f_GrSLType, COL_ATTR_NAME);
418 const char *vsName, *fsName; 411 const char *vsName, *fsName;
419 builder->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName); 412 builder->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName);
420 builder->vsCodeAppendf("\t%s = " COL_ATTR_NAME ";\n", vsName); 413 builder->vsCodeAppendf("\t%s = " COL_ATTR_NAME ";\n", vsName);
421 *inColor = fsName; 414 *inColor = fsName;
422 } break; 415 } break;
423 case GrGLProgram::Desc::kUniform_ColorInput: { 416 case GrGLProgramDesc::kUniform_ColorInput: {
424 const char* name; 417 const char* name;
425 fUniformHandles.fColorUni = builder->addUniform(GrGLShaderBuilder::k Fragment_ShaderType, 418 fUniformHandles.fColorUni = builder->addUniform(GrGLShaderBuilder::k Fragment_ShaderType,
426 kVec4f_GrSLType, "Co lor", &name); 419 kVec4f_GrSLType, "Co lor", &name);
427 *inColor = name; 420 *inColor = name;
428 break; 421 break;
429 } 422 }
430 case GrGLProgram::Desc::kTransBlack_ColorInput: 423 case GrGLProgramDesc::kTransBlack_ColorInput:
431 GrAssert(!"needComputedColor should be false."); 424 GrAssert(!"needComputedColor should be false.");
432 break; 425 break;
433 case GrGLProgram::Desc::kSolidWhite_ColorInput: 426 case GrGLProgramDesc::kSolidWhite_ColorInput:
434 break; 427 break;
435 default: 428 default:
436 GrCrash("Unknown color type."); 429 GrCrash("Unknown color type.");
437 break; 430 break;
438 } 431 }
439 } 432 }
440 433
441 void GrGLProgram::genUniformCoverage(GrGLShaderBuilder* builder, SkString* inOut Coverage) { 434 void GrGLProgram::genUniformCoverage(GrGLShaderBuilder* builder, SkString* inOut Coverage) {
442 const char* covUniName; 435 const char* covUniName;
443 fUniformHandles.fCoverageUni = builder->addUniform(GrGLShaderBuilder::kFragm ent_ShaderType, 436 fUniformHandles.fCoverageUni = builder->addUniform(GrGLShaderBuilder::kFragm ent_ShaderType,
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 "\t}\n" 483 "\t}\n"
491 "\tEndPrimitive();\n"); 484 "\tEndPrimitive();\n");
492 } 485 }
493 #endif 486 #endif
494 } 487 }
495 488
496 const char* GrGLProgram::adjustInColor(const SkString& inColor) const { 489 const char* GrGLProgram::adjustInColor(const SkString& inColor) const {
497 if (inColor.size()) { 490 if (inColor.size()) {
498 return inColor.c_str(); 491 return inColor.c_str();
499 } else { 492 } else {
500 if (Desc::kSolidWhite_ColorInput == fDesc.fColorInput) { 493 if (GrGLProgramDesc::kSolidWhite_ColorInput == fDesc.fColorInput) {
501 return GrGLSLOnesVecf(4); 494 return GrGLSLOnesVecf(4);
502 } else { 495 } else {
503 return GrGLSLZerosVecf(4); 496 return GrGLSLZerosVecf(4);
504 } 497 }
505 } 498 }
506 } 499 }
507 500
508 namespace { 501 namespace {
509 // prints a shader using params similar to glShaderSource 502 // prints a shader using params similar to glShaderSource
510 void print_shader(GrGLint stringCnt, 503 void print_shader(GrGLint stringCnt,
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 (fDesc.fColorFilterXfermode), 622 (fDesc.fColorFilterXfermode),
630 &uniformCoeff, &colorCoeff); 623 &uniformCoeff, &colorCoeff);
631 GR_DEBUGASSERT(success); 624 GR_DEBUGASSERT(success);
632 } else { 625 } else {
633 colorCoeff = SkXfermode::kOne_Coeff; 626 colorCoeff = SkXfermode::kOne_Coeff;
634 uniformCoeff = SkXfermode::kZero_Coeff; 627 uniformCoeff = SkXfermode::kZero_Coeff;
635 } 628 }
636 629
637 // no need to do the color filter if coverage is 0. The output color is scal ed by the coverage. 630 // no need to do the color filter if coverage is 0. The output color is scal ed by the coverage.
638 // All the dual source outputs are scaled by the coverage as well. 631 // All the dual source outputs are scaled by the coverage as well.
639 if (Desc::kTransBlack_ColorInput == fDesc.fCoverageInput) { 632 if (GrGLProgramDesc::kTransBlack_ColorInput == fDesc.fCoverageInput) {
640 colorCoeff = SkXfermode::kZero_Coeff; 633 colorCoeff = SkXfermode::kZero_Coeff;
641 uniformCoeff = SkXfermode::kZero_Coeff; 634 uniformCoeff = SkXfermode::kZero_Coeff;
642 } 635 }
643 636
644 // If we know the final color is going to be all zeros then we can 637 // If we know the final color is going to be all zeros then we can
645 // simplify the color filter coefficients. needComputedColor will then 638 // simplify the color filter coefficients. needComputedColor will then
646 // come out false below. 639 // come out false below.
647 if (Desc::kTransBlack_ColorInput == fDesc.fColorInput) { 640 if (GrGLProgramDesc::kTransBlack_ColorInput == fDesc.fColorInput) {
648 colorCoeff = SkXfermode::kZero_Coeff; 641 colorCoeff = SkXfermode::kZero_Coeff;
649 if (SkXfermode::kDC_Coeff == uniformCoeff || 642 if (SkXfermode::kDC_Coeff == uniformCoeff ||
650 SkXfermode::kDA_Coeff == uniformCoeff) { 643 SkXfermode::kDA_Coeff == uniformCoeff) {
651 uniformCoeff = SkXfermode::kZero_Coeff; 644 uniformCoeff = SkXfermode::kZero_Coeff;
652 } else if (SkXfermode::kIDC_Coeff == uniformCoeff || 645 } else if (SkXfermode::kIDC_Coeff == uniformCoeff ||
653 SkXfermode::kIDA_Coeff == uniformCoeff) { 646 SkXfermode::kIDA_Coeff == uniformCoeff) {
654 uniformCoeff = SkXfermode::kOne_Coeff; 647 uniformCoeff = SkXfermode::kOne_Coeff;
655 } 648 }
656 } 649 }
657 650
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 &fUniformHandles.fSa mplerUnis[s]); 710 &fUniformHandles.fSa mplerUnis[s]);
718 builder.setNonStage(); 711 builder.setNonStage();
719 inColor = outColor; 712 inColor = outColor;
720 } 713 }
721 } 714 }
722 } 715 }
723 716
724 // if have all ones or zeros for the "dst" input to the color filter then we 717 // if have all ones or zeros for the "dst" input to the color filter then we
725 // may be able to make additional optimizations. 718 // may be able to make additional optimizations.
726 if (needColorFilterUniform && needComputedColor && !inColor.size()) { 719 if (needColorFilterUniform && needComputedColor && !inColor.size()) {
727 GrAssert(Desc::kSolidWhite_ColorInput == fDesc.fColorInput); 720 GrAssert(GrGLProgramDesc::kSolidWhite_ColorInput == fDesc.fColorInput);
728 bool uniformCoeffIsZero = SkXfermode::kIDC_Coeff == uniformCoeff || 721 bool uniformCoeffIsZero = SkXfermode::kIDC_Coeff == uniformCoeff ||
729 SkXfermode::kIDA_Coeff == uniformCoeff; 722 SkXfermode::kIDA_Coeff == uniformCoeff;
730 if (uniformCoeffIsZero) { 723 if (uniformCoeffIsZero) {
731 uniformCoeff = SkXfermode::kZero_Coeff; 724 uniformCoeff = SkXfermode::kZero_Coeff;
732 bool bogus; 725 bool bogus;
733 need_blend_inputs(SkXfermode::kZero_Coeff, colorCoeff, 726 need_blend_inputs(SkXfermode::kZero_Coeff, colorCoeff,
734 &needColorFilterUniform, &bogus); 727 &needColorFilterUniform, &bogus);
735 } 728 }
736 } 729 }
737 const char* colorFilterColorUniName = NULL; 730 const char* colorFilterColorUniName = NULL;
(...skipping 13 matching lines...) Expand all
751 const char* color = adjustInColor(inColor); 744 const char* color = adjustInColor(inColor);
752 add_color_filter(&builder, "filteredColor", uniformCoeff, 745 add_color_filter(&builder, "filteredColor", uniformCoeff,
753 colorCoeff, colorFilterColorUniName, color); 746 colorCoeff, colorFilterColorUniName, color);
754 inColor = "filteredColor"; 747 inColor = "filteredColor";
755 } 748 }
756 749
757 /////////////////////////////////////////////////////////////////////////// 750 ///////////////////////////////////////////////////////////////////////////
758 // compute the partial coverage (coverage stages and edge aa) 751 // compute the partial coverage (coverage stages and edge aa)
759 752
760 SkString inCoverage; 753 SkString inCoverage;
761 bool coverageIsZero = Desc::kTransBlack_ColorInput == fDesc.fCoverageInput; 754 bool coverageIsZero = GrGLProgramDesc::kTransBlack_ColorInput == fDesc.fCove rageInput;
762 // we don't need to compute coverage at all if we know the final shader 755 // we don't need to compute coverage at all if we know the final shader
763 // output will be zero and we don't have a dual src blend output. 756 // output will be zero and we don't have a dual src blend output.
764 if (!wroteFragColorZero || Desc::kNone_DualSrcOutput != fDesc.fDualSrcOutput ) { 757 if (!wroteFragColorZero || GrGLProgramDesc::kNone_DualSrcOutput != fDesc.fDu alSrcOutput) {
765 758
766 if (!coverageIsZero) { 759 if (!coverageIsZero) {
767 switch (fDesc.fCoverageInput) { 760 switch (fDesc.fCoverageInput) {
768 case Desc::kSolidWhite_ColorInput: 761 case GrGLProgramDesc::kSolidWhite_ColorInput:
769 // empty string implies solid white 762 // empty string implies solid white
770 break; 763 break;
771 case Desc::kAttribute_ColorInput: 764 case GrGLProgramDesc::kAttribute_ColorInput:
772 gen_attribute_coverage(&builder, &inCoverage); 765 gen_attribute_coverage(&builder, &inCoverage);
773 break; 766 break;
774 case Desc::kUniform_ColorInput: 767 case GrGLProgramDesc::kUniform_ColorInput:
775 this->genUniformCoverage(&builder, &inCoverage); 768 this->genUniformCoverage(&builder, &inCoverage);
776 break; 769 break;
777 default: 770 default:
778 GrCrash("Unexpected input coverage."); 771 GrCrash("Unexpected input coverage.");
779 } 772 }
780 773
781 SkString outCoverage; 774 SkString outCoverage;
782 const int& startStage = fDesc.fFirstCoverageStage; 775 const int& startStage = fDesc.fFirstCoverageStage;
783 for (int s = startStage; s < GrDrawState::kNumStages; ++s) { 776 for (int s = startStage; s < GrDrawState::kNumStages; ++s) {
784 if (fDesc.fEffectKeys[s]) { 777 if (fDesc.fEffectKeys[s]) {
(...skipping 15 matching lines...) Expand all
800 } 793 }
801 794
802 // discard if coverage is zero 795 // discard if coverage is zero
803 if (fDesc.fDiscardIfZeroCoverage && !outCoverage.isEmpty()) { 796 if (fDesc.fDiscardIfZeroCoverage && !outCoverage.isEmpty()) {
804 builder.fsCodeAppendf( 797 builder.fsCodeAppendf(
805 "\tif (all(lessThanEqual(%s, vec4(0.0)))) {\n\t\tdiscard;\n\ t}\n", 798 "\tif (all(lessThanEqual(%s, vec4(0.0)))) {\n\t\tdiscard;\n\ t}\n",
806 outCoverage.c_str()); 799 outCoverage.c_str());
807 } 800 }
808 } 801 }
809 802
810 if (Desc::kNone_DualSrcOutput != fDesc.fDualSrcOutput) { 803 if (GrGLProgramDesc::kNone_DualSrcOutput != fDesc.fDualSrcOutput) {
811 builder.fFSOutputs.push_back().set(kVec4f_GrSLType, 804 builder.fFSOutputs.push_back().set(kVec4f_GrSLType,
812 GrGLShaderVar::kOut_TypeModifier, 805 GrGLShaderVar::kOut_TypeModifier,
813 dual_source_output_name()); 806 dual_source_output_name());
814 bool outputIsZero = coverageIsZero; 807 bool outputIsZero = coverageIsZero;
815 SkString coeff; 808 SkString coeff;
816 if (!outputIsZero && 809 if (!outputIsZero &&
817 Desc::kCoverage_DualSrcOutput != fDesc.fDualSrcOutput && !wroteF ragColorZero) { 810 GrGLProgramDesc::kCoverage_DualSrcOutput != fDesc.fDualSrcOutput && !wroteFragColorZero) {
818 if (!inColor.size()) { 811 if (!inColor.size()) {
819 outputIsZero = true; 812 outputIsZero = true;
820 } else { 813 } else {
821 if (Desc::kCoverageISA_DualSrcOutput == fDesc.fDualSrcOutput ) { 814 if (GrGLProgramDesc::kCoverageISA_DualSrcOutput == fDesc.fDu alSrcOutput) {
822 coeff.printf("(1 - %s.a)", inColor.c_str()); 815 coeff.printf("(1 - %s.a)", inColor.c_str());
823 } else { 816 } else {
824 coeff.printf("(vec4(1,1,1,1) - %s)", inColor.c_str()); 817 coeff.printf("(vec4(1,1,1,1) - %s)", inColor.c_str());
825 } 818 }
826 } 819 }
827 } 820 }
828 if (outputIsZero) { 821 if (outputIsZero) {
829 builder.fsCodeAppendf("\t%s = %s;\n", dual_source_output_name(), GrGLSLZerosVecf(4)); 822 builder.fsCodeAppendf("\t%s = %s;\n", dual_source_output_name(), GrGLSLZerosVecf(4));
830 } else { 823 } else {
831 SkString modulate; 824 SkString modulate;
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1002 } 995 }
1003 } 996 }
1004 } 997 }
1005 } 998 }
1006 999
1007 void GrGLProgram::setColor(const GrDrawState& drawState, 1000 void GrGLProgram::setColor(const GrDrawState& drawState,
1008 GrColor color, 1001 GrColor color,
1009 SharedGLState* sharedState) { 1002 SharedGLState* sharedState) {
1010 if (!(drawState.getAttribBindings() & GrDrawState::kColor_AttribBindingsBit) ) { 1003 if (!(drawState.getAttribBindings() & GrDrawState::kColor_AttribBindingsBit) ) {
1011 switch (fDesc.fColorInput) { 1004 switch (fDesc.fColorInput) {
1012 case GrGLProgram::Desc::kAttribute_ColorInput: 1005 case GrGLProgramDesc::kAttribute_ColorInput:
1013 if (sharedState->fConstAttribColor != color) { 1006 if (sharedState->fConstAttribColor != color) {
1014 // OpenGL ES only supports the float varieties of glVertexAt trib 1007 // OpenGL ES only supports the float varieties of glVertexAt trib
1015 GrGLfloat c[4]; 1008 GrGLfloat c[4];
1016 GrColorToRGBAFloat(color, c); 1009 GrColorToRGBAFloat(color, c);
1017 GL_CALL(VertexAttrib4fv(fDesc.fColorAttributeIndex, c)); 1010 GL_CALL(VertexAttrib4fv(fDesc.fColorAttributeIndex, c));
1018 sharedState->fConstAttribColor = color; 1011 sharedState->fConstAttribColor = color;
1019 } 1012 }
1020 break; 1013 break;
1021 case GrGLProgram::Desc::kUniform_ColorInput: 1014 case GrGLProgramDesc::kUniform_ColorInput:
1022 if (fColor != color) { 1015 if (fColor != color) {
1023 // OpenGL ES doesn't support unsigned byte varieties of glUn iform 1016 // OpenGL ES doesn't support unsigned byte varieties of glUn iform
1024 GrGLfloat c[4]; 1017 GrGLfloat c[4];
1025 GrColorToRGBAFloat(color, c); 1018 GrColorToRGBAFloat(color, c);
1026 GrAssert(GrGLUniformManager::kInvalidUniformHandle != 1019 GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
1027 fUniformHandles.fColorUni); 1020 fUniformHandles.fColorUni);
1028 fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c); 1021 fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c);
1029 fColor = color; 1022 fColor = color;
1030 } 1023 }
1031 break; 1024 break;
1032 case GrGLProgram::Desc::kSolidWhite_ColorInput: 1025 case GrGLProgramDesc::kSolidWhite_ColorInput:
1033 case GrGLProgram::Desc::kTransBlack_ColorInput: 1026 case GrGLProgramDesc::kTransBlack_ColorInput:
1034 break; 1027 break;
1035 default: 1028 default:
1036 GrCrash("Unknown color type."); 1029 GrCrash("Unknown color type.");
1037 } 1030 }
1038 } 1031 }
1039 } 1032 }
1040 1033
1041 void GrGLProgram::setCoverage(const GrDrawState& drawState, 1034 void GrGLProgram::setCoverage(const GrDrawState& drawState,
1042 GrColor coverage, 1035 GrColor coverage,
1043 SharedGLState* sharedState) { 1036 SharedGLState* sharedState) {
1044 if (!(drawState.getAttribBindings() & GrDrawState::kCoverage_AttribBindingsB it)) { 1037 if (!(drawState.getAttribBindings() & GrDrawState::kCoverage_AttribBindingsB it)) {
1045 switch (fDesc.fCoverageInput) { 1038 switch (fDesc.fCoverageInput) {
1046 case Desc::kAttribute_ColorInput: 1039 case GrGLProgramDesc::kAttribute_ColorInput:
1047 if (sharedState->fConstAttribCoverage != coverage) { 1040 if (sharedState->fConstAttribCoverage != coverage) {
1048 // OpenGL ES only supports the float varieties of glVertexA ttrib 1041 // OpenGL ES only supports the float varieties of glVertexA ttrib
1049 GrGLfloat c[4]; 1042 GrGLfloat c[4];
1050 GrColorToRGBAFloat(coverage, c); 1043 GrColorToRGBAFloat(coverage, c);
1051 GL_CALL(VertexAttrib4fv(fDesc.fCoverageAttributeIndex, c)); 1044 GL_CALL(VertexAttrib4fv(fDesc.fCoverageAttributeIndex, c));
1052 sharedState->fConstAttribCoverage = coverage; 1045 sharedState->fConstAttribCoverage = coverage;
1053 } 1046 }
1054 break; 1047 break;
1055 case Desc::kUniform_ColorInput: 1048 case GrGLProgramDesc::kUniform_ColorInput:
1056 if (fCoverage != coverage) { 1049 if (fCoverage != coverage) {
1057 // OpenGL ES doesn't support unsigned byte varieties of glUn iform 1050 // OpenGL ES doesn't support unsigned byte varieties of glUn iform
1058 GrGLfloat c[4]; 1051 GrGLfloat c[4];
1059 GrColorToRGBAFloat(coverage, c); 1052 GrColorToRGBAFloat(coverage, c);
1060 GrAssert(GrGLUniformManager::kInvalidUniformHandle != 1053 GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
1061 fUniformHandles.fCoverageUni); 1054 fUniformHandles.fCoverageUni);
1062 fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c ); 1055 fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c );
1063 fCoverage = coverage; 1056 fCoverage = coverage;
1064 } 1057 }
1065 break; 1058 break;
1066 case Desc::kSolidWhite_ColorInput: 1059 case GrGLProgramDesc::kSolidWhite_ColorInput:
1067 case Desc::kTransBlack_ColorInput: 1060 case GrGLProgramDesc::kTransBlack_ColorInput:
1068 break; 1061 break;
1069 default: 1062 default:
1070 GrCrash("Unknown coverage type."); 1063 GrCrash("Unknown coverage type.");
1071 } 1064 }
1072 } 1065 }
1073 } 1066 }
1074 1067
1075 void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { 1068 void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) {
1076 const GrRenderTarget* rt = drawState.getRenderTarget(); 1069 const GrRenderTarget* rt = drawState.getRenderTarget();
1077 SkISize size; 1070 SkISize size;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 SkScalarToFloat(m[SkMatrix::kMTransX]), 1104 SkScalarToFloat(m[SkMatrix::kMTransX]),
1112 SkScalarToFloat(m[SkMatrix::kMTransY]), 1105 SkScalarToFloat(m[SkMatrix::kMTransY]),
1113 SkScalarToFloat(m[SkMatrix::kMPersp2]) 1106 SkScalarToFloat(m[SkMatrix::kMPersp2])
1114 }; 1107 };
1115 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); 1108 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt);
1116 fMatrixState.fViewMatrix = drawState.getViewMatrix(); 1109 fMatrixState.fViewMatrix = drawState.getViewMatrix();
1117 fMatrixState.fRenderTargetSize = size; 1110 fMatrixState.fRenderTargetSize = size;
1118 fMatrixState.fRenderTargetOrigin = rt->origin(); 1111 fMatrixState.fRenderTargetOrigin = rt->origin();
1119 } 1112 }
1120 } 1113 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698