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
This commit is contained in:
Steven Thomas
2020-03-24 16:06:33 -07:00
parent 6a4a96c74c
commit 6ec6fbc2cc
3 changed files with 52 additions and 0 deletions

View File

@@ -4820,6 +4820,11 @@ package android.view {
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 {
method public void relayout(android.view.WindowManager.LayoutParams);
method public void setView(@NonNull android.view.View, @NonNull android.view.WindowManager.LayoutParams);

View File

@@ -32,6 +32,7 @@ import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.Bitmap;
import android.graphics.ColorSpace;
@@ -216,6 +217,9 @@ public final class SurfaceControl implements Parcelable {
private static native void nativeSetFrameRate(
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 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);
}
}

View File

@@ -29,11 +29,13 @@
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_view_SurfaceSession.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
#include <private/gui/ComposerService.h>
#include <stdio.h>
#include <system/graphics.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));
}
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) {
const auto displayIds = SurfaceComposerClient::getPhysicalDisplayIds();
jlongArray array = env->NewLongArray(displayIds.size());
@@ -1474,6 +1493,10 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeSetShadowRadius },
{"nativeSetFrameRate", "(JJFI)V",
(void*)nativeSetFrameRate },
{"nativeAcquireFrameRateFlexibilityToken", "()J",
(void*)nativeAcquireFrameRateFlexibilityToken },
{"nativeReleaseFrameRateFlexibilityToken", "(J)V",
(void*)nativeReleaseFrameRateFlexibilityToken },
{"nativeGetPhysicalDisplayIds", "()[J",
(void*)nativeGetPhysicalDisplayIds },
{"nativeGetPhysicalDisplayToken", "(J)Landroid/os/IBinder;",