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

Commit b363c4c2 authored by Dominik Laskowski's avatar Dominik Laskowski
Browse files

SF: Introduce DisplaySnapshot

DisplaySnapshot stores the immutable state of a physical display,
captured on hotplug. The SurfaceFlinger class stores a map from
PhysicalDisplayId to PhysicalDisplay, a new class that augments
this state with the sp<DisplayToken>.

Later, DisplayDevice will be removed, and SF::mDisplays will map
wp<DisplayToken> to compositionengine::Display.

Bug: 241285876
Test: libsurfaceflinger_unittest
Test: dumpsys SurfaceFlinger --displays
Change-Id: I172df87c4a7a9cf64659ff9cfbd6df195ee4bc8d
parent ab824d9d
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -17,9 +17,10 @@
#pragma once

#include <cstdint>
#include <optional>
#include <string>

#include <ftl/optional.h>

namespace android {

// ID of a physical or a virtual display. This class acts as a type safe wrapper around uint64_t.
@@ -68,7 +69,7 @@ inline std::string to_string(DisplayId displayId) {

// DisplayId of a physical display, such as the internal display or externally connected display.
struct PhysicalDisplayId : DisplayId {
    static constexpr std::optional<PhysicalDisplayId> tryCast(DisplayId id) {
    static constexpr ftl::Optional<PhysicalDisplayId> tryCast(DisplayId id) {
        if (id.value & FLAG_VIRTUAL) {
            return std::nullopt;
        }
+1 −1
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@

namespace android::ui {

enum class DisplayConnectionType { Internal, External };
enum class DisplayConnectionType { Internal, External, ftl_last = External };

// Immutable information about physical display.
struct StaticDisplayInfo {
+4 −3
Original line number Diff line number Diff line
@@ -141,19 +141,20 @@ filegroup {
    name: "libsurfaceflinger_sources",
    srcs: [
        "BackgroundExecutor.cpp",
        "ClientCache.cpp",
        "Client.cpp",
        "EffectLayer.cpp",
        "ClientCache.cpp",
        "Display/DisplaySnapshot.cpp",
        "DisplayDevice.cpp",
        "DisplayHardware/AidlComposerHal.cpp",
        "DisplayHardware/HidlComposerHal.cpp",
        "DisplayHardware/ComposerHal.cpp",
        "DisplayHardware/FramebufferSurface.cpp",
        "DisplayHardware/HWC2.cpp",
        "DisplayHardware/HWComposer.cpp",
        "DisplayHardware/HidlComposerHal.cpp",
        "DisplayHardware/PowerAdvisor.cpp",
        "DisplayHardware/VirtualDisplaySurface.cpp",
        "DisplayRenderArea.cpp",
        "EffectLayer.cpp",
        "Effects/Daltonizer.cpp",
        "EventLog/EventLog.cpp",
        "FlagManager.cpp",
+31 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <ftl/small_map.h>

namespace android::display {

// The static capacities were chosen to exceed a typical number of physical and/or virtual displays.

template <typename Key, typename Value>
using DisplayMap = ftl::SmallMap<Key, Value, 5>;

template <typename Key, typename Value>
using PhysicalDisplayMap = ftl::SmallMap<Key, Value, 3>;

} // namespace android::display
+58 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <functional>
#include <utility>

#include <ftl/algorithm.h>
#include <ftl/enum.h>

#include "DisplaySnapshot.h"

namespace android::display {

DisplaySnapshot::DisplaySnapshot(PhysicalDisplayId displayId,
                                 ui::DisplayConnectionType connectionType,
                                 DisplayModes&& displayModes,
                                 std::optional<DeviceProductInfo>&& deviceProductInfo)
      : mDisplayId(displayId),
        mConnectionType(connectionType),
        mDisplayModes(std::move(displayModes)),
        mDeviceProductInfo(std::move(deviceProductInfo)) {}

std::optional<DisplayModeId> DisplaySnapshot::translateModeId(hal::HWConfigId hwcId) const {
    return ftl::find_if(mDisplayModes,
                        [hwcId](const DisplayModes::value_type& pair) {
                            return pair.second->getHwcId() == hwcId;
                        })
            .transform(&ftl::to_key<DisplayModes>);
}

void DisplaySnapshot::dump(std::string& out) const {
    using namespace std::string_literals;

    out += "   connectionType="s;
    out += ftl::enum_string(mConnectionType);

    out += "\n   deviceProductInfo="s;
    if (mDeviceProductInfo) {
        mDeviceProductInfo->dump(out);
    } else {
        out += "{}"s;
    }
}

} // namespace android::display
Loading