diff options
author | Mathias Agopian <mathias@google.com> | 2009-05-04 19:29:25 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-05-07 15:07:33 -0700 |
commit | 2e20bffbab8084fedce39d14d7dd17b08f6e9ba2 (patch) | |
tree | be397ea1383b74bc09e48d591ca7aa2cc54f0539 /libs/surfaceflinger/DisplayHardware | |
parent | 9bd5da4db97fec7cdbe6e07870411c1fcaff4365 (diff) | |
download | frameworks_base-2e20bffbab8084fedce39d14d7dd17b08f6e9ba2.zip frameworks_base-2e20bffbab8084fedce39d14d7dd17b08f6e9ba2.tar.gz frameworks_base-2e20bffbab8084fedce39d14d7dd17b08f6e9ba2.tar.bz2 |
created an new EGL extension called ANDROID_swap_rectangle
ANDROID_swap_rectangle allows to specify the rectangle affected by eglSwapBuffers(), anything outside of this rectangle is unchanged. in particular EGL_BUFFER_DESTROYED only applies to that rectangle. This extension as well as EGL_BUFFER_PRESERVED allow major optimizations on surfaceflinger, which can redraw only the dirty area during compositing.
However, ANDROID_swap_rectangle allows further optimizations in EGL by reducing the amount of copy-back needed. ANDROID_swap_rectangle is particularily important for software implementations.
Diffstat (limited to 'libs/surfaceflinger/DisplayHardware')
-rw-r--r-- | libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp | 13 | ||||
-rw-r--r-- | libs/surfaceflinger/DisplayHardware/DisplayHardware.h | 1 |
2 files changed, 9 insertions, 5 deletions
diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp index 374f2e2..fc29d73 100644 --- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp +++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp @@ -195,17 +195,19 @@ void DisplayHardware::init(uint32_t dpy) * Create our main surface */ - surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); checkEGLErrors("eglCreateDisplaySurfaceANDROID"); - if (eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &dummy) == EGL_TRUE) { if (dummy == EGL_BUFFER_PRESERVED) { mFlags |= BUFFER_PRESERVED; } } - + + if (strstr(egl_extensions, "ANDROID_swap_rectangle")) { + mFlags |= SWAP_RECTANGLE; + } + mDpiX = mNativeWindow->xdpi; mDpiX = mNativeWindow->ydpi; mRefreshRate = mNativeWindow->getDevice()->fps; @@ -304,11 +306,12 @@ void DisplayHardware::flip(const Region& dirty) const EGLDisplay dpy = mDisplay; EGLSurface surface = mSurface; - if (mFlags & BUFFER_PRESERVED) { + if (mFlags & SWAP_RECTANGLE) { Region newDirty(dirty); newDirty.andSelf(Rect(mWidth, mHeight)); const Rect& b(newDirty.bounds()); - //mNativeWindow->setSwapRectangle(b); + eglSetSwapRectangleANDROID(dpy, surface, + b.left, b.top, b.width(), b.height()); } mPageFlipCount++; diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.h b/libs/surfaceflinger/DisplayHardware/DisplayHardware.h index c9c75e2..c3dbff1 100644 --- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.h +++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.h @@ -50,6 +50,7 @@ public: BUFFER_PRESERVED = 0x00010000, UPDATE_ON_DEMAND = 0x00020000, // video driver feature SLOW_CONFIG = 0x00040000, // software + SWAP_RECTANGLE = 0x00080000, }; DisplayHardware( |