aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2015-12-11 04:59:36 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-11 04:59:36 -0800
commit2eb1009b6e244dae6374dc009dc867a32f40236e (patch)
treea640fc1a3144b3d5bbaf0ee0129a0afbe9e9298f /src/gpu/effects
parent546eb5c57aebee47172f9d2a3eae6b49945dba08 (diff)
Add check for highp support in Conic effect
This CL may not really be necessary since it seems that the Android Ones we have fall back to mediump when highp isn't supported. FYI, for bits-of-precision/precision we have: Low Med High Precision-Used A1 (Cherry One - Mali 400) 10 10 0 Med - conic looks bad N5 (Adreno 330) 10 10 23 High - conic looks bad!!! N6 (Adreno 420) 10 10 23 High - conic looks good N7v2 (Adreno 320) 10 10 23 High - conic looks bad!!! N9 (K1) 23 23 23 High - looks good N10 (Mail-604) 10 10 23 High - looks good I suspect derivative computation is broken on the Adreno 300s. BUG=555779,skia:4668 TBR=bsalomon@google.com Review URL: https://codereview.chromium.org/1513573009
Diffstat (limited to 'src/gpu/effects')
-rw-r--r--src/gpu/effects/GrBezierEffect.cpp28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp
index fcb567dfc5..fdb737dab4 100644
--- a/src/gpu/effects/GrBezierEffect.cpp
+++ b/src/gpu/effects/GrBezierEffect.cpp
@@ -111,14 +111,26 @@ void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
args.fTransformsIn,
args.fTransformsOut);
- GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
- GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
- GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
- GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
- GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
- GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
- GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
- GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
+ // TODO: this precision check should actually be a check on the number of bits
+ // high and medium provide and the selection of the lowest level that suffices.
+ // Additionally we should assert that the upstream code only lets us get here if
+ // either high or medium provides the required number of bits.
+ GrSLPrecision precision = kHigh_GrSLPrecision;
+ const GrShaderCaps::PrecisionInfo& highP = args.fGLSLCaps->getFloatShaderPrecisionInfo(
+ kFragment_GrShaderType,
+ kHigh_GrSLPrecision);
+ if (!highP.supported()) {
+ precision = kMedium_GrSLPrecision;
+ }
+
+ GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, precision);
+ GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, precision);
+ GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, precision);
+ GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, precision);
+ GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, precision);
+ GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, precision);
+ GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, precision);
+ GrGLSLShaderVar func("func", kFloat_GrSLType, 0, precision);
fragBuilder->declAppend(edgeAlpha);
fragBuilder->declAppend(dklmdx);