From f99f320dc79e290a89d668243b6d77c3442b36ab Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Tue, 5 Aug 2014 15:31:52 -0700 Subject: 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 --- libs/hwui/ProgramCache.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'libs/hwui/ProgramCache.cpp') 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 = -- cgit v1.2.3