From b1a1874625a6aca967601fcda53a82d8d712df45 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 17 Sep 2009 16:18:16 -0700 Subject: [PATCH] Android side of the fix for [2121211] Sholes has stutter during animations a new method, compostionComplete() is added to the framebuffer hal, it is used by surfaceflinger to signal the driver that the composition is complete, BEFORE it releases its client. This gives a chance to the driver to --- include/ui/FramebufferNativeWindow.h | 1 + libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp | 6 +++--- libs/surfaceflinger/DisplayHardware/DisplayHardware.h | 2 ++ libs/surfaceflinger/SurfaceFlinger.cpp | 3 +++ libs/ui/FramebufferNativeWindow.cpp | 8 ++++++++ 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/include/ui/FramebufferNativeWindow.h b/include/ui/FramebufferNativeWindow.h index 68144b5944a53..8ea3ab973a9aa 100644 --- a/include/ui/FramebufferNativeWindow.h +++ b/include/ui/FramebufferNativeWindow.h @@ -54,6 +54,7 @@ public: bool isUpdateOnDemand() const { return mUpdateOnDemand; } status_t setUpdateRectangle(const Rect& updateRect); + status_t compositionComplete(); private: friend class LightRefBase; diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp index cc913cbdf9063..7bdf88568ffbd 100644 --- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp +++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp @@ -297,9 +297,9 @@ uint32_t DisplayHardware::getPageFlipCount() const { return mPageFlipCount; } -/* - * "Flip" the front and back buffers. - */ +status_t DisplayHardware::compositionComplete() const { + return mNativeWindow->compositionComplete(); +} void DisplayHardware::flip(const Region& dirty) const { diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.h b/libs/surfaceflinger/DisplayHardware/DisplayHardware.h index 8972d513fdaa9..b7f1cdbe44ba4 100644 --- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.h +++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.h @@ -80,6 +80,8 @@ public: EGLDisplay getEGLDisplay() const { return mDisplay; } overlay_control_device_t* getOverlayEngine() const { return mOverlayEngine; } + status_t compositionComplete() const; + Rect bounds() const { return Rect(mWidth, mHeight); } diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp index 31b5128c538f2..e87b5634898e6 100644 --- a/libs/surfaceflinger/SurfaceFlinger.cpp +++ b/libs/surfaceflinger/SurfaceFlinger.cpp @@ -495,6 +495,9 @@ bool SurfaceFlinger::threadLoop() // repaint the framebuffer (if needed) handleRepaint(); + // inform the h/w that we're done compositing + hw.compositionComplete(); + // release the clients before we flip ('cause flip might block) unlockClients(); diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp index 90b51634c60cf..fc2e2f6507005 100644 --- a/libs/ui/FramebufferNativeWindow.cpp +++ b/libs/ui/FramebufferNativeWindow.cpp @@ -158,6 +158,14 @@ status_t FramebufferNativeWindow::setUpdateRectangle(const Rect& r) return fbDev->setUpdateRect(fbDev, r.left, r.top, r.width(), r.height()); } +status_t FramebufferNativeWindow::compositionComplete() +{ + if (fbDev->compositionComplete) { + return fbDev->compositionComplete(fbDev); + } + return INVALID_OPERATION; +} + int FramebufferNativeWindow::setSwapInterval( android_native_window_t* window, int interval) {