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

Commit 97b8056c authored by Mathias Agopian's avatar Mathias Agopian
Browse files

add support for update-on-demand in SurfaceFlinger

parent 927d37cb
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -52,6 +52,9 @@ public:

    framebuffer_device_t const * getDevice() const { return fbDev; } 

    bool isUpdateOnDemand() const { return mUpdateOnDemand; }
    status_t setUpdateRectangle(const Rect& updateRect);
    
private:
    friend class LightRefBase<FramebufferNativeWindow>;    
    ~FramebufferNativeWindow(); // this class cannot be overloaded
@@ -71,6 +74,7 @@ private:
    int32_t mNumBuffers;
    int32_t mNumFreeBuffers;
    int32_t mBufferHead;
    bool mUpdateOnDemand;
};

// ---------------------------------------------------------------------------
+9 −3
Original line number Diff line number Diff line
@@ -183,8 +183,10 @@ void DisplayHardware::init(uint32_t dpy)
    LOGI("extensions: %s", egl_extensions);
    LOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported");

    // TODO: get the real "update_on_demand" behavior (probably should be HAL module)
    // FIXME: mFlags |= UPDATE_ON_DEMAND;

    if (mNativeWindow->isUpdateOnDemand()) {
        mFlags |= UPDATE_ON_DEMAND;
    }
    
    if (eglGetConfigAttrib(display, config, EGL_CONFIG_CAVEAT, &dummy) == EGL_TRUE) {
        if (dummy == EGL_SLOW_CONFIG)
@@ -210,7 +212,7 @@ void DisplayHardware::init(uint32_t dpy)

    mDpiX = mNativeWindow->xdpi;
    mDpiX = mNativeWindow->ydpi;
    mRefreshRate = mNativeWindow->getDevice()->fps; 
    mRefreshRate = fbDev->fps; 
    
    char property[PROPERTY_VALUE_MAX];
    if (property_get("ro.sf.lcd_density", property, NULL) <= 0) {
@@ -314,6 +316,10 @@ void DisplayHardware::flip(const Region& dirty) const
                b.left, b.top, b.width(), b.height());
    } 

    if (mFlags & UPDATE_ON_DEMAND) {
        mNativeWindow->setUpdateRectangle(dirty.bounds());
    }
    
    mPageFlipCount++;
    eglSwapBuffers(dpy, surface);
    checkEGLErrors("eglSwapBuffers");
+11 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ private:
 */

FramebufferNativeWindow::FramebufferNativeWindow() 
    : BASE(), fbDev(0), grDev(0)
    : BASE(), fbDev(0), grDev(0), mUpdateOnDemand(false)
{
    hw_module_t const* module;
    if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
@@ -86,6 +86,8 @@ FramebufferNativeWindow::FramebufferNativeWindow()
        int err;

        
        mUpdateOnDemand = (fbDev->setUpdateRect != 0);
        
        // initialize the buffer FIFO
        mNumBuffers = 2;
        mNumFreeBuffers = 2;
@@ -131,6 +133,14 @@ FramebufferNativeWindow::~FramebufferNativeWindow() {
    framebuffer_close(fbDev);
}

status_t FramebufferNativeWindow::setUpdateRectangle(const Rect& r) 
{
    if (!mUpdateOnDemand) {
        return INVALID_OPERATION;
    }
    return fbDev->setUpdateRect(fbDev, r.left, r.top, r.width(), r.height());
}

int FramebufferNativeWindow::setSwapInterval(
        android_native_window_t* window, int interval) 
{