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

Commit e8696a40 authored by Jamie Gennis's avatar Jamie Gennis Committed by Mathias Agopian
Browse files

hack up frame latency measurement

Change-Id: I6d9a466a23285304f0e229a5649815636ab5d6af
parent eeae1de2
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -477,6 +477,26 @@ EGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface surface,
    return result;
}

void EGLAPI eglBeginFrame(EGLDisplay dpy, EGLSurface surface) {
    clearError();

    egl_display_t const * const dp = validate_display(dpy);
    if (!dp) {
        return;
    }

    SurfaceRef _s(dp, surface);
    if (!_s.get()) {
        setError(EGL_BAD_SURFACE, EGL_FALSE);
        return;
    }

    int64_t timestamp = systemTime(SYSTEM_TIME_MONOTONIC);

    egl_surface_t const * const s = get_surface(surface);
    native_window_set_buffers_timestamp(s->win.get(), timestamp);
}

// ----------------------------------------------------------------------------
// Contexts
// ----------------------------------------------------------------------------
+29 −0
Original line number Diff line number Diff line
@@ -63,6 +63,22 @@ Layer::Layer(SurfaceFlinger* flinger,
{
    mCurrentCrop.makeInvalid();
    glGenTextures(1, &mTextureName);

    mFrameLatencyNeeded = false;
    mFrameLatencyOffset = 0;
    for (int i = 0; i < 128; i++) {
        mFrameLatencies[i] = 0;
    }
}

void Layer::onLayerDisplayed() {
    if (mFrameLatencyNeeded) {
        int64_t now = systemTime(SYSTEM_TIME_MONOTONIC);
        mFrameLatencies[mFrameLatencyOffset] = now -
                mSurfaceTexture->getTimestamp();
        mFrameLatencyOffset = (mFrameLatencyOffset + 1) % 128;
        mFrameLatencyNeeded = false;
    }
}

void Layer::onFirstRef()
@@ -408,6 +424,7 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions)

        // update the active buffer
        mActiveBuffer = mSurfaceTexture->getCurrentBuffer();
        mFrameLatencyNeeded = true;

        const Rect crop(mSurfaceTexture->getCurrentCrop());
        const uint32_t transform(mSurfaceTexture->getCurrentTransform());
@@ -538,6 +555,18 @@ void Layer::dump(String8& result, char* buffer, size_t SIZE) const

    result.append(buffer);

    const int64_t* l = mFrameLatencies;
    int o = mFrameLatencyOffset;
    for (int i = 0; i < 128; i += 8) {
        snprintf(buffer, SIZE,
                "      "
                "% 12lld % 12lld % 12lld % 12lld "
                "% 12lld % 12lld % 12lld % 12lld\n",
                l[(o+i+0)%128], l[(o+i+1)%128], l[(o+i+2)%128], l[(o+i+3)%128],
                l[(o+i+4)%128], l[(o+i+5)%128], l[(o+i+6)%128], l[(o+i+7)%128]);
        result.append(buffer);
    }

    if (mSurfaceTexture != 0) {
        mSurfaceTexture->dump(result, "            ", buffer, SIZE);
    }
+5 −0
Original line number Diff line number Diff line
@@ -78,6 +78,8 @@ public:
    // LayerBaseClient interface
    virtual wp<IBinder> getSurfaceTextureBinder() const;

    virtual void onLayerDisplayed();

    // only for debugging
    inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; }

@@ -110,6 +112,9 @@ private:
    uint32_t mCurrentTransform;
    uint32_t mCurrentScalingMode;
    bool mCurrentOpacity;
    bool mFrameLatencyNeeded;
    int mFrameLatencyOffset;
    int64_t mFrameLatencies[128];

    // constants
    PixelFormat mFormat;
+3 −1
Original line number Diff line number Diff line
@@ -206,6 +206,8 @@ public:
     *  current list */
    virtual void onRemoved() { };

    virtual void onLayerDisplayed() { };

    /** always call base class first */
    virtual void dump(String8& result, char* scratch, size_t size) const;
    virtual void shortDump(String8& result, char* scratch, size_t size) const;
+6 −0
Original line number Diff line number Diff line
@@ -445,6 +445,12 @@ void SurfaceFlinger::postFramebuffer()
    const nsecs_t now = systemTime();
    mDebugInSwapBuffers = now;
    hw.flip(mSwapRegion);

    size_t numLayers = mVisibleLayersSortedByZ.size();
    for (size_t i = 0; i < numLayers; i++) {
        mVisibleLayersSortedByZ[i]->onLayerDisplayed();
    }

    mLastSwapBufferTime = systemTime() - now;
    mDebugInSwapBuffers = 0;
    mSwapRegion.clear();