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

Commit a119aaa6 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

SurfaceFlinger: Propagate display flags correctly on creation

Test: atest SetupNewDisplayDeviceInternalTest
Bug: n/a
Change-Id: Ie6cbeedd5c096e953b6529f46c948a7b02ef47fc
parent 705c9926
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -2730,6 +2730,7 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
    display->setProjection(state.orientation, state.layerStackSpaceRect,
    display->setProjection(state.orientation, state.layerStackSpaceRect,
                           state.orientedDisplaySpaceRect);
                           state.orientedDisplaySpaceRect);
    display->setDisplayName(state.displayName);
    display->setDisplayName(state.displayName);
    display->setFlags(state.flags);


    return display;
    return display;
}
}
+28 −17
Original line number Original line Diff line number Diff line
@@ -233,7 +233,7 @@ struct HwcDisplayIdGetter<PhysicalDisplayIdType<PhysicalDisplay>> {
//     2) HalVirtualDisplayIdType<...> for hard-coded ID of virtual display backed by HWC.
//     2) HalVirtualDisplayIdType<...> for hard-coded ID of virtual display backed by HWC.
//     3) GpuVirtualDisplayIdType for virtual display without HWC backing.
//     3) GpuVirtualDisplayIdType for virtual display without HWC backing.
template <typename DisplayIdType, int width, int height, Critical critical, Async async,
template <typename DisplayIdType, int width, int height, Critical critical, Async async,
          Secure secure, Primary primary, int grallocUsage>
          Secure secure, Primary primary, int grallocUsage, int displayFlags>
struct DisplayVariant {
struct DisplayVariant {
    using DISPLAY_ID = DisplayIdGetter<DisplayIdType>;
    using DISPLAY_ID = DisplayIdGetter<DisplayIdType>;
    using CONNECTION_TYPE = DisplayConnectionTypeGetter<DisplayIdType>;
    using CONNECTION_TYPE = DisplayConnectionTypeGetter<DisplayIdType>;
@@ -261,6 +261,8 @@ struct DisplayVariant {
    // Whether the display is primary
    // Whether the display is primary
    static constexpr Primary PRIMARY = primary;
    static constexpr Primary PRIMARY = primary;


    static constexpr int DISPLAY_FLAGS = displayFlags;

    static auto makeFakeExistingDisplayInjector(DisplayTransactionTest* test) {
    static auto makeFakeExistingDisplayInjector(DisplayTransactionTest* test) {
        auto ceDisplayArgs = compositionengine::DisplayCreationArgsBuilder();
        auto ceDisplayArgs = compositionengine::DisplayCreationArgsBuilder();
        ceDisplayArgs.setId(DISPLAY_ID::get())
        ceDisplayArgs.setId(DISPLAY_ID::get())
@@ -469,15 +471,18 @@ struct HwcDisplayVariant {
constexpr uint32_t GRALLOC_USAGE_PHYSICAL_DISPLAY =
constexpr uint32_t GRALLOC_USAGE_PHYSICAL_DISPLAY =
        GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_FB;
        GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_FB;


constexpr int PHYSICAL_DISPLAY_FLAGS = 0x1;

template <typename PhysicalDisplay, int width, int height, Critical critical>
template <typename PhysicalDisplay, int width, int height, Critical critical>
struct PhysicalDisplayVariant
struct PhysicalDisplayVariant
      : DisplayVariant<PhysicalDisplayIdType<PhysicalDisplay>, width, height, critical,
      : DisplayVariant<PhysicalDisplayIdType<PhysicalDisplay>, width, height, critical,
                       Async::FALSE, Secure::TRUE, PhysicalDisplay::PRIMARY,
                       Async::FALSE, Secure::TRUE, PhysicalDisplay::PRIMARY,
                       GRALLOC_USAGE_PHYSICAL_DISPLAY>,
                       GRALLOC_USAGE_PHYSICAL_DISPLAY, PHYSICAL_DISPLAY_FLAGS>,
        HwcDisplayVariant<PhysicalDisplay::HWC_DISPLAY_ID, DisplayType::PHYSICAL,
        HwcDisplayVariant<
                          DisplayVariant<PhysicalDisplayIdType<PhysicalDisplay>, width, height,
                PhysicalDisplay::HWC_DISPLAY_ID, DisplayType::PHYSICAL,
                                         critical, Async::FALSE, Secure::TRUE,
                DisplayVariant<PhysicalDisplayIdType<PhysicalDisplay>, width, height, critical,
                                         PhysicalDisplay::PRIMARY, GRALLOC_USAGE_PHYSICAL_DISPLAY>,
                               Async::FALSE, Secure::TRUE, PhysicalDisplay::PRIMARY,
                               GRALLOC_USAGE_PHYSICAL_DISPLAY, PHYSICAL_DISPLAY_FLAGS>,
                PhysicalDisplay> {};
                PhysicalDisplay> {};


template <bool hasIdentificationData>
template <bool hasIdentificationData>
@@ -520,13 +525,16 @@ using TertiaryDisplayVariant = PhysicalDisplayVariant<TertiaryDisplay, 1600, 120
// A virtual display not supported by the HWC.
// A virtual display not supported by the HWC.
constexpr uint32_t GRALLOC_USAGE_NONHWC_VIRTUAL_DISPLAY = 0;
constexpr uint32_t GRALLOC_USAGE_NONHWC_VIRTUAL_DISPLAY = 0;


constexpr int VIRTUAL_DISPLAY_FLAGS = 0x0;

template <int width, int height, Secure secure>
template <int width, int height, Secure secure>
struct NonHwcVirtualDisplayVariant
struct NonHwcVirtualDisplayVariant
      : DisplayVariant<GpuVirtualDisplayIdType, width, height, Critical::FALSE, Async::TRUE, secure,
      : DisplayVariant<GpuVirtualDisplayIdType, width, height, Critical::FALSE, Async::TRUE, secure,
                       Primary::FALSE, GRALLOC_USAGE_NONHWC_VIRTUAL_DISPLAY> {
                       Primary::FALSE, GRALLOC_USAGE_NONHWC_VIRTUAL_DISPLAY,
    using Base =
                       VIRTUAL_DISPLAY_FLAGS> {
            DisplayVariant<GpuVirtualDisplayIdType, width, height, Critical::FALSE, Async::TRUE,
    using Base = DisplayVariant<GpuVirtualDisplayIdType, width, height, Critical::FALSE,
                           secure, Primary::FALSE, GRALLOC_USAGE_NONHWC_VIRTUAL_DISPLAY>;
                                Async::TRUE, secure, Primary::FALSE,
                                GRALLOC_USAGE_NONHWC_VIRTUAL_DISPLAY, VIRTUAL_DISPLAY_FLAGS>;


    static void injectHwcDisplay(DisplayTransactionTest*) {}
    static void injectHwcDisplay(DisplayTransactionTest*) {}


@@ -569,13 +577,16 @@ constexpr uint32_t GRALLOC_USAGE_HWC_VIRTUAL_DISPLAY = GRALLOC_USAGE_HW_COMPOSER
template <int width, int height, Secure secure>
template <int width, int height, Secure secure>
struct HwcVirtualDisplayVariant
struct HwcVirtualDisplayVariant
      : DisplayVariant<HalVirtualDisplayIdType<42>, width, height, Critical::FALSE, Async::TRUE,
      : DisplayVariant<HalVirtualDisplayIdType<42>, width, height, Critical::FALSE, Async::TRUE,
                       secure, Primary::FALSE, GRALLOC_USAGE_HWC_VIRTUAL_DISPLAY>,
                       secure, Primary::FALSE, GRALLOC_USAGE_HWC_VIRTUAL_DISPLAY,
        HwcDisplayVariant<HWC_VIRTUAL_DISPLAY_HWC_DISPLAY_ID, DisplayType::VIRTUAL,
                       VIRTUAL_DISPLAY_FLAGS>,
                          DisplayVariant<HalVirtualDisplayIdType<42>, width, height,
        HwcDisplayVariant<
                                         Critical::FALSE, Async::TRUE, secure, Primary::FALSE,
                HWC_VIRTUAL_DISPLAY_HWC_DISPLAY_ID, DisplayType::VIRTUAL,
                                         GRALLOC_USAGE_HWC_VIRTUAL_DISPLAY>> {
                DisplayVariant<HalVirtualDisplayIdType<42>, width, height, Critical::FALSE,
                               Async::TRUE, secure, Primary::FALSE,
                               GRALLOC_USAGE_HWC_VIRTUAL_DISPLAY, VIRTUAL_DISPLAY_FLAGS>> {
    using Base = DisplayVariant<HalVirtualDisplayIdType<42>, width, height, Critical::FALSE,
    using Base = DisplayVariant<HalVirtualDisplayIdType<42>, width, height, Critical::FALSE,
                                Async::TRUE, secure, Primary::FALSE, GRALLOC_USAGE_HW_COMPOSER>;
                                Async::TRUE, secure, Primary::FALSE, GRALLOC_USAGE_HW_COMPOSER,
                                VIRTUAL_DISPLAY_FLAGS>;
    using Self = HwcVirtualDisplayVariant<width, height, secure>;
    using Self = HwcVirtualDisplayVariant<width, height, secure>;


    static std::shared_ptr<compositionengine::Display> injectCompositionDisplay(
    static std::shared_ptr<compositionengine::Display> injectCompositionDisplay(
+3 −0
Original line number Original line Diff line number Diff line
@@ -257,6 +257,7 @@ void SetupNewDisplayDeviceInternalTest::setupNewDisplayDeviceInternalTest() {
    }
    }


    state.isSecure = static_cast<bool>(Case::Display::SECURE);
    state.isSecure = static_cast<bool>(Case::Display::SECURE);
    state.flags = Case::Display::DISPLAY_FLAGS;


    auto device = mFlinger.setupNewDisplayDeviceInternal(displayToken, compositionDisplay, state,
    auto device = mFlinger.setupNewDisplayDeviceInternal(displayToken, compositionDisplay, state,
                                                         displaySurface, producer);
                                                         displaySurface, producer);
@@ -279,6 +280,8 @@ void SetupNewDisplayDeviceInternalTest::setupNewDisplayDeviceInternalTest() {
    EXPECT_EQ(Case::HdrSupport::HDR_DOLBY_VISION_SUPPORTED, device->hasDolbyVisionSupport());
    EXPECT_EQ(Case::HdrSupport::HDR_DOLBY_VISION_SUPPORTED, device->hasDolbyVisionSupport());
    EXPECT_EQ(Case::PerFrameMetadataSupport::PER_FRAME_METADATA_KEYS,
    EXPECT_EQ(Case::PerFrameMetadataSupport::PER_FRAME_METADATA_KEYS,
              device->getSupportedPerFrameMetadata());
              device->getSupportedPerFrameMetadata());
    EXPECT_EQ(Case::Display::DISPLAY_FLAGS & DisplayDevice::eReceivesInput,
              device->receivesInput());


    if constexpr (Case::Display::CONNECTION_TYPE::value) {
    if constexpr (Case::Display::CONNECTION_TYPE::value) {
        EXPECT_EQ(1, device->getSupportedModes().size());
        EXPECT_EQ(1, device->getSupportedModes().size());