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

Commit 76d84aec authored by Nader Jawad's avatar Nader Jawad
Browse files

Improve Stretch shader performance more

Refactor stretch shader to always work in
skia's coordinate system instead of normalizing
the input coordinates.
Improves performance on coral by approximately 10-20% across
various use cases on top of the branching refactoring
perf improvements
~1k fps to ~1.1k fps on non-surfaceview cases
~500 fps to ~600 fps o surfaceview cases

Bug: 187718492
Test: manual
Change-Id: I0b36f48699739979948bfec160a8aa64fc80b7a7
parent 91a55b61
Loading
Loading
Loading
Loading
+25 −22
Original line number Diff line number Diff line
@@ -94,13 +94,14 @@ static const SkString stretchShader = SkString(R"(
        float uStretchAffectedDist,
        float uInverseStretchAffectedDist,
        float distanceStretched,
        float interpolationStrength
        float interpolationStrength,
        float viewportDimension
    ) {
        float offsetPos = inPos - reverseStretchDist;
        float posBasedVariation = mix(
                1. ,easeIn(offsetPos, uInverseStretchAffectedDist), interpolationStrength);
        float stretchIntensity = (-overscroll) * posBasedVariation;
        return 1 - (distanceStretched - (offsetPos / (1. + stretchIntensity)));
        return viewportDimension - (distanceStretched - (offsetPos / (1. + stretchIntensity)));
    }

    // Prefer usage of return values over out parameters as it enables
@@ -113,7 +114,8 @@ static const SkString stretchShader = SkString(R"(
        float uInverseStretchAffectedDist,
        float distanceStretched,
        float distanceDiff,
        float interpolationStrength
        float interpolationStrength,
        float viewportDimension
    ) {
      if (overscroll > 0) {
        if (inPos <= uStretchAffectedDist) {
@@ -129,7 +131,7 @@ static const SkString stretchShader = SkString(R"(
            return distanceDiff + inPos;
        }
      } else if (overscroll < 0) {
        float stretchAffectedDist = 1. - uStretchAffectedDist;
        float stretchAffectedDist = viewportDimension - uStretchAffectedDist;
        if (inPos >= stretchAffectedDist) {
            return computeOverscrollEnd(
              inPos,
@@ -138,7 +140,8 @@ static const SkString stretchShader = SkString(R"(
              uStretchAffectedDist,
              uInverseStretchAffectedDist,
              distanceStretched,
              interpolationStrength
              interpolationStrength,
              viewportDimension
            );
        } else {
            return -distanceDiff + inPos;
@@ -149,12 +152,11 @@ static const SkString stretchShader = SkString(R"(
    }

    vec4 main(vec2 coord) {
        // Normalize SKSL pixel coordinate into a unit vector
        float inU = coord.x / viewportWidth;
        float inV = coord.y / viewportHeight;
        float inU = coord.x;
        float inV = coord.y;
        float outU;
        float outV;
        // Add the normalized scroll position within scrolling list

        inU += uScrollX;
        inV += uScrollY;
        outU = computeOverscroll(
@@ -164,7 +166,8 @@ static const SkString stretchShader = SkString(R"(
            uInverseDistanceStretchedX,
            uDistanceStretchedX,
            uDistDiffX,
            uInterpolationStrength
            uInterpolationStrength,
            viewportWidth
        );
        outV = computeOverscroll(
            inV,
@@ -173,15 +176,15 @@ static const SkString stretchShader = SkString(R"(
            uInverseDistanceStretchedY,
            uDistanceStretchedY,
            uDistDiffY,
            uInterpolationStrength
            uInterpolationStrength,
            viewportHeight
        );
        coord.x = outU * viewportWidth;
        coord.y = outV * viewportHeight;
        coord.x = outU;
        coord.y = outV;
        return sample(uContentTexture, coord);
    })");

static const float ZERO = 0.f;
static const float CONTENT_DISTANCE_STRETCHED = 1.f;
static const float INTERPOLATION_STRENGTH_VALUE = 0.7f;

sk_sp<SkShader> StretchEffect::getShader(float width, float height,
@@ -192,12 +195,12 @@ sk_sp<SkShader> StretchEffect::getShader(float width, float height,

    float normOverScrollDistX = mStretchDirection.x();
    float normOverScrollDistY = mStretchDirection.y();
    float distanceStretchedX = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistX));
    float distanceStretchedY = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistY));
    float inverseDistanceStretchedX = 1.f / CONTENT_DISTANCE_STRETCHED;
    float inverseDistanceStretchedY = 1.f / CONTENT_DISTANCE_STRETCHED;
    float diffX = distanceStretchedX - CONTENT_DISTANCE_STRETCHED;
    float diffY = distanceStretchedY - CONTENT_DISTANCE_STRETCHED;
    float distanceStretchedX = width / (1 + abs(normOverScrollDistX));
    float distanceStretchedY = height / (1 + abs(normOverScrollDistY));
    float inverseDistanceStretchedX = 1.f / width;
    float inverseDistanceStretchedY = 1.f / height;
    float diffX = distanceStretchedX - width;
    float diffY = distanceStretchedY - height;

    if (mBuilder == nullptr) {
        mBuilder = std::make_unique<SkRuntimeShaderBuilder>(getStretchEffect());
@@ -206,8 +209,8 @@ sk_sp<SkShader> StretchEffect::getShader(float width, float height,
    mBuilder->child("uContentTexture") = snapshotImage->makeShader(
            SkTileMode::kClamp, SkTileMode::kClamp, SkSamplingOptions(SkFilterMode::kLinear));
    mBuilder->uniform("uInterpolationStrength").set(&INTERPOLATION_STRENGTH_VALUE, 1);
    mBuilder->uniform("uStretchAffectedDistX").set(&CONTENT_DISTANCE_STRETCHED, 1);
    mBuilder->uniform("uStretchAffectedDistY").set(&CONTENT_DISTANCE_STRETCHED, 1);
    mBuilder->uniform("uStretchAffectedDistX").set(&width, 1);
    mBuilder->uniform("uStretchAffectedDistY").set(&height, 1);
    mBuilder->uniform("uDistanceStretchedX").set(&distanceStretchedX, 1);
    mBuilder->uniform("uDistanceStretchedY").set(&distanceStretchedY, 1);
    mBuilder->uniform("uInverseDistanceStretchedX").set(&inverseDistanceStretchedX, 1);