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

Commit 2b830b1e authored by Xiang Wang's avatar Xiang Wang Committed by Android (Google) Code Review
Browse files

Merge changes If537a25e,Iee14d6ee

* changes:
  Reset FPS when device config resets or app opts in to a game mode
  Override config should trigger intervention ignoring opt-in info
parents 011a7953 018d4534
Loading
Loading
Loading
Loading
+69 −29
Original line number Diff line number Diff line
@@ -490,6 +490,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
        private final Object mModeConfigLock = new Object();
        @GuardedBy("mModeConfigLock")
        private final ArrayMap<Integer, GameModeConfiguration> mModeConfigs = new ArrayMap<>();
        // if adding new properties or make any of the below overridable, the method
        // copyAndApplyOverride should be updated accordingly
        private boolean mPerfModeOptedIn = false;
        private boolean mBatteryModeOptedIn = false;
        private boolean mAllowDownscale = true;
@@ -800,6 +802,42 @@ public final class GameManagerService extends IGameManagerService.Stub {
            }
        }

        GamePackageConfiguration copyAndApplyOverride(GamePackageConfiguration overrideConfig) {
            GamePackageConfiguration copy = new GamePackageConfiguration(mPackageName);
            // if a game mode is overridden, we treat it with the highest priority and reset any
            // opt-in game modes so that interventions are always executed.
            copy.mPerfModeOptedIn = mPerfModeOptedIn && !(overrideConfig != null
                    && overrideConfig.getGameModeConfiguration(GameManager.GAME_MODE_PERFORMANCE)
                    != null);
            copy.mBatteryModeOptedIn = mBatteryModeOptedIn && !(overrideConfig != null
                    && overrideConfig.getGameModeConfiguration(GameManager.GAME_MODE_BATTERY)
                    != null);

            // if any game mode is overridden, we will consider all interventions forced-active,
            // this can be done more granular by checking if a specific intervention is
            // overridden under each game mode override, but only if necessary.
            copy.mAllowDownscale = mAllowDownscale || overrideConfig != null;
            copy.mAllowAngle = mAllowAngle || overrideConfig != null;
            copy.mAllowFpsOverride = mAllowFpsOverride || overrideConfig != null;
            if (overrideConfig != null) {
                synchronized (copy.mModeConfigLock) {
                    synchronized (mModeConfigLock) {
                        for (Map.Entry<Integer, GameModeConfiguration> entry :
                                mModeConfigs.entrySet()) {
                            copy.mModeConfigs.put(entry.getKey(), entry.getValue());
                        }
                    }
                    synchronized (overrideConfig.mModeConfigLock) {
                        for (Map.Entry<Integer, GameModeConfiguration> entry :
                                overrideConfig.mModeConfigs.entrySet()) {
                            copy.mModeConfigs.put(entry.getKey(), entry.getValue());
                        }
                    }
                }
            }
            return copy;
        }

        public String toString() {
            synchronized (mModeConfigLock) {
                return "[Name:" + mPackageName + " Modes: " + mModeConfigs.toString() + "]";
@@ -1298,7 +1336,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
        try {
            final float fps = 0.0f;
            final int uid = mPackageManager.getPackageUidAsUser(packageName, userId);
            nativeSetOverrideFrameRate(uid, fps);
            setOverrideFrameRate(uid, fps);
        } catch (PackageManager.NameNotFoundException e) {
            return;
        }
@@ -1330,7 +1368,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
        try {
            final float fps = modeConfig.getFps();
            final int uid = mPackageManager.getPackageUidAsUser(packageName, userId);
            nativeSetOverrideFrameRate(uid, fps);
            setOverrideFrameRate(uid, fps);
        } catch (PackageManager.NameNotFoundException e) {
            return;
        }
@@ -1339,18 +1377,18 @@ public final class GameManagerService extends IGameManagerService.Stub {

    private void updateInterventions(String packageName,
            @GameMode int gameMode, @UserIdInt int userId) {
        final GamePackageConfiguration packageConfig = getConfig(packageName, userId);
        if (gameMode == GameManager.GAME_MODE_STANDARD
                || gameMode == GameManager.GAME_MODE_UNSUPPORTED) {
                || gameMode == GameManager.GAME_MODE_UNSUPPORTED || packageConfig == null
                || packageConfig.willGamePerformOptimizations(gameMode)) {
            resetFps(packageName, userId);
            return;
        }
        final GamePackageConfiguration packageConfig = getConfig(packageName, userId);
            // resolution scaling does not need to be reset as it's now read dynamically on game
            // restart, see #getResolutionScalingFactor and CompatModePackages#getCompatScale.
            // TODO: reset Angle intervention here once implemented
            if (packageConfig == null) {
                Slog.v(TAG, "Package configuration not found for " + packageName);
                return;
            }
        if (packageConfig.willGamePerformOptimizations(gameMode)) {
            return;
        }
        updateFps(packageConfig, packageName, gameMode, userId);
        updateUseAngle(packageName, gameMode);
@@ -1375,7 +1413,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
            // look for the existing GamePackageConfiguration override
            configOverride = settings.getConfigOverride(packageName);
            if (configOverride == null) {
                configOverride = new GamePackageConfiguration(mPackageManager, packageName, userId);
                configOverride = new GamePackageConfiguration(packageName);
                settings.setConfigOverride(packageName, configOverride);
            }
        }
@@ -1430,18 +1468,12 @@ public final class GameManagerService extends IGameManagerService.Stub {
                    return;
                }
                // if the game mode to reset is the only mode other than standard mode or there
                // is device config, the config override is removed.
                // is device config, the entire package config override is removed.
                if (Integer.bitCount(modesBitfield) <= 2 || deviceConfig == null) {
                    settings.removeConfigOverride(packageName);
                } else {
                    final GamePackageConfiguration.GameModeConfiguration defaultModeConfig =
                            deviceConfig.getGameModeConfiguration(gameModeToReset);
                    // otherwise we reset the mode by copying the original config.
                    if (defaultModeConfig == null) {
                    // otherwise we reset the mode by removing the game mode config override
                    configOverride.removeModeConfig(gameModeToReset);
                    } else {
                        configOverride.addModeConfig(defaultModeConfig);
                    }
                }
            } else {
                settings.removeConfigOverride(packageName);
@@ -1661,18 +1693,21 @@ public final class GameManagerService extends IGameManagerService.Stub {
     * @hide
     */
    public GamePackageConfiguration getConfig(String packageName, int userId) {
        GamePackageConfiguration packageConfig = null;
        GamePackageConfiguration overrideConfig = null;
        GamePackageConfiguration config;
        synchronized (mDeviceConfigLock) {
            config = mConfigs.get(packageName);
        }

        synchronized (mLock) {
            if (mSettings.containsKey(userId)) {
                packageConfig = mSettings.get(userId).getConfigOverride(packageName);
                overrideConfig = mSettings.get(userId).getConfigOverride(packageName);
            }
        }
        if (packageConfig == null) {
            synchronized (mDeviceConfigLock) {
                packageConfig = mConfigs.get(packageName);
            }
        if (overrideConfig == null || config == null) {
            return overrideConfig == null ? config : overrideConfig;
        }
        return packageConfig;
        return config.copyAndApplyOverride(overrideConfig);
    }

    private void registerPackageReceiver() {
@@ -1774,6 +1809,11 @@ public final class GameManagerService extends IGameManagerService.Stub {
        return handlerThread;
    }

    @VisibleForTesting
    void setOverrideFrameRate(int uid, float frameRate) {
        nativeSetOverrideFrameRate(uid, frameRate);
    }

    /**
     * load dynamic library for frame rate overriding JNI calls
     */
+9 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<game-mode-config
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:supportsPerformanceGameMode="true"
    android:supportsBatteryGameMode="true"
    android:allowGameAngleDriver="false"
    android:allowGameDownscaling="false"
    android:allowGameFpsOverride="false"
/>
 No newline at end of file
+0 −0

File moved.

+9 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<game-mode-config
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:supportsPerformanceGameMode="true"
    android:supportsBatteryGameMode="true"
    android:allowGameAngleDriver="true"
    android:allowGameDownscaling="true"
    android:allowGameFpsOverride="true"
/>
 No newline at end of file
+0 −0

File moved.

Loading