OLD | NEW |
---|---|
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 "GrOvalRenderer.h" | 8 #include "GrOvalRenderer.h" |
9 | 9 |
10 #include "gl/builders/GrGLProgramBuilder.h" | 10 #include "gl/builders/GrGLProgramBuilder.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 : INHERITED (factory) {} | 93 : INHERITED (factory) {} |
94 | 94 |
95 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 95 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
96 const CircleEdgeEffect& circleEffect = args.fGP.cast<CircleEdgeEffec t>(); | 96 const CircleEdgeEffect& circleEffect = args.fGP.cast<CircleEdgeEffec t>(); |
97 GrGLVertToFrag v(kVec4f_GrSLType); | 97 GrGLVertToFrag v(kVec4f_GrSLType); |
98 args.fPB->addVarying("CircleEdge", &v); | 98 args.fPB->addVarying("CircleEdge", &v); |
99 | 99 |
100 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();; | 100 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();; |
101 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), circleEffect.inCircleE dge().c_str()); | 101 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), circleEffect.inCircleE dge().c_str()); |
102 | 102 |
103 // setup position varying | |
104 vsBuilder->codeAppendf("vec3 pos3 = %s * vec3(%s, 1);", args.fGP.uVi ewM(), | |
105 args.fGP.inPosition()); | |
106 vsBuilder->transformPositionToDeviceSpace("pos3"); | |
bsalomon
2014/11/07 14:44:03
This name is a bit confusing. I'd expect it to tak
| |
107 | |
103 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); | 108 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); |
104 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); | 109 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); |
105 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0); ", v.fsIn()); | 110 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0); ", v.fsIn()); |
106 if (circleEffect.isStroked()) { | 111 if (circleEffect.isStroked()) { |
107 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0, 1.0);", | 112 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0, 1.0);", |
108 v.fsIn()); | 113 v.fsIn()); |
109 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 114 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
110 } | 115 } |
111 | 116 |
112 fsBuilder->codeAppendf("%s = %s;\n", args.fOutput, | 117 fsBuilder->codeAppendf("%s = %s;\n", args.fOutput, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
212 | 217 |
213 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 218 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
214 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 219 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
215 ellipseEffect.inEllipseOffset().c_str()); | 220 ellipseEffect.inEllipseOffset().c_str()); |
216 | 221 |
217 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); | 222 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); |
218 args.fPB->addVarying("EllipseRadii", &ellipseRadii); | 223 args.fPB->addVarying("EllipseRadii", &ellipseRadii); |
219 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), | 224 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
220 ellipseEffect.inEllipseRadii().c_str()); | 225 ellipseEffect.inEllipseRadii().c_str()); |
221 | 226 |
227 // setup position varying | |
228 vsBuilder->codeAppendf("vec3 pos3 = %s * vec3(%s, 1);", args.fGP.uVi ewM(), | |
229 args.fGP.inPosition()); | |
230 vsBuilder->transformPositionToDeviceSpace("pos3"); | |
231 | |
222 // for outer curve | 232 // for outer curve |
223 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); | 233 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); |
224 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse ts.fsIn(), | 234 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse ts.fsIn(), |
225 ellipseRadii.fsIn()); | 235 ellipseRadii.fsIn()); |
226 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset) - 1.0;"); | 236 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset) - 1.0;"); |
227 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips eRadii.fsIn()); | 237 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips eRadii.fsIn()); |
228 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); | 238 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); |
229 | 239 |
230 // avoid calling inversesqrt on zero. | 240 // avoid calling inversesqrt on zero. |
231 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); | 241 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
358 | 368 |
359 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 369 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
360 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 370 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
361 ellipseEffect.inEllipseOffsets0().c_str()); | 371 ellipseEffect.inEllipseOffsets0().c_str()); |
362 | 372 |
363 GrGLVertToFrag offsets1(kVec2f_GrSLType); | 373 GrGLVertToFrag offsets1(kVec2f_GrSLType); |
364 args.fPB->addVarying("EllipseOffsets1", &offsets1); | 374 args.fPB->addVarying("EllipseOffsets1", &offsets1); |
365 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), | 375 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
366 ellipseEffect.inEllipseOffsets1().c_str()); | 376 ellipseEffect.inEllipseOffsets1().c_str()); |
367 | 377 |
378 // setup position varying | |
379 vsBuilder->codeAppendf("vec3 pos3 = %s * vec3(%s, 1);", args.fGP.uVi ewM(), | |
380 args.fGP.inPosition()); | |
381 vsBuilder->transformPositionToDeviceSpace("pos3"); | |
382 | |
368 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); | 383 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); |
369 SkAssertResult(fsBuilder->enableFeature( | 384 SkAssertResult(fsBuilder->enableFeature( |
370 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) ); | 385 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) ); |
371 // for outer curve | 386 // for outer curve |
372 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn() ); | 387 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn() ); |
373 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset) - 1.0;"); | 388 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset) - 1.0;"); |
374 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); | 389 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); |
375 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); | 390 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); |
376 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y *duvdx.y," | 391 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y *duvdx.y," |
377 " 2.0*%s.x*duvdy.x + 2.0*%s.y *duvdy.y);", | 392 " 2.0*%s.x*duvdy.x + 2.0*%s.y *duvdy.y);", |
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1239 // drop out the middle quad if we're stroked | 1254 // drop out the middle quad if we're stroked |
1240 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1255 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
1241 SK_ARRAY_COUNT(gRRectIndices); | 1256 SK_ARRAY_COUNT(gRRectIndices); |
1242 target->setIndexSourceToBuffer(indexBuffer); | 1257 target->setIndexSourceToBuffer(indexBuffer); |
1243 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt , &bounds); | 1258 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt , &bounds); |
1244 } | 1259 } |
1245 | 1260 |
1246 target->resetIndexSource(); | 1261 target->resetIndexSource(); |
1247 return true; | 1262 return true; |
1248 } | 1263 } |
OLD | NEW |