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

Commit 7159f579 authored by Ady Abraham's avatar Ady Abraham
Browse files

SurfaceFlinger: add composer 2.4 vsync api to DisplayHardware

Add the new functions to DisplayHardware wrappers. The following CLs
will do something useful with the new functionality.

Test: rev up composer to 2.4 and test refresh rate switching
Bug: 141329414
Change-Id: Iaf98d0abc56dd393845b16c87dd92b0bad582c0f
parent 478572d9
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -1201,6 +1201,20 @@ Return<void> HardwareComposer::ComposerCallback::onVsync(Hwc2::Display display,
  return Void();
}

Return<void> HardwareComposer::ComposerCallback::onVsync_2_4(
    Hwc2::Display /*display*/, int64_t /*timestamp*/,
    Hwc2::VsyncPeriodNanos /*vsyncPeriodNanos*/) {
  LOG_ALWAYS_FATAL("Unexpected onVsync_2_4 callback");
  return Void();
}

Return<void> HardwareComposer::ComposerCallback::onVsyncPeriodTimingChanged(
    Hwc2::Display /*display*/,
    const Hwc2::VsyncPeriodChangeTimeline& /*updatedTimeline*/) {
  LOG_ALWAYS_FATAL("Unexpected onVsyncPeriodTimingChanged callback");
  return Void();
}

void HardwareComposer::ComposerCallback::SetVsyncService(
    const sp<VsyncService>& vsync_service) {
  std::lock_guard<std::mutex> lock(mutex_);
+6 −0
Original line number Diff line number Diff line
@@ -375,6 +375,12 @@ class HardwareComposer {
    hardware::Return<void> onRefresh(Hwc2::Display display) override;
    hardware::Return<void> onVsync(Hwc2::Display display,
                                   int64_t timestamp) override;
    hardware::Return<void> onVsync_2_4(
        Hwc2::Display display, int64_t timestamp,
        Hwc2::VsyncPeriodNanos vsyncPeriodNanos) override;
    hardware::Return<void> onVsyncPeriodTimingChanged(
        Hwc2::Display display,
        const Hwc2::VsyncPeriodChangeTimeline& updatedTimeline) override;

    bool GotFirstHotplug() { return got_first_hotplug_; }
    void SetVsyncService(const sp<VsyncService>& vsync_service);
+5 −0
Original line number Diff line number Diff line
@@ -81,6 +81,11 @@ public:
    MOCK_CONST_METHOD1(getColorModes, std::vector<ui::ColorMode>(DisplayId));
    MOCK_METHOD3(setActiveColorMode, status_t(DisplayId, ui::ColorMode, ui::RenderIntent));
    MOCK_CONST_METHOD0(isUsingVrComposer, bool());
    MOCK_CONST_METHOD1(isVsyncPeriodSwitchSupported, bool(DisplayId));
    MOCK_CONST_METHOD1(getDisplayVsyncPeriod, nsecs_t(DisplayId));
    MOCK_METHOD4(setActiveConfigWithConstraints,
                 status_t(DisplayId, size_t, const HWC2::VsyncPeriodChangeConstraints&,
                          HWC2::VsyncPeriodChangeTimeline*));

    MOCK_CONST_METHOD1(dump, void(std::string&));
    MOCK_CONST_METHOD0(getComposer, android::Hwc2::Composer*());
+76 −14
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ private:

// assume NO_RESOURCES when Status::isOk returns false
constexpr Error kDefaultError = Error::NO_RESOURCES;
constexpr V2_4::Error kDefaultError_2_4 = V2_4::Error::NO_RESOURCES;
constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError);

template<typename T, typename U>
T unwrapRet(Return<T>& ret, const U& default_val)
@@ -247,7 +247,12 @@ std::string Composer::dumpDebugInfo()
void Composer::registerCallback(const sp<IComposerCallback>& callback)
{
    android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
    auto ret = mClient->registerCallback(callback);
    auto ret = [&]() {
        if (mClient_2_4) {
            return mClient_2_4->registerCallback_2_4(callback);
        }
        return mClient->registerCallback(callback);
    }();
    if (!ret.isOk()) {
        ALOGE("failed to register IComposerCallback");
    }
@@ -413,7 +418,19 @@ Error Composer::getDisplayAttribute(Display display, Config config,
        IComposerClient::Attribute attribute, int32_t* outValue)
{
    Error error = kDefaultError;
    mClient->getDisplayAttribute(display, config, attribute,
    if (mClient_2_4) {
        mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
                                             [&](const auto& tmpError, const auto& tmpValue) {
                                                 error = static_cast<Error>(tmpError);
                                                 if (error != Error::NONE) {
                                                     return;
                                                 }

                                                 *outValue = tmpValue;
                                             });
    } else {
        mClient->getDisplayAttribute(display, config,
                                     static_cast<V2_1::IComposerClient::Attribute>(attribute),
                                     [&](const auto& tmpError, const auto& tmpValue) {
                                         error = tmpError;
                                         if (error != Error::NONE) {
@@ -422,6 +439,7 @@ Error Composer::getDisplayAttribute(Display display, Config config,

                                         *outValue = tmpValue;
                                     });
    }

    return error;
}
@@ -1200,13 +1218,14 @@ Error Composer::getDisplayCapabilities(Display display,
    return static_cast<Error>(error);
}

Error Composer::getDisplayConnectionType(Display display,
V2_4::Error Composer::getDisplayConnectionType(Display display,
                                               IComposerClient::DisplayConnectionType* outType) {
    using Error = V2_4::Error;
    if (!mClient_2_4) {
        return Error::UNSUPPORTED;
    }

    V2_4::Error error = kDefaultError_2_4;
    Error error = kDefaultError_2_4;
    mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
        error = tmpError;
        if (error != V2_4::Error::NONE) {
@@ -1216,7 +1235,50 @@ Error Composer::getDisplayConnectionType(Display display,
        *outType = tmpType;
    });

    return static_cast<V2_1::Error>(error);
    return error;
}

V2_4::Error Composer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
    using Error = V2_4::Error;
    if (!mClient_2_4) {
        return Error::UNSUPPORTED;
    }

    Error error = kDefaultError_2_4;
    mClient_2_4->getDisplayVsyncPeriod(display,
                                       [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
                                           error = tmpError;
                                           if (error != Error::NONE) {
                                               return;
                                           }

                                           *outVsyncPeriod = tmpVsyncPeriod;
                                       });

    return error;
}

V2_4::Error Composer::setActiveConfigWithConstraints(
        Display display, Config config,
        const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
        VsyncPeriodChangeTimeline* outTimeline) {
    using Error = V2_4::Error;
    if (!mClient_2_4) {
        return Error::UNSUPPORTED;
    }

    Error error = kDefaultError_2_4;
    mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
                                                [&](const auto& tmpError, const auto& tmpTimeline) {
                                                    error = tmpError;
                                                    if (error != Error::NONE) {
                                                        return;
                                                    }

                                                    *outTimeline = tmpTimeline;
                                                });

    return error;
}

CommandReader::~CommandReader()
+20 −5
Original line number Diff line number Diff line
@@ -62,12 +62,14 @@ using types::V1_2::PixelFormat;
using V2_1::Config;
using V2_1::Display;
using V2_1::Error;
using V2_1::IComposerCallback;
using V2_1::Layer;
using V2_3::CommandReaderBase;
using V2_3::CommandWriterBase;
using V2_4::IComposer;
using V2_4::IComposerCallback;
using V2_4::IComposerClient;
using V2_4::VsyncPeriodChangeTimeline;
using V2_4::VsyncPeriodNanos;
using DisplayCapability = IComposerClient::DisplayCapability;
using PerFrameMetadata = IComposerClient::PerFrameMetadata;
using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey;
@@ -208,10 +210,17 @@ public:
    virtual Error setDisplayBrightness(Display display, float brightness) = 0;

    // Composer HAL 2.4
    virtual bool isVsyncPeriodSwitchSupported() = 0;
    virtual Error getDisplayCapabilities(Display display,
                                         std::vector<DisplayCapability>* outCapabilities) = 0;
    virtual Error getDisplayConnectionType(Display display,
                                           IComposerClient::DisplayConnectionType* outType) = 0;
    virtual V2_4::Error getDisplayConnectionType(
            Display display, IComposerClient::DisplayConnectionType* outType) = 0;
    virtual V2_4::Error getDisplayVsyncPeriod(Display display,
                                              VsyncPeriodNanos* outVsyncPeriod) = 0;
    virtual V2_4::Error setActiveConfigWithConstraints(
            Display display, Config config,
            const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
            VsyncPeriodChangeTimeline* outTimeline) = 0;
};

namespace impl {
@@ -423,10 +432,16 @@ public:
    Error setDisplayBrightness(Display display, float brightness) override;

    // Composer HAL 2.4
    bool isVsyncPeriodSwitchSupported() override { return mClient_2_4 != nullptr; }
    Error getDisplayCapabilities(Display display,
                                 std::vector<DisplayCapability>* outCapabilities) override;
    Error getDisplayConnectionType(Display display,
    V2_4::Error getDisplayConnectionType(Display display,
                                         IComposerClient::DisplayConnectionType* outType) override;
    V2_4::Error getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) override;
    V2_4::Error setActiveConfigWithConstraints(
            Display display, Config config,
            const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
            VsyncPeriodChangeTimeline* outTimeline) override;

private:
#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER
Loading