diff options
author | 2015-12-11 04:59:36 -0800 | |
---|---|---|
committer | 2015-12-11 04:59:36 -0800 | |
commit | 2eb1009b6e244dae6374dc009dc867a32f40236e (patch) | |
tree | a640fc1a3144b3d5bbaf0ee0129a0afbe9e9298f | |
parent | 546eb5c57aebee47172f9d2a3eae6b49945dba08 (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
-rw-r--r-- | include/gpu/GrCaps.h | 2 | ||||
-rw-r--r-- | src/gpu/effects/GrBezierEffect.cpp | 28 |
2 files changed, 21 insertions, 9 deletions
diff --git a/include/gpu/GrCaps.h b/include/gpu/GrCaps.h index 6d3b66af21..3a6d27ba66 100644 --- a/include/gpu/GrCaps.h +++ b/include/gpu/GrCaps.h @@ -70,7 +70,7 @@ public: * called. */ const PrecisionInfo& getFloatShaderPrecisionInfo(GrShaderType shaderType, - GrSLPrecision precision) const { + GrSLPrecision precision) const { return fFloatPrecisions[shaderType][precision]; }; 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); |