diff options
-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); |