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

Commit 07dcd497 authored by Brian Lindahl's avatar Brian Lindahl
Browse files

Allow apps to apply picture profiles with priority to layers

Bug: 337330263
Test: build
Test: atest LayerSnapshotTest
Flag: com.android.graphics.libgui.flags.apply_picture_profiles
Change-Id: I1adb6069d0168084abf0a76d310abb4ffad5ce5f
parent 1a4ffd89
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <android/gui/ISurfaceComposerClient.h>
#include <android/native_window.h>
#include <binder/Parcel.h>
#include <com_android_graphics_libgui_flags.h>
#include <gui/FrameRateUtils.h>
#include <gui/IGraphicBufferProducer.h>
#include <gui/LayerState.h>
@@ -91,7 +92,9 @@ layer_state_t::layer_state_t()
        trustedOverlay(gui::TrustedOverlay::UNSET),
        bufferCrop(Rect::INVALID_RECT),
        destinationFrame(Rect::INVALID_RECT),
        dropInputMode(gui::DropInputMode::NONE) {
        dropInputMode(gui::DropInputMode::NONE),
        pictureProfileHandle(PictureProfileHandle::NONE),
        appContentPriority(0) {
    matrix.dsdx = matrix.dtdy = 1.0f;
    matrix.dsdy = matrix.dtdx = 0.0f;
    hdrMetadata.validTypes = 0;
@@ -202,6 +205,10 @@ status_t layer_state_t::write(Parcel& output) const
    if (hasBufferReleaseChannel) {
        SAFE_PARCEL(output.writeParcelable, *bufferReleaseChannel);
    }
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS_APPLY_PICTURE_PROFILES
    SAFE_PARCEL(output.writeInt64, pictureProfileHandle.getId());
    SAFE_PARCEL(output.writeInt32, appContentPriority);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS_APPLY_PICTURE_PROFILES

    return NO_ERROR;
}
@@ -357,6 +364,12 @@ status_t layer_state_t::read(const Parcel& input)
        bufferReleaseChannel = std::make_shared<gui::BufferReleaseChannel::ProducerEndpoint>();
        SAFE_PARCEL(input.readParcelable, bufferReleaseChannel.get());
    }
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS_APPLY_PICTURE_PROFILES
    int64_t pictureProfileId;
    SAFE_PARCEL(input.readInt64, &pictureProfileId);
    pictureProfileHandle = PictureProfileHandle(pictureProfileId);
    SAFE_PARCEL(input.readInt32, &appContentPriority);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS_APPLY_PICTURE_PROFILES

    return NO_ERROR;
}
@@ -745,6 +758,16 @@ void layer_state_t::merge(const layer_state_t& other) {
        what |= eBufferReleaseChannelChanged;
        bufferReleaseChannel = other.bufferReleaseChannel;
    }
    if (com_android_graphics_libgui_flags_apply_picture_profiles()) {
        if (other.what & ePictureProfileHandleChanged) {
            what |= ePictureProfileHandleChanged;
            pictureProfileHandle = other.pictureProfileHandle;
        }
        if (other.what & eAppContentPriorityChanged) {
            what |= eAppContentPriorityChanged;
            appContentPriority = other.appContentPriority;
        }
    }
    if ((other.what & what) != other.what) {
        ALOGE("Unmerged SurfaceComposer Transaction properties. LayerState::merge needs updating? "
              "other.what=0x%" PRIX64 " what=0x%" PRIX64 " unmerged flags=0x%" PRIX64,
@@ -826,6 +849,8 @@ uint64_t layer_state_t::diff(const layer_state_t& other) const {
    CHECK_DIFF(diff, eDimmingEnabledChanged, other, dimmingEnabled);
    if (other.what & eBufferReleaseChannelChanged) diff |= eBufferReleaseChannelChanged;
    if (other.what & eLutsChanged) diff |= eLutsChanged;
    CHECK_DIFF(diff, ePictureProfileHandleChanged, other, pictureProfileHandle);
    CHECK_DIFF(diff, eAppContentPriorityChanged, other, appContentPriority);

    return diff;
}
+35 −2
Original line number Diff line number Diff line
@@ -20,8 +20,6 @@
#include <stdint.h>
#include <sys/types.h>

#include <com_android_graphics_libgui_flags.h>

#include <android/gui/BnWindowInfosReportedListener.h>
#include <android/gui/DisplayState.h>
#include <android/gui/EdgeExtensionParameters.h>
@@ -29,6 +27,7 @@
#include <android/gui/IWindowInfosListener.h>
#include <android/gui/TrustedPresentationThresholds.h>
#include <android/os/IInputConstants.h>
#include <com_android_graphics_libgui_flags.h>
#include <gui/DisplayLuts.h>
#include <gui/FrameRateUtils.h>
#include <gui/TraceUtils.h>
@@ -2447,6 +2446,40 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffe
    return *this;
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPictureProfileHandle(
        const sp<SurfaceControl>& sc, const PictureProfileHandle& pictureProfileHandle) {
    if (com_android_graphics_libgui_flags_apply_picture_profiles()) {
        layer_state_t* s = getLayerState(sc);
        if (!s) {
            mStatus = BAD_INDEX;
            return *this;
        }

        s->what |= layer_state_t::ePictureProfileHandleChanged;
        s->pictureProfileHandle = pictureProfileHandle;

        registerSurfaceControlForCallback(sc);
    }
    return *this;
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setContentPriority(
        const sp<SurfaceControl>& sc, int32_t priority) {
    if (com_android_graphics_libgui_flags_apply_picture_profiles()) {
        layer_state_t* s = getLayerState(sc);
        if (!s) {
            mStatus = BAD_INDEX;
            return *this;
        }

        s->what |= layer_state_t::eAppContentPriorityChanged;
        s->appContentPriority = priority;

        registerSurfaceControlForCallback(sc);
    }
    return *this;
}

// ---------------------------------------------------------------------------

DisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) {
+14 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
#include <ui/BlurRegion.h>
#include <ui/GraphicTypes.h>
#include <ui/LayerStack.h>
#include <ui/PictureProfileHandle.h>
#include <ui/Rect.h>
#include <ui/Region.h>
#include <ui/Rotation.h>
@@ -224,6 +225,8 @@ struct layer_state_t {
        eExtendedRangeBrightnessChanged = 0x10000'00000000,
        eEdgeExtensionChanged = 0x20000'00000000,
        eBufferReleaseChannelChanged = 0x40000'00000000,
        ePictureProfileHandleChanged = 0x80000'00000000,
        eAppContentPriorityChanged = 0x100000'00000000,
    };

    layer_state_t();
@@ -267,7 +270,8 @@ struct layer_state_t {
            layer_state_t::eColorSpaceAgnosticChanged | layer_state_t::eColorTransformChanged |
            layer_state_t::eCornerRadiusChanged | layer_state_t::eDimmingEnabledChanged |
            layer_state_t::eHdrMetadataChanged | layer_state_t::eShadowRadiusChanged |
            layer_state_t::eStretchChanged;
            layer_state_t::eStretchChanged | layer_state_t::ePictureProfileHandleChanged |
            layer_state_t::eAppContentPriorityChanged;

    // Changes which invalidates the layer's visible region in CE.
    static constexpr uint64_t CONTENT_DIRTY = layer_state_t::CONTENT_CHANGES |
@@ -412,6 +416,15 @@ struct layer_state_t {
    float currentHdrSdrRatio = 1.f;
    float desiredHdrSdrRatio = 1.f;

    // Enhance the quality of the buffer contents by configurating a picture processing pipeline
    // with values as specified by this picture profile.
    PictureProfileHandle pictureProfileHandle{PictureProfileHandle::NONE};

    // A value indicating the significance of the layer's content to the app's desired user
    // experience. A lower priority will result in more likelihood of getting access to limited
    // resources, such as picture processing hardware.
    int32_t appContentPriority = 0;

    gui::CachingHint cachingHint = gui::CachingHint::Enabled;

    TrustedPresentationThresholds trustedPresentationThresholds;
+15 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
#include <ui/EdgeExtensionEffect.h>
#include <ui/FrameStats.h>
#include <ui/GraphicTypes.h>
#include <ui/PictureProfileHandle.h>
#include <ui/PixelFormat.h>
#include <ui/Rotation.h>
#include <ui/StaticDisplayInfo.h>
@@ -775,6 +776,20 @@ public:
                const sp<SurfaceControl>& sc,
                const std::shared_ptr<gui::BufferReleaseChannel::ProducerEndpoint>& channel);

        /**
         * Configures a surface control to use picture processing hardware, configured as specified
         * by the picture profile, to enhance the quality of all subsequent buffer contents.
         */
        Transaction& setPictureProfileHandle(const sp<SurfaceControl>& sc,
                                             const PictureProfileHandle& pictureProfileHandle);

        /**
         * Configures the relative importance of the contents of the layer with respect to the app's
         * user experience. A lower priority value will give the layer preferred access to limited
         * resources, such as picture processing, over a layer with a higher priority value.
         */
        Transaction& setContentPriority(const sp<SurfaceControl>& sc, int32_t contentPriority);

        status_t setDisplaySurface(const sp<IBinder>& token,
                const sp<IGraphicBufferProducer>& bufferProducer);

+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ public:
    static const PictureProfileHandle NONE;

    PictureProfileHandle() { *this = NONE; }
    PictureProfileHandle(PictureProfileId id) : mId(id) {}
    explicit PictureProfileHandle(PictureProfileId id) : mId(id) {}

    PictureProfileId const& getId() const { return mId; }

Loading