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 #include "GrGLProgram.h" | 8 #include "GrGLProgram.h" |
9 | 9 |
10 #include "GrAllocator.h" | 10 #include "GrAllocator.h" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 // cache. | 80 // cache. |
81 desc->fAttribBindings &= | 81 desc->fAttribBindings &= |
82 ~(GrDrawState::kColor_AttribBindingsBit | GrDrawState::kCoverage_AttribB
indingsBit); | 82 ~(GrDrawState::kColor_AttribBindingsBit | GrDrawState::kCoverage_AttribB
indingsBit); |
83 | 83 |
84 desc->fColorFilterXfermode = skipColor ? | 84 desc->fColorFilterXfermode = skipColor ? |
85 SkXfermode::kDst_Mode : | 85 SkXfermode::kDst_Mode : |
86 drawState.getColorFilterMode(); | 86 drawState.getColorFilterMode(); |
87 | 87 |
88 // no reason to do edge aa or look at per-vertex coverage if coverage is ign
ored | 88 // no reason to do edge aa or look at per-vertex coverage if coverage is ign
ored |
89 if (skipCoverage) { | 89 if (skipCoverage) { |
90 desc->fAttribBindings &= ~(GrDrawState::kEdge_AttribBindingsBit | | 90 desc->fAttribBindings &= ~(GrDrawState::kCoverage_AttribBindingsBit); |
91 GrDrawState::kCoverage_AttribBindingsBit); | |
92 } | 91 } |
93 | 92 |
94 bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_B
lendOptFlag); | 93 bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_B
lendOptFlag); |
95 bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFla
g) || | 94 bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFla
g) || |
96 (!requiresAttributeColors && 0xffffffff == drawStat
e.getColor()); | 95 (!requiresAttributeColors && 0xffffffff == drawStat
e.getColor()); |
97 if (colorIsTransBlack) { | 96 if (colorIsTransBlack) { |
98 desc->fColorInput = Desc::kTransBlack_ColorInput; | 97 desc->fColorInput = Desc::kTransBlack_ColorInput; |
99 } else if (colorIsSolidWhite) { | 98 } else if (colorIsSolidWhite) { |
100 desc->fColorInput = Desc::kSolidWhite_ColorInput; | 99 desc->fColorInput = Desc::kSolidWhite_ColorInput; |
101 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeColors) { | 100 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeColors) { |
102 desc->fColorInput = Desc::kUniform_ColorInput; | 101 desc->fColorInput = Desc::kUniform_ColorInput; |
103 } else { | 102 } else { |
104 desc->fColorInput = Desc::kAttribute_ColorInput; | 103 desc->fColorInput = Desc::kAttribute_ColorInput; |
105 } | 104 } |
106 | 105 |
107 bool covIsSolidWhite = !requiresAttributeCoverage && 0xffffffff == drawState
.getCoverage(); | 106 bool covIsSolidWhite = !requiresAttributeCoverage && 0xffffffff == drawState
.getCoverage(); |
108 | 107 |
109 if (skipCoverage) { | 108 if (skipCoverage) { |
110 desc->fCoverageInput = Desc::kTransBlack_ColorInput; | 109 desc->fCoverageInput = Desc::kTransBlack_ColorInput; |
111 } else if (covIsSolidWhite) { | 110 } else if (covIsSolidWhite) { |
112 desc->fCoverageInput = Desc::kSolidWhite_ColorInput; | 111 desc->fCoverageInput = Desc::kSolidWhite_ColorInput; |
113 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeCoverage) { | 112 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeCoverage) { |
114 desc->fCoverageInput = Desc::kUniform_ColorInput; | 113 desc->fCoverageInput = Desc::kUniform_ColorInput; |
115 } else { | 114 } else { |
116 desc->fCoverageInput = Desc::kAttribute_ColorInput; | 115 desc->fCoverageInput = Desc::kAttribute_ColorInput; |
117 } | 116 } |
118 | 117 |
119 int lastEnabledStage = -1; | 118 int lastEnabledStage = -1; |
120 | 119 |
121 if (!skipCoverage && (desc->fAttribBindings & GrDrawState::kEdge_AttribBindi
ngsBit)) { | 120 if (!skipCoverage) { |
122 desc->fVertexEdgeType = drawState.getVertexEdgeType(); | |
123 desc->fDiscardIfOutsideEdge = drawState.getStencil().doesWrite(); | 121 desc->fDiscardIfOutsideEdge = drawState.getStencil().doesWrite(); |
124 } else { | 122 } else { |
125 // Use canonical values when edge-aa is not enabled to avoid program cac
he misses. | 123 // Use canonical values when edge-aa is not enabled to avoid program cac
he misses. |
126 desc->fVertexEdgeType = GrDrawState::kHairLine_EdgeType; | |
127 desc->fDiscardIfOutsideEdge = false; | 124 desc->fDiscardIfOutsideEdge = false; |
128 } | 125 } |
129 | 126 |
130 for (int s = 0; s < GrDrawState::kNumStages; ++s) { | 127 for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
131 | 128 |
132 bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCove
rage; | 129 bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCove
rage; |
133 if (!skip && drawState.isStageEnabled(s)) { | 130 if (!skip && drawState.isStageEnabled(s)) { |
134 lastEnabledStage = s; | 131 lastEnabledStage = s; |
135 const GrEffectRef& effect = *drawState.getStage(s).getEffect(); | 132 const GrEffectRef& effect = *drawState.getStage(s).getEffect(); |
136 const GrBackendEffectFactory& factory = effect->getFactory(); | 133 const GrBackendEffectFactory& factory = effect->getFactory(); |
(...skipping 23 matching lines...) Expand all Loading... |
160 // coverage stages or the distinction between coverage and color is immateri
al. | 157 // coverage stages or the distinction between coverage and color is immateri
al. |
161 int firstCoverageStage = GrDrawState::kNumStages; | 158 int firstCoverageStage = GrDrawState::kNumStages; |
162 desc->fFirstCoverageStage = GrDrawState::kNumStages; | 159 desc->fFirstCoverageStage = GrDrawState::kNumStages; |
163 bool hasCoverage = drawState.getFirstCoverageStage() <= lastEnabledStage; | 160 bool hasCoverage = drawState.getFirstCoverageStage() <= lastEnabledStage; |
164 if (hasCoverage) { | 161 if (hasCoverage) { |
165 firstCoverageStage = drawState.getFirstCoverageStage(); | 162 firstCoverageStage = drawState.getFirstCoverageStage(); |
166 } | 163 } |
167 | 164 |
168 // other coverage inputs | 165 // other coverage inputs |
169 if (!hasCoverage) { | 166 if (!hasCoverage) { |
170 hasCoverage = requiresAttributeCoverage || | 167 hasCoverage = requiresAttributeCoverage; |
171 (desc->fAttribBindings & GrDrawState::kEdge_AttribBindings
Bit); | |
172 } | 168 } |
173 | 169 |
174 if (hasCoverage) { | 170 if (hasCoverage) { |
175 // color filter is applied between color/coverage computation | 171 // color filter is applied between color/coverage computation |
176 if (SkXfermode::kDst_Mode != desc->fColorFilterXfermode) { | 172 if (SkXfermode::kDst_Mode != desc->fColorFilterXfermode) { |
177 desc->fFirstCoverageStage = firstCoverageStage; | 173 desc->fFirstCoverageStage = firstCoverageStage; |
178 } | 174 } |
179 | 175 |
180 if (gpu->caps()->dualSourceBlendingSupport() && | 176 if (gpu->caps()->dualSourceBlendingSupport() && |
181 !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag | | 177 !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag | |
(...skipping 18 matching lines...) Expand all Loading... |
200 if (requiresAttributeColors) { | 196 if (requiresAttributeColors) { |
201 desc->fColorAttributeIndex = drawState.getAttribIndex(GrDrawState::kColo
r_AttribIndex); | 197 desc->fColorAttributeIndex = drawState.getAttribIndex(GrDrawState::kColo
r_AttribIndex); |
202 } else { | 198 } else { |
203 desc->fColorAttributeIndex = GrDrawState::kColorOverrideAttribIndexValue
; | 199 desc->fColorAttributeIndex = GrDrawState::kColorOverrideAttribIndexValue
; |
204 } | 200 } |
205 if (requiresAttributeCoverage) { | 201 if (requiresAttributeCoverage) { |
206 desc->fCoverageAttributeIndex = drawState.getAttribIndex(GrDrawState::kC
overage_AttribIndex); | 202 desc->fCoverageAttributeIndex = drawState.getAttribIndex(GrDrawState::kC
overage_AttribIndex); |
207 } else { | 203 } else { |
208 desc->fCoverageAttributeIndex = GrDrawState::kCoverageOverrideAttribInde
xValue; | 204 desc->fCoverageAttributeIndex = GrDrawState::kCoverageOverrideAttribInde
xValue; |
209 } | 205 } |
210 if (desc->fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) { | |
211 desc->fEdgeAttributeIndex = drawState.getAttribIndex(GrDrawState::kEdge_
AttribIndex); | |
212 } | |
213 if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { | 206 if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { |
214 desc->fLocalCoordsAttributeIndex = drawState.getAttribIndex(GrDrawState:
:kLocalCoords_AttribIndex); | 207 desc->fLocalCoordsAttributeIndex = drawState.getAttribIndex(GrDrawState:
:kLocalCoords_AttribIndex); |
215 } | 208 } |
216 | 209 |
217 #if GR_DEBUG | 210 #if GR_DEBUG |
218 // verify valid vertex attribute state | 211 // verify valid vertex attribute state |
219 const GrVertexAttrib* vertexAttribs = drawState.getVertexAttribs(); | 212 const GrVertexAttrib* vertexAttribs = drawState.getVertexAttribs(); |
220 GrAssert(desc->fPositionAttributeIndex < GrDrawState::kVertexAttribCnt); | 213 GrAssert(desc->fPositionAttributeIndex < GrDrawState::kVertexAttribCnt); |
221 GrAssert(kAttribLayouts[vertexAttribs[desc->fPositionAttributeIndex].fType].
fCount == 2); | 214 GrAssert(kAttribLayouts[vertexAttribs[desc->fPositionAttributeIndex].fType].
fCount == 2); |
222 if (requiresAttributeColors) { | 215 if (requiresAttributeColors) { |
223 GrAssert(desc->fColorAttributeIndex < GrDrawState::kVertexAttribCnt); | 216 GrAssert(desc->fColorAttributeIndex < GrDrawState::kVertexAttribCnt); |
224 GrAssert(kAttribLayouts[vertexAttribs[desc->fColorAttributeIndex].fType]
.fCount == 4); | 217 GrAssert(kAttribLayouts[vertexAttribs[desc->fColorAttributeIndex].fType]
.fCount == 4); |
225 } | 218 } |
226 if (requiresAttributeCoverage) { | 219 if (requiresAttributeCoverage) { |
227 GrAssert(desc->fCoverageAttributeIndex < GrDrawState::kVertexAttribCnt); | 220 GrAssert(desc->fCoverageAttributeIndex < GrDrawState::kVertexAttribCnt); |
228 GrAssert(kAttribLayouts[vertexAttribs[desc->fCoverageAttributeIndex].fTy
pe].fCount == 4); | 221 GrAssert(kAttribLayouts[vertexAttribs[desc->fCoverageAttributeIndex].fTy
pe].fCount == 4); |
229 } | 222 } |
230 if (desc->fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) { | |
231 GrAssert(desc->fEdgeAttributeIndex < GrDrawState::kVertexAttribCnt); | |
232 GrAssert(kAttribLayouts[vertexAttribs[desc->fEdgeAttributeIndex].fType].
fCount == 4); | |
233 } | |
234 if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { | 223 if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { |
235 GrAssert(desc->fLocalCoordsAttributeIndex < GrDrawState::kVertexAttribCn
t); | 224 GrAssert(desc->fLocalCoordsAttributeIndex < GrDrawState::kVertexAttribCn
t); |
236 GrAssert(kAttribLayouts[vertexAttribs[desc->fLocalCoordsAttributeIndex].
fType].fCount == 2); | 225 GrAssert(kAttribLayouts[vertexAttribs[desc->fLocalCoordsAttributeIndex].
fType].fCount == 2); |
237 } | 226 } |
238 #endif | 227 #endif |
239 } | 228 } |
240 | 229 |
241 GrGLProgram* GrGLProgram::Create(const GrGLContext& gl, | 230 GrGLProgram* GrGLProgram::Create(const GrGLContext& gl, |
242 const Desc& desc, | 231 const Desc& desc, |
243 const GrEffectStage* stages[]) { | 232 const GrEffectStage* stages[]) { |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 SkString colorStr, constStr; | 401 SkString colorStr, constStr; |
413 blend_term_string(&colorStr, colorCoeff, filterColor, inColor, inColor); | 402 blend_term_string(&colorStr, colorCoeff, filterColor, inColor, inColor); |
414 blend_term_string(&constStr, uniformCoeff, filterColor, inColor, filterColor
); | 403 blend_term_string(&constStr, uniformCoeff, filterColor, inColor, filterColor
); |
415 | 404 |
416 SkString sum; | 405 SkString sum; |
417 GrGLSLAdd4f(&sum, colorStr.c_str(), constStr.c_str()); | 406 GrGLSLAdd4f(&sum, colorStr.c_str(), constStr.c_str()); |
418 builder->fsCodeAppendf("\t%s = %s;\n", outputVar, sum.c_str()); | 407 builder->fsCodeAppendf("\t%s = %s;\n", outputVar, sum.c_str()); |
419 } | 408 } |
420 } | 409 } |
421 | 410 |
422 bool GrGLProgram::genEdgeCoverage(SkString* coverageVar, | |
423 GrGLShaderBuilder* builder) const { | |
424 if (fDesc.fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) { | |
425 const char *vsName, *fsName; | |
426 builder->addVarying(kVec4f_GrSLType, "Edge", &vsName, &fsName); | |
427 builder->addAttribute(kVec4f_GrSLType, EDGE_ATTR_NAME); | |
428 builder->vsCodeAppendf("\t%s = " EDGE_ATTR_NAME ";\n", vsName); | |
429 switch (fDesc.fVertexEdgeType) { | |
430 case GrDrawState::kHairLine_EdgeType: | |
431 builder->fsCodeAppendf("\tfloat edgeAlpha = abs(dot(vec3(%s.xy,1), %
s.xyz));\n", | |
432 builder->fragmentPosition(), fsName); | |
433 builder->fsCodeAppendf("\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n")
; | |
434 break; | |
435 case GrDrawState::kQuad_EdgeType: | |
436 builder->fsCodeAppendf("\tfloat edgeAlpha;\n"); | |
437 // keep the derivative instructions outside the conditional | |
438 builder->fsCodeAppendf("\tvec2 duvdx = dFdx(%s.xy);\n", fsName); | |
439 builder->fsCodeAppendf("\tvec2 duvdy = dFdy(%s.xy);\n", fsName); | |
440 builder->fsCodeAppendf("\tif (%s.z > 0.0 && %s.w > 0.0) {\n", fsName
, fsName); | |
441 // today we know z and w are in device space. We could use derivativ
es | |
442 builder->fsCodeAppendf("\t\tedgeAlpha = min(min(%s.z, %s.w) + 0.5, 1
.0);\n", fsName, | |
443 fsName); | |
444 builder->fsCodeAppendf ("\t} else {\n"); | |
445 builder->fsCodeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.
y,\n" | |
446 "\t\t 2.0*%s.x*duvdy.x - duvdy.
y);\n", | |
447 fsName, fsName); | |
448 builder->fsCodeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsNa
me, fsName, fsName); | |
449 builder->fsCodeAppendf("\t\tedgeAlpha = clamp(0.5 - edgeAlpha / leng
th(gF), 0.0, 1.0);\n" | |
450 "\t}\n"); | |
451 if (kES2_GrGLBinding == fContext.info().binding()) { | |
452 builder->fHeader.append("#extension GL_OES_standard_derivatives:
enable\n"); | |
453 } | |
454 break; | |
455 case GrDrawState::kHairQuad_EdgeType: | |
456 builder->fsCodeAppendf("\tvec2 duvdx = dFdx(%s.xy);\n", fsName); | |
457 builder->fsCodeAppendf("\tvec2 duvdy = dFdy(%s.xy);\n", fsName); | |
458 builder->fsCodeAppendf("\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,
\n" | |
459 "\t 2.0*%s.x*duvdy.x - duvdy.y)
;\n", | |
460 fsName, fsName); | |
461 builder->fsCodeAppendf("\tfloat edgeAlpha = (%s.x*%s.x - %s.y);\n",
fsName, fsName, | |
462 fsName); | |
463 builder->fsCodeAppend("\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / dot(
gF, gF));\n"); | |
464 builder->fsCodeAppend("\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"); | |
465 if (kES2_GrGLBinding == fContext.info().binding()) { | |
466 builder->fHeader.printf("#extension GL_OES_standard_derivatives:
enable\n"); | |
467 } | |
468 break; | |
469 default: | |
470 GrCrash("Unknown Edge Type!"); | |
471 break; | |
472 } | |
473 if (fDesc.fDiscardIfOutsideEdge) { | |
474 builder->fsCodeAppend("\tif (edgeAlpha <= 0.0) {\n\t\tdiscard;\n\t}\
n"); | |
475 } | |
476 *coverageVar = "edgeAlpha"; | |
477 return true; | |
478 } else { | |
479 coverageVar->reset(); | |
480 return false; | |
481 } | |
482 } | |
483 | |
484 void GrGLProgram::genInputColor(GrGLShaderBuilder* builder, SkString* inColor) { | 411 void GrGLProgram::genInputColor(GrGLShaderBuilder* builder, SkString* inColor) { |
485 switch (fDesc.fColorInput) { | 412 switch (fDesc.fColorInput) { |
486 case GrGLProgram::Desc::kAttribute_ColorInput: { | 413 case GrGLProgram::Desc::kAttribute_ColorInput: { |
487 builder->addAttribute(kVec4f_GrSLType, COL_ATTR_NAME); | 414 builder->addAttribute(kVec4f_GrSLType, COL_ATTR_NAME); |
488 const char *vsName, *fsName; | 415 const char *vsName, *fsName; |
489 builder->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName); | 416 builder->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName); |
490 builder->vsCodeAppendf("\t%s = " COL_ATTR_NAME ";\n", vsName); | 417 builder->vsCodeAppendf("\t%s = " COL_ATTR_NAME ";\n", vsName); |
491 *inColor = fsName; | 418 *inColor = fsName; |
492 } break; | 419 } break; |
493 case GrGLProgram::Desc::kUniform_ColorInput: { | 420 case GrGLProgram::Desc::kUniform_ColorInput: { |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 /////////////////////////////////////////////////////////////////////////// | 754 /////////////////////////////////////////////////////////////////////////// |
828 // compute the partial coverage (coverage stages and edge aa) | 755 // compute the partial coverage (coverage stages and edge aa) |
829 | 756 |
830 SkString inCoverage; | 757 SkString inCoverage; |
831 bool coverageIsZero = Desc::kTransBlack_ColorInput == fDesc.fCoverageInput; | 758 bool coverageIsZero = Desc::kTransBlack_ColorInput == fDesc.fCoverageInput; |
832 // we don't need to compute coverage at all if we know the final shader | 759 // we don't need to compute coverage at all if we know the final shader |
833 // output will be zero and we don't have a dual src blend output. | 760 // output will be zero and we don't have a dual src blend output. |
834 if (!wroteFragColorZero || Desc::kNone_DualSrcOutput != fDesc.fDualSrcOutput
) { | 761 if (!wroteFragColorZero || Desc::kNone_DualSrcOutput != fDesc.fDualSrcOutput
) { |
835 | 762 |
836 if (!coverageIsZero) { | 763 if (!coverageIsZero) { |
837 bool inCoverageIsScalar = this->genEdgeCoverage(&inCoverage, &build
er); | |
838 | |
839 switch (fDesc.fCoverageInput) { | 764 switch (fDesc.fCoverageInput) { |
840 case Desc::kSolidWhite_ColorInput: | 765 case Desc::kSolidWhite_ColorInput: |
841 // empty string implies solid white | 766 // empty string implies solid white |
842 break; | 767 break; |
843 case Desc::kAttribute_ColorInput: | 768 case Desc::kAttribute_ColorInput: |
844 gen_attribute_coverage(&builder, &inCoverage); | 769 gen_attribute_coverage(&builder, &inCoverage); |
845 inCoverageIsScalar = false; | |
846 break; | 770 break; |
847 case Desc::kUniform_ColorInput: | 771 case Desc::kUniform_ColorInput: |
848 this->genUniformCoverage(&builder, &inCoverage); | 772 this->genUniformCoverage(&builder, &inCoverage); |
849 inCoverageIsScalar = false; | |
850 break; | 773 break; |
851 default: | 774 default: |
852 GrCrash("Unexpected input coverage."); | 775 GrCrash("Unexpected input coverage."); |
853 } | 776 } |
854 | 777 |
855 SkString outCoverage; | 778 SkString outCoverage; |
856 const int& startStage = fDesc.fFirstCoverageStage; | 779 const int& startStage = fDesc.fFirstCoverageStage; |
857 for (int s = startStage; s < GrDrawState::kNumStages; ++s) { | 780 for (int s = startStage; s < GrDrawState::kNumStages; ++s) { |
858 if (fDesc.fEffectKeys[s]) { | 781 if (fDesc.fEffectKeys[s]) { |
859 // create var to hold stage output | 782 // create var to hold stage output |
860 outCoverage = "coverage"; | 783 outCoverage = "coverage"; |
861 outCoverage.appendS32(s); | 784 outCoverage.appendS32(s); |
862 builder.fsCodeAppendf("\tvec4 %s;\n", outCoverage.c_str()); | 785 builder.fsCodeAppendf("\tvec4 %s;\n", outCoverage.c_str()); |
863 | 786 |
864 // stages don't know how to deal with a scalar input. (Maybe
they should. We | |
865 // could pass a GrGLShaderVar) | |
866 if (inCoverageIsScalar) { | |
867 builder.fsCodeAppendf("\tvec4 %s4 = vec4(%s);\n", | |
868 inCoverage.c_str(), inCoverage.c_s
tr()); | |
869 inCoverage.append("4"); | |
870 } | |
871 builder.setCurrentStage(s); | 787 builder.setCurrentStage(s); |
872 fEffects[s] = builder.createAndEmitGLEffect( | 788 fEffects[s] = builder.createAndEmitGLEffect( |
873 *stages[s], | 789 *stages[s], |
874 fDesc.fEffectKeys[s], | 790 fDesc.fEffectKeys[s], |
875 inCoverage.size() ? inCovera
ge.c_str() : NULL, | 791 inCoverage.size() ? inCovera
ge.c_str() : NULL, |
876 outCoverage.c_str(), | 792 outCoverage.c_str(), |
877 &fUniformHandles.fSamplerUni
s[s]); | 793 &fUniformHandles.fSamplerUni
s[s]); |
878 builder.setNonStage(); | 794 builder.setNonStage(); |
879 inCoverage = outCoverage; | 795 inCoverage = outCoverage; |
880 } | 796 } |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
977 GL_CALL(BindFragDataLocationIndexed(fProgramID, 0, 1, dual_source_output
_name())); | 893 GL_CALL(BindFragDataLocationIndexed(fProgramID, 0, 1, dual_source_output
_name())); |
978 } | 894 } |
979 | 895 |
980 // Bind the attrib locations to same values for all shaders | 896 // Bind the attrib locations to same values for all shaders |
981 GL_CALL(BindAttribLocation(fProgramID, | 897 GL_CALL(BindAttribLocation(fProgramID, |
982 fDesc.fPositionAttributeIndex, | 898 fDesc.fPositionAttributeIndex, |
983 builder.positionAttribute().c_str())); | 899 builder.positionAttribute().c_str())); |
984 GL_CALL(BindAttribLocation(fProgramID, fDesc.fColorAttributeIndex, COL_ATTR_
NAME)); | 900 GL_CALL(BindAttribLocation(fProgramID, fDesc.fColorAttributeIndex, COL_ATTR_
NAME)); |
985 GL_CALL(BindAttribLocation(fProgramID, fDesc.fCoverageAttributeIndex, COV_AT
TR_NAME)); | 901 GL_CALL(BindAttribLocation(fProgramID, fDesc.fCoverageAttributeIndex, COV_AT
TR_NAME)); |
986 | 902 |
987 if (fDesc.fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) { | |
988 GL_CALL(BindAttribLocation(fProgramID, fDesc.fEdgeAttributeIndex, EDGE_A
TTR_NAME)); | |
989 } | |
990 if (fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { | 903 if (fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { |
991 GL_CALL(BindAttribLocation(fProgramID, | 904 GL_CALL(BindAttribLocation(fProgramID, |
992 fDesc.fLocalCoordsAttributeIndex, | 905 fDesc.fLocalCoordsAttributeIndex, |
993 builder.localCoordsAttribute().c_str())); | 906 builder.localCoordsAttribute().c_str())); |
994 } | 907 } |
995 | 908 |
996 const GrGLShaderBuilder::AttributePair* attribEnd = builder.getEffectAttribu
tes().end(); | 909 const GrGLShaderBuilder::AttributePair* attribEnd = builder.getEffectAttribu
tes().end(); |
997 for (const GrGLShaderBuilder::AttributePair* attrib = builder.getEffectAttri
butes().begin(); | 910 for (const GrGLShaderBuilder::AttributePair* attrib = builder.getEffectAttri
butes().begin(); |
998 attrib != attribEnd; | 911 attrib != attribEnd; |
999 ++attrib) { | 912 ++attrib) { |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1195 SkScalarToFloat(m[SkMatrix::kMTransX]), | 1108 SkScalarToFloat(m[SkMatrix::kMTransX]), |
1196 SkScalarToFloat(m[SkMatrix::kMTransY]), | 1109 SkScalarToFloat(m[SkMatrix::kMTransY]), |
1197 SkScalarToFloat(m[SkMatrix::kMPersp2]) | 1110 SkScalarToFloat(m[SkMatrix::kMPersp2]) |
1198 }; | 1111 }; |
1199 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); | 1112 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); |
1200 fMatrixState.fViewMatrix = drawState.getViewMatrix(); | 1113 fMatrixState.fViewMatrix = drawState.getViewMatrix(); |
1201 fMatrixState.fRenderTargetSize = size; | 1114 fMatrixState.fRenderTargetSize = size; |
1202 fMatrixState.fRenderTargetOrigin = rt->origin(); | 1115 fMatrixState.fRenderTargetOrigin = rt->origin(); |
1203 } | 1116 } |
1204 } | 1117 } |
OLD | NEW |