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

Commit 2c327ac2 authored by Peiyong Lin's avatar Peiyong Lin
Browse files

[SurfaceFlinger] Plumb getPerFrameMetadataKeys and setLayerPerFrameMetadata.

This patch compresses supported metdata types into a bitmask and stores it in
DisplayDevice and refactors the code in Hwc2::Layer regarding HdrMetadata. When
DisplayDevice is created, the ability of accepting metadata will be queried
from hardware composer and stored in DisplayDevice. Hwc2::Layer will construct
HdrMetadata to PerFrameMetadata when setPerFrameHdrMetadata is called if the
incoming meta data is changed.

Previously, setLayerPerFrameMetadata was named as setLayerHdrMetadata, but
since we move the responsibility of constructing PerFrameMetadata from
ComposerHal to Hwc2::Layer, we change the name to setLayerPerFrameMetadata,
which is more generic and matches the HIDL interface.

BUG: 77831156
Test: Build and flash
Change-Id: I447956f4dcf42c90ceb3d29091cd5034ad91061a
Merged-In: I447956f4dcf42c90ceb3d29091cd5034ad91061a
parent d3898410
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -650,7 +650,7 @@ void BufferLayer::setPerFrameData(const sp<const DisplayDevice>& displayDevice)
    }

    const HdrMetadata& metadata = mConsumer->getCurrentHdrMetadata();
    error = hwcLayer->setHdrMetadata(metadata);
    error = hwcLayer->setPerFrameMetadata(displayDevice->getSupportedPerFrameMetadata(), metadata);
    if (error != HWC2::Error::None && error != HWC2::Error::Unsupported) {
        ALOGE("[%s] Failed to set hdrMetadata: %s (%d)", mName.string(),
              to_string(error).c_str(), static_cast<int32_t>(error));
+3 −1
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ DisplayDevice::DisplayDevice(
        int displayHeight,
        bool hasWideColorGamut,
        const HdrCapabilities& hdrCapabilities,
        const int32_t supportedPerFrameMetadata,
        int initialPowerMode)
    : lastCompositionHadVisibleLayers(false),
      mFlinger(flinger),
@@ -103,7 +104,8 @@ DisplayDevice::DisplayDevice(
      mHasWideColorGamut(hasWideColorGamut),
      mHasHdr10(false),
      mHasHLG(false),
      mHasDolbyVision(false)
      mHasDolbyVision(false),
      mSupportedPerFrameMetadata(supportedPerFrameMetadata)
{
    // clang-format on
    for (Hdr hdrType : hdrCapabilities.getSupportedHdrTypes()) {
+9 −5
Original line number Diff line number Diff line
@@ -23,17 +23,16 @@

#include <math/mat4.h>

#include <ui/Region.h>

#include <binder/IBinder.h>
#include <gui/ISurfaceComposer.h>
#include <hardware/hwcomposer_defs.h>
#include <ui/GraphicTypes.h>
#include <ui/Region.h>
#include <utils/RefBase.h>
#include <utils/Mutex.h>
#include <utils/String8.h>
#include <utils/Timers.h>

#include <gui/ISurfaceComposer.h>
#include <hardware/hwcomposer_defs.h>
#include <ui/GraphicTypes.h>
#include "RenderArea.h"
#include "RenderEngine/Surface.h"

@@ -86,6 +85,7 @@ public:
            int displayHeight,
            bool hasWideColorGamut,
            const HdrCapabilities& hdrCapabilities,
            const int32_t supportedPerFrameMetadata,
            int initialPowerMode);
    // clang-format on

@@ -131,6 +131,8 @@ public:
    int32_t                 getHwcDisplayId() const { return mHwcDisplayId; }
    const wp<IBinder>&      getDisplayToken() const { return mDisplayToken; }

    int32_t getSupportedPerFrameMetadata() const { return mSupportedPerFrameMetadata; }

    // We pass in mustRecompose so we can keep VirtualDisplaySurface's state
    // machine happy without actually queueing a buffer if nothing has changed
    status_t beginFrame(bool mustRecompose) const;
@@ -259,6 +261,8 @@ private:
    bool mHasHdr10;
    bool mHasHLG;
    bool mHasDolbyVision;

    const int32_t mSupportedPerFrameMetadata;
};

struct DisplayDeviceState {
+12 −42
Original line number Diff line number Diff line
@@ -715,48 +715,6 @@ Error Composer::setLayerDataspace(Display display, Layer layer,
    return Error::NONE;
}

Error Composer::setLayerHdrMetadata(Display display, Layer layer, const HdrMetadata& metadata) {
    if (!mClient_2_2) {
        return Error::UNSUPPORTED;
    }

    mWriter.selectDisplay(display);
    mWriter.selectLayer(layer);

    std::vector<IComposerClient::PerFrameMetadata> composerMetadata;
    using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey;
    if (metadata.validTypes & HdrMetadata::SMPTE2086) {
        composerMetadata
                .insert(composerMetadata.end(),
                        {{PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X,
                          metadata.smpte2086.displayPrimaryRed.x},
                         {PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y,
                          metadata.smpte2086.displayPrimaryRed.y},
                         {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X,
                          metadata.smpte2086.displayPrimaryGreen.x},
                         {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y,
                          metadata.smpte2086.displayPrimaryGreen.y},
                         {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X,
                          metadata.smpte2086.displayPrimaryBlue.x},
                         {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y,
                          metadata.smpte2086.displayPrimaryBlue.y},
                         {PerFrameMetadataKey::WHITE_POINT_X, metadata.smpte2086.whitePoint.x},
                         {PerFrameMetadataKey::WHITE_POINT_Y, metadata.smpte2086.whitePoint.y},
                         {PerFrameMetadataKey::MAX_LUMINANCE, metadata.smpte2086.maxLuminance},
                         {PerFrameMetadataKey::MIN_LUMINANCE, metadata.smpte2086.minLuminance}});
    }
    if (metadata.validTypes & HdrMetadata::CTA861_3) {
        composerMetadata.insert(composerMetadata.end(),
                                {{PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL,
                                  metadata.cta8613.maxContentLightLevel},
                                 {PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL,
                                  metadata.cta8613.maxFrameAverageLightLevel}});
    }

    mWriter.setLayerPerFrameMetadata(composerMetadata);
    return Error::NONE;
}

Error Composer::setLayerDisplayFrame(Display display, Layer layer,
        const IComposerClient::Rect& frame)
{
@@ -927,6 +885,18 @@ Error Composer::execute()

// Composer HAL 2.2

Error Composer::setLayerPerFrameMetadata(Display display, Layer layer,
        const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
    if (!mClient_2_2) {
        return Error::UNSUPPORTED;
    }

    mWriter.selectDisplay(display);
    mWriter.selectLayer(layer);
    mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
    return Error::NONE;
}

Error Composer::getPerFrameMetadataKeys(
        Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) {
    if (!mClient_2_2) {
+9 −3
Original line number Diff line number Diff line
@@ -64,6 +64,9 @@ using V2_2::CommandWriterBase;
using V2_2::IComposer;
using V2_2::IComposerClient;

using PerFrameMetadata = IComposerClient::PerFrameMetadata;
using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey;

class Composer {
public:
    virtual ~Composer() = 0;
@@ -160,8 +163,6 @@ public:
    virtual Error setLayerCompositionType(Display display, Layer layer,
                                          IComposerClient::Composition type) = 0;
    virtual Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) = 0;
    virtual Error setLayerHdrMetadata(Display display, Layer layer,
                                      const HdrMetadata& metadata) = 0;
    virtual Error setLayerDisplayFrame(Display display, Layer layer,
                                       const IComposerClient::Rect& frame) = 0;
    virtual Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) = 0;
@@ -176,6 +177,9 @@ public:
    virtual Error setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) = 0;

    // Composer HAL 2.2
    virtual Error setLayerPerFrameMetadata(
            Display display, Layer layer,
            const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) = 0;
    virtual Error getPerFrameMetadataKeys(
            Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) = 0;
    virtual Error getRenderIntents(Display display, ColorMode colorMode,
@@ -353,7 +357,6 @@ public:
    Error setLayerCompositionType(Display display, Layer layer,
                                  IComposerClient::Composition type) override;
    Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) override;
    Error setLayerHdrMetadata(Display display, Layer layer, const HdrMetadata& metadata) override;
    Error setLayerDisplayFrame(Display display, Layer layer,
                               const IComposerClient::Rect& frame) override;
    Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override;
@@ -368,6 +371,9 @@ public:
    Error setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) override;

    // Composer HAL 2.2
    Error setLayerPerFrameMetadata(
            Display display, Layer layer,
            const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) override;
    Error getPerFrameMetadataKeys(
            Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) override;
    Error getRenderIntents(Display display, ColorMode colorMode,
Loading