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

Commit b9c5a77a authored by Rachel Lee's avatar Rachel Lee
Browse files

Use VsyncEventData in DisplayEventReceiver::Event.

Clean-up that re-uses VsyncEventData so it's easier to maintain.
The ParcelableVsyncEventData is used in AIDL. It is separated from
VsyncEventData because of the union in
DisplayEventReceiver::Event and Parcelable has non-trivial
constructors.

Bug: 218563993
Test: atest ChoreographerNativeTest
Test: atest libsurfaceflinger_unittest
Test: atest libgui_test
Change-Id: I3ebeb1c7826300c27c4a12d4dba6fbd16305e9e1
parent ef2e21fa
Loading
Loading
Loading
Loading
+2 −19
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ int DisplayEventDispatcher::handleEvent(int, int events, void*) {
        ALOGV("dispatcher %p ~ Vsync pulse: timestamp=%" PRId64
              ", displayId=%s, count=%d, vsyncId=%" PRId64,
              this, ns2ms(vsyncTimestamp), to_string(vsyncDisplayId).c_str(), vsyncCount,
              vsyncEventData.id);
              vsyncEventData.preferredVsyncId());
        mWaitingForVsync = false;
        mLastVsyncCount = vsyncCount;
        dispatchVsync(vsyncTimestamp, vsyncDisplayId, vsyncCount, vsyncEventData);
@@ -146,18 +146,6 @@ int DisplayEventDispatcher::handleEvent(int, int events, void*) {
    return 1; // keep the callback
}

void DisplayEventDispatcher::populateFrameTimelines(const DisplayEventReceiver::Event& event,
                                                    VsyncEventData* outVsyncEventData) const {
    for (size_t i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
        DisplayEventReceiver::Event::VSync::FrameTimeline receiverTimeline =
                event.vsync.frameTimelines[i];
        outVsyncEventData->frameTimelines[i] =
                VsyncEventData::FrameTimeline(receiverTimeline.vsyncId,
                                              receiverTimeline.deadlineTimestamp,
                                              receiverTimeline.expectedVSyncTimestamp);
    }
}

bool DisplayEventDispatcher::processPendingEvents(nsecs_t* outTimestamp,
                                                  PhysicalDisplayId* outDisplayId,
                                                  uint32_t* outCount,
@@ -178,12 +166,7 @@ bool DisplayEventDispatcher::processPendingEvents(nsecs_t* outTimestamp,
                    *outTimestamp = ev.header.timestamp;
                    *outDisplayId = ev.header.displayId;
                    *outCount = ev.vsync.count;
                    outVsyncEventData->id = ev.vsync.vsyncId;
                    outVsyncEventData->deadlineTimestamp = ev.vsync.deadlineTimestamp;
                    outVsyncEventData->frameInterval = ev.vsync.frameInterval;
                    outVsyncEventData->preferredFrameTimelineIndex =
                            ev.vsync.preferredFrameTimelineIndex;
                    populateFrameTimelines(ev, outVsyncEventData);
                    *outVsyncEventData = ev.vsync.vsyncData;
                    break;
                case DisplayEventReceiver::DISPLAY_EVENT_HOTPLUG:
                    dispatchHotplug(ev.header.timestamp, ev.header.displayId, ev.hotplug.connected);
+3 −4
Original line number Diff line number Diff line
@@ -80,15 +80,14 @@ status_t DisplayEventReceiver::requestNextVsync() {
    return NO_INIT;
}

status_t DisplayEventReceiver::getLatestVsyncEventData(VsyncEventData* outVsyncEventData) const {
status_t DisplayEventReceiver::getLatestVsyncEventData(
        ParcelableVsyncEventData* outVsyncEventData) const {
    if (mEventConnection != nullptr) {
        VsyncEventData vsyncEventData;
        auto status = mEventConnection->getLatestVsyncEventData(&vsyncEventData);
        auto status = mEventConnection->getLatestVsyncEventData(outVsyncEventData);
        if (!status.isOk()) {
            ALOGE("Failed to get latest vsync event data: %s", status.exceptionMessage().c_str());
            return status.transactionError();
        }
        *outVsyncEventData = vsyncEventData;
        return NO_ERROR;
    }
    return NO_INIT;
+27 −33
Original line number Diff line number Diff line
@@ -23,52 +23,46 @@

namespace android::gui {

status_t VsyncEventData::readFromParcel(const Parcel* parcel) {
int64_t VsyncEventData::preferredVsyncId() const {
    return frameTimelines[preferredFrameTimelineIndex].vsyncId;
}

int64_t VsyncEventData::preferredDeadlineTimestamp() const {
    return frameTimelines[preferredFrameTimelineIndex].deadlineTimestamp;
}

int64_t VsyncEventData::preferredExpectedPresentationTime() const {
    return frameTimelines[preferredFrameTimelineIndex].expectedPresentationTime;
}

status_t ParcelableVsyncEventData::readFromParcel(const Parcel* parcel) {
    if (parcel == nullptr) {
        ALOGE("%s: Null parcel", __func__);
        return BAD_VALUE;
    }

    SAFE_PARCEL(parcel->readInt64, &id)
    SAFE_PARCEL(parcel->readInt64, &deadlineTimestamp);
    SAFE_PARCEL(parcel->readInt64, &frameInterval);
    SAFE_PARCEL(parcel->readInt64, &vsync.frameInterval);

    uint64_t uintPreferredFrameTimelineIndex;
    SAFE_PARCEL(parcel->readUint64, &uintPreferredFrameTimelineIndex);
    preferredFrameTimelineIndex = static_cast<size_t>(uintPreferredFrameTimelineIndex);
    vsync.preferredFrameTimelineIndex = static_cast<size_t>(uintPreferredFrameTimelineIndex);

    std::vector<FrameTimeline> timelines;
    SAFE_PARCEL(parcel->readParcelableVector, &timelines);
    std::copy_n(timelines.begin(), timelines.size(), frameTimelines.begin());

    return OK;
    for (int i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
        SAFE_PARCEL(parcel->readInt64, &vsync.frameTimelines[i].vsyncId);
        SAFE_PARCEL(parcel->readInt64, &vsync.frameTimelines[i].deadlineTimestamp);
        SAFE_PARCEL(parcel->readInt64, &vsync.frameTimelines[i].expectedPresentationTime);
    }
status_t VsyncEventData::writeToParcel(Parcel* parcel) const {
    SAFE_PARCEL(parcel->writeInt64, id)
    SAFE_PARCEL(parcel->writeInt64, deadlineTimestamp);
    SAFE_PARCEL(parcel->writeInt64, frameInterval);
    SAFE_PARCEL(parcel->writeUint64, preferredFrameTimelineIndex);
    SAFE_PARCEL(parcel->writeParcelableVector,
                std::vector(frameTimelines.begin(), frameTimelines.end()));

    return OK;
}
status_t VsyncEventData::FrameTimeline::readFromParcel(const Parcel* parcel) {
    if (parcel == nullptr) {
        ALOGE("%s: Null parcel", __func__);
        return BAD_VALUE;
    }

    SAFE_PARCEL(parcel->readInt64, &id)
    SAFE_PARCEL(parcel->readInt64, &deadlineTimestamp);
    SAFE_PARCEL(parcel->readInt64, &expectedPresentTime);

    return OK;
status_t ParcelableVsyncEventData::writeToParcel(Parcel* parcel) const {
    SAFE_PARCEL(parcel->writeInt64, vsync.frameInterval);
    SAFE_PARCEL(parcel->writeUint64, vsync.preferredFrameTimelineIndex);
    for (int i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
        SAFE_PARCEL(parcel->writeInt64, vsync.frameTimelines[i].vsyncId);
        SAFE_PARCEL(parcel->writeInt64, vsync.frameTimelines[i].deadlineTimestamp);
        SAFE_PARCEL(parcel->writeInt64, vsync.frameTimelines[i].expectedPresentationTime);
    }
status_t VsyncEventData::FrameTimeline::writeToParcel(Parcel* parcel) const {
    SAFE_PARCEL(parcel->writeInt64, id);
    SAFE_PARCEL(parcel->writeInt64, deadlineTimestamp);
    SAFE_PARCEL(parcel->writeInt64, expectedPresentTime);

    return OK;
}
+2 −2
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
package android.gui;

import android.gui.BitTube;
import android.gui.VsyncEventData;
import android.gui.ParcelableVsyncEventData;

/** @hide */
interface IDisplayEventConnection {
@@ -43,5 +43,5 @@ interface IDisplayEventConnection {
    /*
     * getLatestVsyncEventData() gets the latest vsync event data.
     */
    VsyncEventData getLatestVsyncEventData();
    ParcelableVsyncEventData getLatestVsyncEventData();
}
+1 −1
Original line number Diff line number Diff line
@@ -16,4 +16,4 @@

package android.gui;

parcelable VsyncEventData cpp_header "gui/VsyncEventData.h";
parcelable ParcelableVsyncEventData cpp_header "gui/VsyncEventData.h";
Loading