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

Commit b07fe1de authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

Add infrastructure for registering a native frame metrics observer

This will allow NativeInputEventReceiver to subscribe to the frame
metrics notifications directly from the native code, without having to
involve java.

Java would still be needed to register the observer, though.

Bug: 376713684
Test: compile only, this infra is used in another CL
Flag: EXEMPT refactor
Change-Id: I7be8f0b2e94595f9a64ce69a22fe5910e0cd7711
parent f36bafc1
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -657,6 +657,13 @@ public class HardwareRenderer {
        nAddObserver(mNativeProxy, observer.getNativeInstance());
    }

    /**
     * @hide
     */
    public void addObserver(long nativeObserver) {
        nAddObserver(mNativeProxy, nativeObserver);
    }

    /**
     * TODO: Public API this?
     *
@@ -666,6 +673,13 @@ public class HardwareRenderer {
        nRemoveObserver(mNativeProxy, observer.getNativeInstance());
    }

    /**
     * @hide
     */
    public void removeObserver(long nativeObserver) {
        nRemoveObserver(mNativeProxy, nativeObserver);
    }

    /**
     * Sets the desired color mode on this renderer. Whether or not the actual rendering
     * will use the requested colorMode depends on the hardware support for such rendering.
+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ const std::array FrameInfoNames{"Flags",
static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 24,
              "Must update value in FrameMetrics.java#FRAME_STATS_COUNT (and here)");

void FrameInfo::importUiThreadInfo(int64_t* info) {
void FrameInfo::importUiThreadInfo(const int64_t* info) {
    memcpy(mFrameInfo.data(), info, UI_THREAD_FRAME_INFO_SIZE * sizeof(int64_t));
    mSkippedFrameReason.reset();
}
+1 −1
Original line number Diff line number Diff line
@@ -134,7 +134,7 @@ private:

class FrameInfo {
public:
    void importUiThreadInfo(int64_t* info);
    void importUiThreadInfo(const int64_t* info);

    void markSyncStart() { set(FrameInfoIndex::SyncStart) = systemTime(SYSTEM_TIME_MONOTONIC); }

+3 −3
Original line number Diff line number Diff line
@@ -35,12 +35,12 @@ class FrameMetricsReporter {
public:
    FrameMetricsReporter() {}

    void addObserver(FrameMetricsObserver* observer) {
    void addObserver(sp<FrameMetricsObserver>&& observer) {
        std::lock_guard lock(mObserversLock);
        mObservers.push_back(observer);
        mObservers.push_back(std::move(observer));
    }

    bool removeObserver(FrameMetricsObserver* observer) {
    bool removeObserver(const sp<FrameMetricsObserver>& observer) {
        std::lock_guard lock(mObserversLock);
        for (size_t i = 0; i < mObservers.size(); i++) {
            if (mObservers[i].get() == observer) {
+6 −4
Original line number Diff line number Diff line
@@ -915,20 +915,22 @@ static jboolean android_view_ThreadedRenderer_isDrawingEnabled(JNIEnv*, jclass)

static void android_view_ThreadedRenderer_addObserver(JNIEnv* env, jclass clazz,
        jlong proxyPtr, jlong observerPtr) {
    HardwareRendererObserver* observer = reinterpret_cast<HardwareRendererObserver*>(observerPtr);
    FrameMetricsObserver* rawObserver = reinterpret_cast<FrameMetricsObserver*>(observerPtr);
    sp<FrameMetricsObserver> observer = sp<FrameMetricsObserver>::fromExisting(rawObserver);
    renderthread::RenderProxy* renderProxy =
            reinterpret_cast<renderthread::RenderProxy*>(proxyPtr);

    renderProxy->addFrameMetricsObserver(observer);
    renderProxy->addFrameMetricsObserver(std::move(observer));
}

static void android_view_ThreadedRenderer_removeObserver(JNIEnv* env, jclass clazz,
        jlong proxyPtr, jlong observerPtr) {
    HardwareRendererObserver* observer = reinterpret_cast<HardwareRendererObserver*>(observerPtr);
    FrameMetricsObserver* rawObserver = reinterpret_cast<FrameMetricsObserver*>(observerPtr);
    sp<FrameMetricsObserver> observer = sp<FrameMetricsObserver>::fromExisting(rawObserver);
    renderthread::RenderProxy* renderProxy =
            reinterpret_cast<renderthread::RenderProxy*>(proxyPtr);

    renderProxy->removeFrameMetricsObserver(observer);
    renderProxy->removeFrameMetricsObserver(std::move(observer));
}

// ----------------------------------------------------------------------------
Loading