From 1001f843a45e95f6df1d44242b6b06c77898e870 Mon Sep 17 00:00:00 2001 From: Brian Osman Date: Fri, 12 Jan 2018 10:16:41 -0500 Subject: Added SkSL workaround for devices which cannot safely access gl_FragCoord This is the root cause of https://github.com/flutter/flutter/issues/13216 I've got a GM that demonstrates the bug, but only in Viewer. Bug: skia:7410 Change-Id: Iaa1f27b10166aa09e4dc5949e5a6ca1bd14c99ac Reviewed-on: https://skia-review.googlesource.com/93920 Reviewed-by: Brian Salomon Commit-Queue: Brian Osman --- src/gpu/GrShaderCaps.cpp | 2 ++ src/gpu/gl/GrGLCaps.cpp | 6 ++++++ 2 files changed, 8 insertions(+) (limited to 'src/gpu') diff --git a/src/gpu/GrShaderCaps.cpp b/src/gpu/GrShaderCaps.cpp index 2041ada635..2ab19478af 100644 --- a/src/gpu/GrShaderCaps.cpp +++ b/src/gpu/GrShaderCaps.cpp @@ -38,6 +38,7 @@ GrShaderCaps::GrShaderCaps(const GrContextOptions& options) { fRequiresLocalOutputColorForFBFetch = false; fMustObfuscateUniformColor = false; fMustGuardDivisionEvenAfterExplicitZeroCheck = false; + fCanUseFragCoord = true; fFlatInterpolationSupport = false; fPreferFlatInterpolation = false; fNoPerspectiveInterpolationSupport = false; @@ -113,6 +114,7 @@ void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const { writer->appendBool("Must obfuscate uniform color", fMustObfuscateUniformColor); writer->appendBool("Must guard division even after explicit zero check", fMustGuardDivisionEvenAfterExplicitZeroCheck); + writer->appendBool("Can use gl_FragCoord", fCanUseFragCoord); writer->appendBool("Flat interpolation support", fFlatInterpolationSupport); writer->appendBool("Prefer flat interpolation", fPreferFlatInterpolation); writer->appendBool("No perspective interpolation support", fNoPerspectiveInterpolationSupport); diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index 4996859c51..d310cd219b 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -1048,6 +1048,12 @@ void GrGLCaps::initGLSL(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli shaderCaps->fMustGuardDivisionEvenAfterExplicitZeroCheck = true; } #endif + + // We've seen Adreno 3xx devices produce incorrect (flipped) values for gl_FragCoord, in some + // (rare) situations. It's sporadic, and mostly on older drviers. + if (kAdreno3xx_GrGLRenderer == ctxInfo.renderer()) { + shaderCaps->fCanUseFragCoord = false; + } } bool GrGLCaps::hasPathRenderingSupport(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { -- cgit v1.2.3