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

Commit 8248bda4 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "DisplayModeDirector: use configGroup when choosing default config" into...

Merge "DisplayModeDirector: use configGroup when choosing default config" into rvc-dev am: 97ce4799 am: 86a7b2c3

Change-Id: I4684b589b66727b3aa79f8731f7a1c93cfd6d750
parents c21488b2 86a7b2c3
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -1304,6 +1304,11 @@ public final class SurfaceControl implements Parcelable {
     * @hide
     */
    public static final class DisplayConfig {
        /**
         * Invalid display config id.
         */
        public static final int INVALID_DISPLAY_CONFIG_ID = -1;

        public int width;
        public int height;
        public float xDpi;
@@ -1313,6 +1318,14 @@ public final class SurfaceControl implements Parcelable {
        public long appVsyncOffsetNanos;
        public long presentationDeadlineNanos;

        /**
         * The config group ID this config is associated to.
         * Configs in the same group are similar from vendor's perspective and switching between
         * configs within the same group can be done seamlessly in most cases.
         * @see: android.hardware.graphics.composer@2.4::IComposerClient::Attribute::CONFIG_GROUP
         */
        public int configGroup;

        @Override
        public String toString() {
            return "DisplayConfig{width=" + width
@@ -1321,7 +1334,8 @@ public final class SurfaceControl implements Parcelable {
                    + ", yDpi=" + yDpi
                    + ", refreshRate=" + refreshRate
                    + ", appVsyncOffsetNanos=" + appVsyncOffsetNanos
                    + ", presentationDeadlineNanos=" + presentationDeadlineNanos + "}";
                    + ", presentationDeadlineNanos=" + presentationDeadlineNanos
                    + ", configGroup=" + configGroup + "}";
        }
    }

+3 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ static struct {
    jfieldID refreshRate;
    jfieldID appVsyncOffsetNanos;
    jfieldID presentationDeadlineNanos;
    jfieldID configGroup;
} gDisplayConfigClassInfo;

static struct {
@@ -874,6 +875,7 @@ static jobjectArray nativeGetDisplayConfigs(JNIEnv* env, jclass clazz, jobject t
                          config.appVsyncOffset);
        env->SetLongField(object, gDisplayConfigClassInfo.presentationDeadlineNanos,
                          config.presentationDeadline);
        env->SetIntField(object, gDisplayConfigClassInfo.configGroup, config.configGroup);
        env->SetObjectArrayElement(configArray, static_cast<jsize>(c), object);
        env->DeleteLocalRef(object);
    }
@@ -1614,6 +1616,7 @@ int register_android_view_SurfaceControl(JNIEnv* env)
            GetFieldIDOrDie(env, configClazz, "appVsyncOffsetNanos", "J");
    gDisplayConfigClassInfo.presentationDeadlineNanos =
            GetFieldIDOrDie(env, configClazz, "presentationDeadlineNanos", "J");
    gDisplayConfigClassInfo.configGroup = GetFieldIDOrDie(env, configClazz, "configGroup", "I");

    jclass rectClazz = FindClassOrDie(env, "android/graphics/Rect");
    gRectClassInfo.bottom = GetFieldIDOrDie(env, rectClazz, "bottom", "I");
+27 −5
Original line number Diff line number Diff line
@@ -181,6 +181,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
        private int mState = Display.STATE_UNKNOWN;
        private float mBrightnessState = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        private int mDefaultModeId;
        private int mDefaultConfigGroup;
        private int mActiveModeId;
        private boolean mActiveModeInvalid;
        private DisplayModeDirector.DesiredDisplayModeSpecs mDisplayModeSpecs =
@@ -332,15 +333,18 @@ final class LocalDisplayAdapter extends DisplayAdapter {
            // For a new display, we need to initialize the default mode ID.
            if (mDefaultModeId == NO_DISPLAY_MODE_ID) {
                mDefaultModeId = activeRecord.mMode.getModeId();
                mDefaultConfigGroup = configs[activeConfigId].configGroup;
            } else if (modesAdded && mActiveModeId != activeRecord.mMode.getModeId()) {
                Slog.d(TAG, "New display modes are added and the active mode has changed, "
                        + "use active mode as default mode.");
                mActiveModeId = activeRecord.mMode.getModeId();
                mDefaultModeId = activeRecord.mMode.getModeId();
            } else if (findDisplayConfigIdLocked(mDefaultModeId) < 0) {
                mDefaultConfigGroup = configs[activeConfigId].configGroup;
            } else if (findDisplayConfigIdLocked(mDefaultModeId, mDefaultConfigGroup) < 0) {
                Slog.w(TAG, "Default display mode no longer available, using currently"
                        + " active mode as default.");
                mDefaultModeId = activeRecord.mMode.getModeId();
                mDefaultConfigGroup = configs[activeConfigId].configGroup;
            }

            // Determine whether the display mode specs' base mode is still there.
@@ -754,7 +758,16 @@ final class LocalDisplayAdapter extends DisplayAdapter {
                // a valid mode.
                return;
            }
            int baseConfigId = findDisplayConfigIdLocked(displayModeSpecs.baseModeId);

            // Find the config Id based on the desired mode specs. In case there is more than one
            // config matching the mode spec, prefer the one that is in the default config group.
            // For now the default config group is taken from the active config when we got the
            // hotplug event for the display. In the future we might want to change the default
            // config based on vendor requirements.
            // Note: We prefer the default config group over the current one as this is the config
            // group the vendor prefers.
            int baseConfigId = findDisplayConfigIdLocked(displayModeSpecs.baseModeId,
                    mDefaultConfigGroup);
            if (baseConfigId < 0) {
                // When a display is hotplugged, it's possible for a mode to be removed that was
                // previously valid. Because of the way display changes are propagated through the
@@ -906,17 +919,26 @@ final class LocalDisplayAdapter extends DisplayAdapter {
            pw.print("mSupportedColorModes=" + mSupportedColorModes.toString());
        }

        private int findDisplayConfigIdLocked(int modeId) {
        private int findDisplayConfigIdLocked(int modeId, int configGroup) {
            int matchingConfigId = SurfaceControl.DisplayConfig.INVALID_DISPLAY_CONFIG_ID;
            DisplayModeRecord record = mSupportedModes.get(modeId);
            if (record != null) {
                for (int i = 0; i < mDisplayConfigs.length; i++) {
                    SurfaceControl.DisplayConfig config = mDisplayConfigs[i];
                    if (record.hasMatchingMode(config)) {
                        if (matchingConfigId
                                == SurfaceControl.DisplayConfig.INVALID_DISPLAY_CONFIG_ID) {
                            matchingConfigId = i;
                        }

                        // Prefer to return a config that matches the configGroup
                        if (config.configGroup == configGroup) {
                            return i;
                        }
                    }
                }
            return -1;
            }
            return matchingConfigId;
        }

        private int findMatchingModeIdLocked(int configId) {