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

Side by Side Diff: src/gpu/effects/GrBezierEffect.cpp

Issue 519473003: Use highp for gpu bezier effects (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Use highp on cubics only Created 6 years, 3 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
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 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 "gl/builders/GrGLProgramBuilder.h" 8 #include "gl/builders/GrGLProgramBuilder.h"
9 #include "GrBezierEffect.h" 9 #include "GrBezierEffect.h"
10 10
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 53
54 builder->addVarying(kVec4f_GrSLType, "ConicCoeffs", 54 builder->addVarying(kVec4f_GrSLType, "ConicCoeffs",
55 &vsName, &fsName); 55 &vsName, &fsName);
56 56
57 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); 57 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
58 const SkString* attr0Name = 58 const SkString* attr0Name =
59 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0] ); 59 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0] );
60 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str()); 60 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str());
61 61
62 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 62 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
63 fsBuilder->codeAppend("\t\tfloat edgeAlpha;\n"); 63
64 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, GrGLShaderVar::kHig h_Precision);
65 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Prec ision);
66 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Prec ision);
67 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio n);
68 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio n);
69 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, GrGLShaderVar::kHigh_Precision);
70 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision) ;
71 GrGLShaderVar func("func", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio n);
72
73 fsBuilder->declAppend(edgeAlpha);
74 fsBuilder->declAppend(dklmdx);
75 fsBuilder->declAppend(dklmdy);
76 fsBuilder->declAppend(dfdx);
77 fsBuilder->declAppend(dfdy);
78 fsBuilder->declAppend(gF);
79 fsBuilder->declAppend(gFM);
80 fsBuilder->declAppend(func);
64 81
65 switch (fEdgeType) { 82 switch (fEdgeType) {
66 case kHairlineAA_GrEffectEdgeType: { 83 case kHairlineAA_GrEffectEdgeType: {
67 SkAssertResult(fsBuilder->enableFeature( 84 SkAssertResult(fsBuilder->enableFeature(
68 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) ); 85 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) );
69 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName); 86 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xyz);\n", dklmdx.c_str(), f sName);
70 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName); 87 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xyz);\n", dklmdy.c_str(), f sName);
71 fsBuilder->codeAppendf("\t\tfloat dfdx =\n" 88 fsBuilder->codeAppendf("\t\t%s =\n"
72 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s .z*dklmdx.y;\n", 89 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;\n",
73 fsName, fsName, fsName); 90 dfdx.c_str(), fsName, dklmdx.c_str(), fsName, dklmdx.c_str(),
74 fsBuilder->codeAppendf("\t\tfloat dfdy =\n" 91 fsName, dklmdx.c_str());
75 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s .z*dklmdy.y;\n", 92 fsBuilder->codeAppendf("\t\t%s =\n"
76 fsName, fsName, fsName); 93 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;\n",
77 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n"); 94 dfdy.c_str(), fsName, dklmdy.c_str(), fsName, dklmdy.c_str(),
78 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n"); 95 fsName, dklmdy.c_str());
79 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName, 96 fsBuilder->codeAppendf("\t\t%s = vec2(%s, %s);\n",
80 fsName, fsName); 97 gF.c_str(), dfdx.c_str(), dfdy.c_str());
81 fsBuilder->codeAppend("\t\tfunc = abs(func);\n"); 98 fsBuilder->codeAppendf("\t\t%s = sqrt(dot(%s, %s));\n",
82 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n"); 99 gFM.c_str(), gF.c_str(), gF.c_str());
83 fsBuilder->codeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n" ); 100 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n",
101 func.c_str(), fsName, fsName, fsName, fsName) ;
102 fsBuilder->codeAppendf("\t\t%s = abs(%s);\n", func.c_str(), func.c_s tr());
103 fsBuilder->codeAppendf("\t\t%s = %s / %s;\n",
104 edgeAlpha.c_str(), func.c_str(), gFM.c_str()) ;
105 fsBuilder->codeAppendf("\t\t%s = max(1.0 - %s, 0.0);\n",
106 edgeAlpha.c_str(), edgeAlpha.c_str());
84 // Add line below for smooth cubic ramp 107 // Add line below for smooth cubic ramp
85 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2 .0*edgeAlpha);\n"); 108 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n",
109 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge Alpha.c_str(),
110 // edgeAlpha.c_str());
86 break; 111 break;
87 } 112 }
88 case kFillAA_GrEffectEdgeType: { 113 case kFillAA_GrEffectEdgeType: {
89 SkAssertResult(fsBuilder->enableFeature( 114 SkAssertResult(fsBuilder->enableFeature(
90 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) ); 115 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) );
91 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName); 116 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xyz);\n", dklmdx.c_str(), f sName);
92 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName); 117 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xyz);\n", dklmdy.c_str(), f sName);
93 fsBuilder->codeAppendf("\t\tfloat dfdx =\n" 118 fsBuilder->codeAppendf("\t\t%s =\n"
94 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s .z*dklmdx.y;\n", 119 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;\n",
95 fsName, fsName, fsName); 120 dfdx.c_str(), fsName, dklmdx.c_str(), fsName, dklmdx.c_str(),
96 fsBuilder->codeAppendf("\t\tfloat dfdy =\n" 121 fsName, dklmdx.c_str());
97 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s .z*dklmdy.y;\n", 122 fsBuilder->codeAppendf("\t\t%s =\n"
98 fsName, fsName, fsName); 123 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;\n",
99 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n"); 124 dfdy.c_str(), fsName, dklmdy.c_str(), fsName, dklmdy.c_str(),
100 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n"); 125 fsName, dklmdy.c_str());
101 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName, 126 fsBuilder->codeAppendf("\t\t%s = vec2(%s, %s);\n",
102 fsName, fsName); 127 gF.c_str(), dfdx.c_str(), dfdy.c_str());
103 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n"); 128 fsBuilder->codeAppendf("\t\t%s = sqrt(dot(%s, %s));\n",
104 fsBuilder->codeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1 .0);\n"); 129 gFM.c_str(), gF.c_str(), gF.c_str());
130 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n",
131 func.c_str(), fsName, fsName, fsName, fsName) ;
132 fsBuilder->codeAppendf("\t\t%s = %s / %s;\n",
133 edgeAlpha.c_str(), func.c_str(), gFM.c_str()) ;
134 fsBuilder->codeAppendf("\t\t%s = clamp(1.0 - %s, 0.0, 1.0);\n",
135 edgeAlpha.c_str(), edgeAlpha.c_str());
105 // Add line below for smooth cubic ramp 136 // Add line below for smooth cubic ramp
106 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2 .0*edgeAlpha);\n"); 137 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n",
138 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge Alpha.c_str(),
139 // edgeAlpha.c_str());
107 break; 140 break;
108 } 141 }
109 case kFillBW_GrEffectEdgeType: { 142 case kFillBW_GrEffectEdgeType: {
110 fsBuilder->codeAppendf("\t\tedgeAlpha = %s.x*%s.x - %s.y*%s.z;\n", f sName, fsName, 143 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n",
111 fsName, fsName); 144 edgeAlpha.c_str(), fsName, fsName, fsName, fs Name);
112 fsBuilder->codeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n"); 145 fsBuilder->codeAppendf("\t\t%s = float(%s < 0.0);\n",
146 edgeAlpha.c_str(), edgeAlpha.c_str());
113 break; 147 break;
114 } 148 }
115 default: 149 default:
116 SkFAIL("Shouldn't get here"); 150 SkFAIL("Shouldn't get here");
117 } 151 }
118 152
119 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, 153 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor,
120 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")). c_str()); 154 (GrGLSLExpr4(inputColor) * GrGLSLExpr1(edgeAlpha.c_st r())).c_str());
121 } 155 }
122 156
123 void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, 157 void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
124 GrEffectKeyBuilder* b) { 158 GrEffectKeyBuilder* b) {
125 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>(); 159 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>();
126 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; 160 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
127 b->add32(key); 161 b->add32(key);
128 } 162 }
129 163
130 ////////////////////////////////////////////////////////////////////////////// 164 //////////////////////////////////////////////////////////////////////////////
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 const GrDrawTargetCaps& caps, 481 const GrDrawTargetCaps& caps,
448 GrTexture*[]) { 482 GrTexture*[]) {
449 GrEffect* effect; 483 GrEffect* effect;
450 do { 484 do {
451 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>( 485 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
452 random->nextULessThan(kGrEff ectEdgeTypeCnt)); 486 random->nextULessThan(kGrEff ectEdgeTypeCnt));
453 effect = GrCubicEffect::Create(edgeType, caps); 487 effect = GrCubicEffect::Create(edgeType, caps);
454 } while (NULL == effect); 488 } while (NULL == effect);
455 return effect; 489 return effect;
456 } 490 }
OLDNEW
« no previous file with comments | « no previous file | src/gpu/gl/builders/GrGLShaderBuilder.h » ('j') | src/gpu/gl/builders/GrGLShaderBuilder.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698