Loading libs/hwui/OpenGLRenderer.cpp +1 −8 Original line number Diff line number Diff line Loading @@ -1628,14 +1628,7 @@ bool OpenGLRenderer::quickRejectNoScissor(float left, float top, float right, fl Rect r(left, top, right, bottom); currentTransform().mapRect(r); if (snapOut) { // snapOut is generally used to account for 1 pixel ramp (in window coordinates) // outside of the provided rect boundaries in tessellated AA geometry r.snapOutToPixelBoundaries(); } else { r.snapToPixelBoundaries(); } r.snapGeometryToPixelBoundaries(snapOut); Rect clipRect(*mSnapshot->clipRect); clipRect.snapToPixelBoundaries(); Loading libs/hwui/Program.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <utils/Trace.h> #include "Program.h" #include "Vertex.h" namespace android { namespace uirenderer { Loading Loading @@ -172,7 +173,7 @@ void Program::set(const mat4& projectionMatrix, const mat4& modelViewMatrix, // up and to the left. // This offset value is based on an assumption that some hardware may use as // little as 12.4 precision, so we offset by slightly more than 1/16. p.translate(.065, .065); p.translate(Vertex::gGeometryFudgeFactor, Vertex::gGeometryFudgeFactor); glUniformMatrix4fv(projection, 1, GL_FALSE, &p.data[0]); } mProjection = projectionMatrix; Loading libs/hwui/Rect.h +31 −9 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ #include <utils/Log.h> #include "Vertex.h" namespace android { namespace uirenderer { Loading Loading @@ -171,17 +173,37 @@ public: } /** * Similar to snapToPixelBoundaries, but used for AA geometry with a ramp perimeter. * Similar to snapToPixelBoundaries, but estimates bounds conservatively to handle GL rounding * errors. * * This function should be used whenever estimating the damage rect of geometry already mapped * into layer space. */ void snapGeometryToPixelBoundaries(bool snapOut) { if (snapOut) { /* For AA geometry with a ramp perimeter, don't snap by rounding - AA geometry will have * a 0.5 pixel perimeter not accounted for in its bounds. Instead, snap by * conservatively rounding out the bounds with floor/ceil. * * We inset the data by a fudge factor of slightly over 1/16 (similar to when drawing non-AA * lines) before rounding out so that insignificant amounts of ramp geometry (esp. from rounding * errors) are ignored. * In order to avoid changing integer bounds with floor/ceil due to rounding errors * inset the bounds first by the fudge factor. Very small fraction-of-a-pixel errors * from this inset will only incur similarly small errors in output, due to transparency * in extreme outside of the geometry. */ void snapOutToPixelBoundaries() { left = floorf(left + 0.065f); top = floorf(top + 0.065f); right = ceilf(right - 0.065f); bottom = ceilf(bottom - 0.065f); left = floorf(left + Vertex::gGeometryFudgeFactor); top = floorf(top + Vertex::gGeometryFudgeFactor); right = ceilf(right - Vertex::gGeometryFudgeFactor); bottom = ceilf(bottom - Vertex::gGeometryFudgeFactor); } else { /* For other geometry, we do the regular rounding in order to snap, but also outset the * bounds by a fudge factor. This ensures that ambiguous geometry (e.g. a non-AA Rect * with top left at (0.5, 0.5)) will err on the side of a larger damage rect. */ left = floorf(left + 0.5f - Vertex::gGeometryFudgeFactor); top = floorf(top + 0.5f - Vertex::gGeometryFudgeFactor); right = floorf(right + 0.5f + Vertex::gGeometryFudgeFactor); bottom = floorf(bottom + 0.5f + Vertex::gGeometryFudgeFactor); } } void snapToPixelBoundaries() { Loading libs/hwui/Vertex.h +9 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,15 @@ namespace uirenderer { * Simple structure to describe a vertex with a position and a texture. */ struct Vertex { /** * Fudge-factor used to disambiguate geometry pixel positioning. * * Used to offset lines and points to avoid ambiguous intersection with pixel centers (see * Program::set()), and used to make geometry damage rect calculation conservative (see * Rect::snapGeometryToPixelBoundaries()) */ static const float gGeometryFudgeFactor = 0.0656f; float position[2]; static inline void set(Vertex* vertex, float x, float y) { Loading Loading
libs/hwui/OpenGLRenderer.cpp +1 −8 Original line number Diff line number Diff line Loading @@ -1628,14 +1628,7 @@ bool OpenGLRenderer::quickRejectNoScissor(float left, float top, float right, fl Rect r(left, top, right, bottom); currentTransform().mapRect(r); if (snapOut) { // snapOut is generally used to account for 1 pixel ramp (in window coordinates) // outside of the provided rect boundaries in tessellated AA geometry r.snapOutToPixelBoundaries(); } else { r.snapToPixelBoundaries(); } r.snapGeometryToPixelBoundaries(snapOut); Rect clipRect(*mSnapshot->clipRect); clipRect.snapToPixelBoundaries(); Loading
libs/hwui/Program.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <utils/Trace.h> #include "Program.h" #include "Vertex.h" namespace android { namespace uirenderer { Loading Loading @@ -172,7 +173,7 @@ void Program::set(const mat4& projectionMatrix, const mat4& modelViewMatrix, // up and to the left. // This offset value is based on an assumption that some hardware may use as // little as 12.4 precision, so we offset by slightly more than 1/16. p.translate(.065, .065); p.translate(Vertex::gGeometryFudgeFactor, Vertex::gGeometryFudgeFactor); glUniformMatrix4fv(projection, 1, GL_FALSE, &p.data[0]); } mProjection = projectionMatrix; Loading
libs/hwui/Rect.h +31 −9 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ #include <utils/Log.h> #include "Vertex.h" namespace android { namespace uirenderer { Loading Loading @@ -171,17 +173,37 @@ public: } /** * Similar to snapToPixelBoundaries, but used for AA geometry with a ramp perimeter. * Similar to snapToPixelBoundaries, but estimates bounds conservatively to handle GL rounding * errors. * * This function should be used whenever estimating the damage rect of geometry already mapped * into layer space. */ void snapGeometryToPixelBoundaries(bool snapOut) { if (snapOut) { /* For AA geometry with a ramp perimeter, don't snap by rounding - AA geometry will have * a 0.5 pixel perimeter not accounted for in its bounds. Instead, snap by * conservatively rounding out the bounds with floor/ceil. * * We inset the data by a fudge factor of slightly over 1/16 (similar to when drawing non-AA * lines) before rounding out so that insignificant amounts of ramp geometry (esp. from rounding * errors) are ignored. * In order to avoid changing integer bounds with floor/ceil due to rounding errors * inset the bounds first by the fudge factor. Very small fraction-of-a-pixel errors * from this inset will only incur similarly small errors in output, due to transparency * in extreme outside of the geometry. */ void snapOutToPixelBoundaries() { left = floorf(left + 0.065f); top = floorf(top + 0.065f); right = ceilf(right - 0.065f); bottom = ceilf(bottom - 0.065f); left = floorf(left + Vertex::gGeometryFudgeFactor); top = floorf(top + Vertex::gGeometryFudgeFactor); right = ceilf(right - Vertex::gGeometryFudgeFactor); bottom = ceilf(bottom - Vertex::gGeometryFudgeFactor); } else { /* For other geometry, we do the regular rounding in order to snap, but also outset the * bounds by a fudge factor. This ensures that ambiguous geometry (e.g. a non-AA Rect * with top left at (0.5, 0.5)) will err on the side of a larger damage rect. */ left = floorf(left + 0.5f - Vertex::gGeometryFudgeFactor); top = floorf(top + 0.5f - Vertex::gGeometryFudgeFactor); right = floorf(right + 0.5f + Vertex::gGeometryFudgeFactor); bottom = floorf(bottom + 0.5f + Vertex::gGeometryFudgeFactor); } } void snapToPixelBoundaries() { Loading
libs/hwui/Vertex.h +9 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,15 @@ namespace uirenderer { * Simple structure to describe a vertex with a position and a texture. */ struct Vertex { /** * Fudge-factor used to disambiguate geometry pixel positioning. * * Used to offset lines and points to avoid ambiguous intersection with pixel centers (see * Program::set()), and used to make geometry damage rect calculation conservative (see * Rect::snapGeometryToPixelBoundaries()) */ static const float gGeometryFudgeFactor = 0.0656f; float position[2]; static inline void set(Vertex* vertex, float x, float y) { Loading