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

Commit c6780979 authored by Peiyong Lin's avatar Peiyong Lin
Browse files

[SurfaceFlinger] Expose WCG composition preference through ISurfaceComposer API.

Previously we introduced an API to return default composition preference.
However, wide color gamut composition preference is very likely to be different
than the default composition preference. This patch also exposes this
information back to upper stack, notable HWUI, to make sure upper stack has the
flexibility to render into desired format for wide color gamut surfaces.

BUG: 111436479
Test: Build, flash and boot, run some display validation.
Change-Id: Ic05747591e62ca5f3c396704390555b7f545c31c
parent a5517d71
Loading
Loading
Loading
Loading
+19 −9
Original line number Diff line number Diff line
@@ -565,8 +565,10 @@ public:
        return reply.readParcelableVector(outLayers);
    }

    virtual status_t getCompositionPreference(ui::Dataspace* dataSpace,
                                              ui::PixelFormat* pixelFormat) const {
    virtual status_t getCompositionPreference(ui::Dataspace* defaultDataspace,
                                              ui::PixelFormat* defaultPixelFormat,
                                              ui::Dataspace* wideColorGamutDataspace,
                                              ui::PixelFormat* wideColorGamutPixelFormat) const {
        Parcel data, reply;
        status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        if (error != NO_ERROR) {
@@ -578,8 +580,10 @@ public:
        }
        error = static_cast<status_t>(reply.readInt32());
        if (error == NO_ERROR) {
            *dataSpace = static_cast<ui::Dataspace>(reply.readInt32());
            *pixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
            *defaultDataspace = static_cast<ui::Dataspace>(reply.readInt32());
            *defaultPixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
            *wideColorGamutDataspace = static_cast<ui::Dataspace>(reply.readInt32());
            *wideColorGamutPixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
        }
        return error;
    }
@@ -925,13 +929,19 @@ status_t BnSurfaceComposer::onTransact(
        }
        case GET_COMPOSITION_PREFERENCE: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            ui::Dataspace dataSpace;
            ui::PixelFormat pixelFormat;
            status_t error = getCompositionPreference(&dataSpace, &pixelFormat);
            ui::Dataspace defaultDataspace;
            ui::PixelFormat defaultPixelFormat;
            ui::Dataspace wideColorGamutDataspace;
            ui::PixelFormat wideColorGamutPixelFormat;
            status_t error =
                    getCompositionPreference(&defaultDataspace, &defaultPixelFormat,
                                             &wideColorGamutDataspace, &wideColorGamutPixelFormat);
            reply->writeInt32(error);
            if (error == NO_ERROR) {
                reply->writeInt32(static_cast<int32_t>(dataSpace));
                reply->writeInt32(static_cast<int32_t>(pixelFormat));
                reply->writeInt32(static_cast<int32_t>(defaultDataspace));
                reply->writeInt32(static_cast<int32_t>(defaultPixelFormat));
                reply->writeInt32(static_cast<int32_t>(wideColorGamutDataspace));
                reply->writeInt32(static_cast<int32_t>(wideColorGamutDataspace));
            }
            return NO_ERROR;
        }
+6 −3
Original line number Diff line number Diff line
@@ -866,9 +866,12 @@ void SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token,
    ComposerService::getComposerService()->setPowerMode(token, mode);
}

status_t SurfaceComposerClient::getCompositionPreference(ui::Dataspace* dataSpace,
                                                         ui::PixelFormat* pixelFormat) {
    return ComposerService::getComposerService()->getCompositionPreference(dataSpace, pixelFormat);
status_t SurfaceComposerClient::getCompositionPreference(
        ui::Dataspace* defaultDataspace, ui::PixelFormat* defaultPixelFormat,
        ui::Dataspace* wideColorGamutDataspace, ui::PixelFormat* wideColorGamutPixelFormat) {
    return ComposerService::getComposerService()
            ->getCompositionPreference(defaultDataspace, defaultPixelFormat,
                                       wideColorGamutDataspace, wideColorGamutPixelFormat);
}

status_t SurfaceComposerClient::clearAnimationFrameStats() {
+12 −3
Original line number Diff line number Diff line
@@ -280,10 +280,19 @@ public:
     */
    virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const = 0;

    virtual status_t getCompositionPreference(ui::Dataspace* dataSpace,
                                              ui::PixelFormat* pixelFormat) const = 0;

    virtual bool isColorManagementUsed() const = 0;

    /* Gets the composition preference of the default data space and default pixel format,
     * as well as the wide color gamut data space and wide color gamut pixel format.
     * If the wide color gamut data space is V0_SRGB, then it implies that the platform
     * has no wide color gamut support.
     *
     * Requires the ACCESS_SURFACE_FLINGER permission.
     */
    virtual status_t getCompositionPreference(ui::Dataspace* defaultDataspace,
                                              ui::PixelFormat* defaultPixelFormat,
                                              ui::Dataspace* wideColorGamutDataspace,
                                              ui::PixelFormat* wideColorGamutPixelFormat) const = 0;
};

// ----------------------------------------------------------------------------
+9 −3
Original line number Diff line number Diff line
@@ -101,9 +101,15 @@ public:
    /* Triggers screen on/off or low power mode and waits for it to complete */
    static void setDisplayPowerMode(const sp<IBinder>& display, int mode);

    //
    static status_t getCompositionPreference(ui::Dataspace* dataSpace,
                                             ui::PixelFormat* pixelFormat);
    /* Returns the composition preference of the default data space and default pixel format,
     * as well as the wide color gamut data space and wide color gamut pixel format.
     * If the wide color gamut data space is V0_SRGB, then it implies that the platform
     * has no wide color gamut support.
     */
    static status_t getCompositionPreference(ui::Dataspace* defaultDataspace,
                                             ui::PixelFormat* defaultPixelFormat,
                                             ui::Dataspace* wideColorGamutDataspace,
                                             ui::PixelFormat* wideColorGamutPixelFormat);

    // ------------------------------------------------------------------------
    // surface creation / destruction
+4 −2
Original line number Diff line number Diff line
@@ -628,8 +628,10 @@ public:
    status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* /*layers*/) const override {
        return NO_ERROR;
    }
    status_t getCompositionPreference(ui::Dataspace* /*outDataSpace*/,
                                      ui::PixelFormat* /*outPixelFormat*/) const override {
    status_t getCompositionPreference(
            ui::Dataspace* /*outDefaultDataspace*/, ui::PixelFormat* /*outDefaultPixelFormat*/,
            ui::Dataspace* /*outWideColorGamutDataspace*/,
            ui::PixelFormat* /*outWideColorGamutPixelFormat*/) const override {
        return NO_ERROR;
    }

Loading