summaryrefslogtreecommitdiffstats
path: root/libs/surfaceflinger/DisplayHardware
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-05-04 19:29:25 -0700
committerMathias Agopian <mathias@google.com>2009-05-07 15:07:33 -0700
commit2e20bffbab8084fedce39d14d7dd17b08f6e9ba2 (patch)
treebe397ea1383b74bc09e48d591ca7aa2cc54f0539 /libs/surfaceflinger/DisplayHardware
parent9bd5da4db97fec7cdbe6e07870411c1fcaff4365 (diff)
downloadframeworks_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.cpp13
-rw-r--r--libs/surfaceflinger/DisplayHardware/DisplayHardware.h1
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(