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

Commit 6ec6fbc2 authored by Steven Thomas's avatar Steven Thomas
Browse files

Add frame rate flexibility token

Add support for temporarily relaxing frame rate restrictions in surface
flinger. This is used by CTS tests to get a consistent device state
while running frame rate tests.

Bug: 148033900

Test: - On a Pixel 4, I turned the brightness down and covered the
ambient light sensor, causing the display manager to set a frame rate
restriction. I ran the frame rate CTS test without these CLs applied,
and confirmed the test failed because surface flinger couldn't switch
frame rates, as expected. Then I ran the tests with the CLs applied, and
confirmed the tests pass.

- I confirmed that, without adopting shell permission identity, the CTS
test is denied the request to acquire a frame rate flexibility token. So
normal apps won't be able to access this.

Change-Id: Ie2b611cf5726c14a7a22e315a85bf6200d190682
parent 6a4a96c7
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -4820,6 +4820,11 @@ package android.view {
    method public abstract String asyncImpl() default "";
    method public abstract String asyncImpl() default "";
  }
  }


  public final class SurfaceControl implements android.os.Parcelable {
    method public static long acquireFrameRateFlexibilityToken();
    method public static void releaseFrameRateFlexibilityToken(long);
  }

  public class SurfaceControlViewHost {
  public class SurfaceControlViewHost {
    method public void relayout(android.view.WindowManager.LayoutParams);
    method public void relayout(android.view.WindowManager.LayoutParams);
    method public void setView(@NonNull android.view.View, @NonNull android.view.WindowManager.LayoutParams);
    method public void setView(@NonNull android.view.View, @NonNull android.view.WindowManager.LayoutParams);
+24 −0
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.Size;
import android.annotation.Size;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.Bitmap;
import android.graphics.Bitmap;
import android.graphics.ColorSpace;
import android.graphics.ColorSpace;
@@ -216,6 +217,9 @@ public final class SurfaceControl implements Parcelable {
    private static native void nativeSetFrameRate(
    private static native void nativeSetFrameRate(
            long transactionObj, long nativeObject, float frameRate, int compatibility);
            long transactionObj, long nativeObject, float frameRate, int compatibility);


    private static native long nativeAcquireFrameRateFlexibilityToken();
    private static native void nativeReleaseFrameRateFlexibilityToken(long token);

    private final CloseGuard mCloseGuard = CloseGuard.get();
    private final CloseGuard mCloseGuard = CloseGuard.get();
    private String mName;
    private String mName;
    /**
    /**
@@ -2868,4 +2872,24 @@ public final class SurfaceControl implements Parcelable {
            }
            }
        }
        }
    }
    }

    /**
     * Acquire a frame rate flexibility token, which allows surface flinger to freely switch display
     * frame rates. This is used by CTS tests to put the device in a consistent state. See
     * ISurfaceComposer::acquireFrameRateFlexibilityToken().
     * @hide
     */
    @TestApi
    public static long acquireFrameRateFlexibilityToken() {
        return nativeAcquireFrameRateFlexibilityToken();
    }

    /**
     * Release a frame rate flexibility token.
     * @hide
     */
    @TestApi
    public static void releaseFrameRateFlexibilityToken(long token) {
        nativeReleaseFrameRateFlexibilityToken(token);
    }
}
}
+23 −0
Original line number Original line Diff line number Diff line
@@ -29,11 +29,13 @@
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_view_SurfaceSession.h>
#include <android_runtime/android_view_SurfaceSession.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/SurfaceComposerClient.h>
#include <jni.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
#include <nativehelper/ScopedUtfChars.h>
#include <private/gui/ComposerService.h>
#include <stdio.h>
#include <stdio.h>
#include <system/graphics.h>
#include <system/graphics.h>
#include <ui/ConfigStoreTypes.h>
#include <ui/ConfigStoreTypes.h>
@@ -624,6 +626,23 @@ static void nativeSetFrameRate(JNIEnv* env, jclass clazz, jlong transactionObj,
    transaction->setFrameRate(ctrl, frameRate, static_cast<int8_t>(compatibility));
    transaction->setFrameRate(ctrl, frameRate, static_cast<int8_t>(compatibility));
}
}


static jlong nativeAcquireFrameRateFlexibilityToken(JNIEnv* env, jclass clazz) {
    sp<ISurfaceComposer> composer = ComposerService::getComposerService();
    sp<IBinder> token;
    status_t result = composer->acquireFrameRateFlexibilityToken(&token);
    if (result < 0) {
        ALOGE("Failed acquiring frame rate flexibility token: %s (%d)", strerror(-result), result);
        return 0;
    }
    token->incStrong((void*)nativeAcquireFrameRateFlexibilityToken);
    return reinterpret_cast<jlong>(token.get());
}

static void nativeReleaseFrameRateFlexibilityToken(JNIEnv* env, jclass clazz, jlong tokenLong) {
    sp<IBinder> token(reinterpret_cast<IBinder*>(tokenLong));
    token->decStrong((void*)nativeAcquireFrameRateFlexibilityToken);
}

static jlongArray nativeGetPhysicalDisplayIds(JNIEnv* env, jclass clazz) {
static jlongArray nativeGetPhysicalDisplayIds(JNIEnv* env, jclass clazz) {
    const auto displayIds = SurfaceComposerClient::getPhysicalDisplayIds();
    const auto displayIds = SurfaceComposerClient::getPhysicalDisplayIds();
    jlongArray array = env->NewLongArray(displayIds.size());
    jlongArray array = env->NewLongArray(displayIds.size());
@@ -1474,6 +1493,10 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
            (void*)nativeSetShadowRadius },
            (void*)nativeSetShadowRadius },
    {"nativeSetFrameRate", "(JJFI)V",
    {"nativeSetFrameRate", "(JJFI)V",
            (void*)nativeSetFrameRate },
            (void*)nativeSetFrameRate },
    {"nativeAcquireFrameRateFlexibilityToken", "()J",
            (void*)nativeAcquireFrameRateFlexibilityToken },
    {"nativeReleaseFrameRateFlexibilityToken", "(J)V",
            (void*)nativeReleaseFrameRateFlexibilityToken },
    {"nativeGetPhysicalDisplayIds", "()[J",
    {"nativeGetPhysicalDisplayIds", "()[J",
            (void*)nativeGetPhysicalDisplayIds },
            (void*)nativeGetPhysicalDisplayIds },
    {"nativeGetPhysicalDisplayToken", "(J)Landroid/os/IBinder;",
    {"nativeGetPhysicalDisplayToken", "(J)Landroid/os/IBinder;",