Merge "Only create DPCs for LocalDisplays & FLAG_OWN_DISPLAY_GROUP" into sc-dev

This commit is contained in:
Sean Stout
2021-03-20 00:48:53 +00:00
committed by Android (Google) Code Review
3 changed files with 36 additions and 23 deletions

View File

@@ -1134,8 +1134,13 @@ public final class DisplayManagerService extends SystemService {
recordStableDisplayStatsIfNeededLocked(display); recordStableDisplayStatsIfNeededLocked(display);
recordTopInsetLocked(display); recordTopInsetLocked(display);
} }
addDisplayPowerControllerLocked(display); final int groupId = mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(displayId);
mDisplayStates.append(displayId, Display.STATE_UNKNOWN); if (groupId != Display.INVALID_DISPLAY_GROUP) {
addDisplayPowerControllerLocked(display);
mDisplayStates.append(displayId, Display.STATE_UNKNOWN);
} else {
mDisplayStates.append(displayId, Display.STATE_ON);
}
mDisplayBrightnesses.append(displayId, display.getDisplayInfoLocked().brightnessDefault); mDisplayBrightnesses.append(displayId, display.getDisplayInfoLocked().brightnessDefault);
DisplayManagerGlobal.invalidateLocalDisplayInfoCaches(); DisplayManagerGlobal.invalidateLocalDisplayInfoCaches();
@@ -1214,8 +1219,7 @@ public final class DisplayManagerService extends SystemService {
final int displayId = display.getDisplayIdLocked(); final int displayId = display.getDisplayIdLocked();
final int state = mDisplayStates.get(displayId); final int state = mDisplayStates.get(displayId);
// Only send a request for display state if the display state has already been // Only send a request for display state if display state has already been initialized.
// initialized by DisplayPowercontroller.
if (state != Display.STATE_UNKNOWN) { if (state != Display.STATE_UNKNOWN) {
final float brightness = mDisplayBrightnesses.get(displayId); final float brightness = mDisplayBrightnesses.get(displayId);
return device.requestDisplayStateLocked(state, brightness); return device.requestDisplayStateLocked(state, brightness);

View File

@@ -433,31 +433,37 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
final int displayId = display.getDisplayIdLocked(); final int displayId = display.getDisplayIdLocked();
// Get current display group data // Get current display group data
int groupId = getDisplayGroupIdFromDisplayIdLocked(displayId); final int groupId = getDisplayGroupIdFromDisplayIdLocked(displayId);
final DisplayGroup oldGroup = getDisplayGroupLocked(groupId); final DisplayGroup oldGroup = getDisplayGroupLocked(groupId);
// Get the new display group if a change is needed // Get the new display group if a change is needed
final DisplayInfo info = display.getDisplayInfoLocked(); final DisplayInfo info = display.getDisplayInfoLocked();
final boolean needsOwnDisplayGroup = (info.flags & Display.FLAG_OWN_DISPLAY_GROUP) != 0; final boolean needsOwnDisplayGroup = (info.flags & Display.FLAG_OWN_DISPLAY_GROUP) != 0;
final boolean hasOwnDisplayGroup = groupId != Display.DEFAULT_DISPLAY_GROUP; final boolean hasOwnDisplayGroup = groupId != Display.DEFAULT_DISPLAY_GROUP;
if (groupId == Display.INVALID_DISPLAY_GROUP final boolean needsDisplayGroup = needsOwnDisplayGroup || info.type == Display.TYPE_INTERNAL
|| hasOwnDisplayGroup != needsOwnDisplayGroup) { || info.type == Display.TYPE_EXTERNAL;
groupId = assignDisplayGroupIdLocked(needsOwnDisplayGroup); if (!needsDisplayGroup) {
}
// Create a new group if needed
DisplayGroup newGroup = getDisplayGroupLocked(groupId);
if (newGroup == null) {
newGroup = new DisplayGroup(groupId);
mDisplayGroups.append(groupId, newGroup);
}
if (oldGroup != newGroup) {
if (oldGroup != null) { if (oldGroup != null) {
oldGroup.removeDisplayLocked(display); oldGroup.removeDisplayLocked(display);
} }
return;
}
if (groupId == Display.INVALID_DISPLAY_GROUP
|| hasOwnDisplayGroup != needsOwnDisplayGroup) {
if (oldGroup != null) {
oldGroup.removeDisplayLocked(display);
}
final int newGroupId = assignDisplayGroupIdLocked(needsOwnDisplayGroup);
// Create a new group if needed
DisplayGroup newGroup = getDisplayGroupLocked(newGroupId);
if (newGroup == null) {
newGroup = new DisplayGroup(newGroupId);
mDisplayGroups.append(newGroupId, newGroup);
}
newGroup.addDisplayLocked(display); newGroup.addDisplayLocked(display);
display.updateDisplayGroupIdLocked(groupId); display.updateDisplayGroupIdLocked(newGroupId);
Slog.i(TAG, "Setting new display group " + groupId + " for display " Slog.i(TAG, "Setting new display group " + newGroupId + " for display "
+ displayId + ", from previous group: " + displayId + ", from previous group: "
+ (oldGroup != null ? oldGroup.getGroupId() : "null")); + (oldGroup != null ? oldGroup.getGroupId() : "null"));
} }

View File

@@ -186,11 +186,14 @@ public class LogicalDisplayMapperTest {
LogicalDisplay display2 = add(createDisplayDevice(Display.TYPE_INTERNAL, 600, 800, 0)); LogicalDisplay display2 = add(createDisplayDevice(Display.TYPE_INTERNAL, 600, 800, 0));
LogicalDisplay display3 = add(createDisplayDevice(Display.TYPE_VIRTUAL, 600, 800, 0)); LogicalDisplay display3 = add(createDisplayDevice(Display.TYPE_VIRTUAL, 600, 800, 0));
// Physical displays should be automatically put into the default group.
assertEquals(Display.DEFAULT_DISPLAY_GROUP, assertEquals(Display.DEFAULT_DISPLAY_GROUP,
mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display1))); mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display1)));
assertEquals(Display.DEFAULT_DISPLAY_GROUP, assertEquals(Display.DEFAULT_DISPLAY_GROUP,
mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display2))); mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display2)));
assertEquals(Display.DEFAULT_DISPLAY_GROUP,
// Virtual displays should belong to no group by default.
assertEquals(Display.INVALID_DISPLAY_GROUP,
mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3))); mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
} }
@@ -212,13 +215,13 @@ public class LogicalDisplayMapperTest {
assertNotEquals(Display.DEFAULT_DISPLAY_GROUP, assertNotEquals(Display.DEFAULT_DISPLAY_GROUP,
mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3))); mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
// Now switch it back to the default group by removing the flag and issuing an update // Now switch it to the invalid group by removing the flag and issuing an update
DisplayDeviceInfo info = device3.getSourceInfo(); DisplayDeviceInfo info = device3.getSourceInfo();
info.flags = info.flags & ~DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP; info.flags = info.flags & ~DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP;
mDisplayDeviceRepo.onDisplayDeviceEvent(device3, DISPLAY_DEVICE_EVENT_CHANGED); mDisplayDeviceRepo.onDisplayDeviceEvent(device3, DISPLAY_DEVICE_EVENT_CHANGED);
// Verify the new group is correct. // Verify the virtual display has not been placed into a group.
assertEquals(Display.DEFAULT_DISPLAY_GROUP, assertEquals(Display.INVALID_DISPLAY_GROUP,
mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3))); mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
} }