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
This commit is contained in:
Yochai Shefi Simchon
2011-08-15 16:06:57 +03:00
committed by David Turner
parent 2a581c9cb2
commit a6b033d19e

View File

@@ -15,17 +15,34 @@
*/ */
#include "NativeSubWindow.h" #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, EGLNativeWindowType createSubWindow(FBNativeWindowType p_window,
EGLNativeDisplayType* display_out, EGLNativeDisplayType* display_out,
int x, int y,int width, int height){ 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); XMapWindow(*display_out,win);
XSync(*display_out,False); XEvent e;
XIfEvent(*display_out, &e, WaitForMapNotify, (char *)win);
return win; return win;
} }
void destroySubWindow(EGLNativeDisplayType dis,EGLNativeWindowType win){ void destroySubWindow(EGLNativeDisplayType dis,EGLNativeWindowType win){
XCloseDisplay(dis); XDestroyWindow(dis, win);
} }