diff options
author | Chris Craik <ccraik@google.com> | 2014-08-05 15:31:52 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2014-08-05 22:39:31 +0000 |
commit | f99f320dc79e290a89d668243b6d77c3442b36ab (patch) | |
tree | 2f9899eb8e6f7f966c58fac1cb95fb2680944c47 /libs/hwui/ProgramCache.cpp | |
parent | 3962aa5d401a433badb757b3c3a3bb4e2b6acb3b (diff) |
Fix large radius RR clipping issue on certain devices
bug:16804363
Since dist can be in the 1000s of pixels, and length() may square it
in its current precision, scale the value down significantly first,
since final precision isn't very important.
Change-Id: Id20f7a49d6171355c8e242442c2b5083f746dca3
Diffstat (limited to 'libs/hwui/ProgramCache.cpp')
-rw-r--r-- | libs/hwui/ProgramCache.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp index f451690709f9..3ef2a716905d 100644 --- a/libs/hwui/ProgramCache.cpp +++ b/libs/hwui/ProgramCache.cpp @@ -334,8 +334,10 @@ const char* gFS_Main_ApplyColorOp[3] = { const char* gFS_Main_FragColor_HasRoundRectClip = " mediump vec2 fragToLT = roundRectInnerRectLTRB.xy - roundRectPos;\n" " mediump vec2 fragFromRB = roundRectPos - roundRectInnerRectLTRB.zw;\n" - " mediump vec2 dist = max(max(fragToLT, fragFromRB), vec2(0.0, 0.0));\n" - " mediump float linearDist = roundRectRadius - length(dist);\n" + + // divide + multiply by 128 to avoid falling out of range in length() function + " mediump vec2 dist = max(max(fragToLT, fragFromRB), vec2(0.0, 0.0)) / 128.0;\n" + " mediump float linearDist = roundRectRadius - (length(dist) * 128.0);\n" " gl_FragColor *= clamp(linearDist, 0.0, 1.0);\n"; const char* gFS_Main_DebugHighlight = |