aboutsummaryrefslogtreecommitdiffhomepage
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
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
-rw-r--r--include/gpu/GrCaps.h2
-rw-r--r--src/gpu/effects/GrBezierEffect.cpp28
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);