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:
committed by
David Turner
parent
2a581c9cb2
commit
a6b033d19e
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user