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

Commit 40943ec4 authored by Nader Jawad's avatar Nader Jawad Committed by Android (Google) Code Review
Browse files

Merge changes I0b36f486,Ida0d0dee into sc-dev

* changes:
  Improve Stretch shader performance more
  Improve Stretch shader performance
parents 830db628 76d84aec
Loading
Loading
Loading
Loading
+51 −52
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,12 +114,12 @@ static const SkString stretchShader = SkString(R"(
        float uInverseStretchAffectedDist,
        float distanceStretched,
        float distanceDiff,
        float interpolationStrength
        float interpolationStrength,
        float viewportDimension
    ) {
      float outPos = inPos;
      if (overscroll > 0) {
        if (inPos <= uStretchAffectedDist) {
                outPos = computeOverscrollStart(
            return computeOverscrollStart(
              inPos,
              overscroll,
              uStretchAffectedDist,
@@ -126,41 +127,38 @@ static const SkString stretchShader = SkString(R"(
              distanceStretched,
              interpolationStrength
            );
            } else if (inPos >= distanceStretched) {
                outPos = distanceDiff + inPos;
            }
        } else {
            return distanceDiff + inPos;
        }
        if (overscroll < 0) {
            float stretchAffectedDist = 1. - uStretchAffectedDist;
      } else if (overscroll < 0) {
        float stretchAffectedDist = viewportDimension - uStretchAffectedDist;
        if (inPos >= stretchAffectedDist) {
                outPos = computeOverscrollEnd(
            return computeOverscrollEnd(
              inPos,
              overscroll,
              stretchAffectedDist,
              uStretchAffectedDist,
              uInverseStretchAffectedDist,
              distanceStretched,
                  interpolationStrength
              interpolationStrength,
              viewportDimension
            );
            } else if (inPos < stretchAffectedDist) {
                outPos = -distanceDiff + inPos;
        } else {
            return -distanceDiff + inPos;
        }
      } else {
        return inPos;
      }
        return outPos;
    }

    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;
        float stretchIntensity;
        // Add the normalized scroll position within scrolling list

        inU += uScrollX;
        inV += uScrollY;
        outU = inU;
        outV = inV;
        outU = computeOverscroll(
            inU,
            uOverscrollX,
@@ -168,7 +166,8 @@ static const SkString stretchShader = SkString(R"(
            uInverseDistanceStretchedX,
            uDistanceStretchedX,
            uDistDiffX,
            uInterpolationStrength
            uInterpolationStrength,
            viewportWidth
        );
        outV = computeOverscroll(
            inV,
@@ -177,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,
@@ -196,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());
@@ -210,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);