From a6b033d19eb56f3a72d49b650aa29c0bf5a3827e Mon Sep 17 00:00:00 2001 From: Yochai Shefi Simchon Date: Mon, 15 Aug 2011 16:06:57 +0300 Subject: [PATCH] opengles emulator: do single display connection for all subwindow This is a workaround to a driver bug on Intel/Linux, when destroying a subwindow do not close the X display connection, keep it for the next call to createSubWindow. It happens that the intel/linux driver caches the display connection for each window ID and use it during swap or something similar. Using the same display connection for all subwindows workaround the problem. Also added a wait loop to wait until the window becomes mapped instead of just calling XSync after calling XMapWindow. This is more accurate and make sure we do not miss the first window refresh. Change-Id: I63c69d736df433666a8c79d71127afe72776e89f --- .../libOpenglRender/NativeLinuxSubWindow.cpp | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/NativeLinuxSubWindow.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/NativeLinuxSubWindow.cpp index 6e2636ed2..ff335df2f 100644 --- a/tools/emulator/opengl/host/libs/libOpenglRender/NativeLinuxSubWindow.cpp +++ b/tools/emulator/opengl/host/libs/libOpenglRender/NativeLinuxSubWindow.cpp @@ -15,17 +15,34 @@ */ #include "NativeSubWindow.h" +static Bool WaitForMapNotify(Display *d, XEvent *e, char *arg) +{ + if (e->type == MapNotify && e->xmap.window == (Window)arg) { + return 1; + } + return 0; +} + +static Display *s_display = NULL; EGLNativeWindowType createSubWindow(FBNativeWindowType p_window, EGLNativeDisplayType* display_out, int x, int y,int width, int height){ - *display_out = XOpenDisplay(NULL); - Window win = XCreateWindow(*display_out,p_window,x,y, width,height,0,CopyFromParent,CopyFromParent,CopyFromParent,0,NULL); + + // The call to this function is protected by a lock + // in FrameBuffer so it is safe to check and initialize s_display here + if (!s_display) s_display = XOpenDisplay(NULL); + *display_out = s_display; + + XSetWindowAttributes wa; + wa.event_mask = StructureNotifyMask; + Window win = XCreateWindow(*display_out,p_window,x,y, width,height,0,CopyFromParent,CopyFromParent,CopyFromParent,CWEventMask,&wa); XMapWindow(*display_out,win); - XSync(*display_out,False); + XEvent e; + XIfEvent(*display_out, &e, WaitForMapNotify, (char *)win); return win; } void destroySubWindow(EGLNativeDisplayType dis,EGLNativeWindowType win){ - XCloseDisplay(dis); + XDestroyWindow(dis, win); }