Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce9ee16d authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Conservatively estimate geometry bounds" into klp-dev

parents a42ceb03 32f05e34
Loading
Loading
Loading
Loading
+1 −8
Original line number Diff line number Diff line
@@ -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();
+2 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <utils/Trace.h>

#include "Program.h"
#include "Vertex.h"

namespace android {
namespace uirenderer {
@@ -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;
+31 −9
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@

#include <utils/Log.h>

#include "Vertex.h"

namespace android {
namespace uirenderer {

@@ -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() {
+9 −0
Original line number Diff line number Diff line
@@ -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) {