ephyr: Make sure a glamor-using window is created with a glx visual.

This commit is contained in:
Eric Anholt 2009-08-20 09:35:24 -07:00 committed by Zhigang Gong
parent 08097434ec
commit 370df817ac
2 changed files with 29 additions and 12 deletions

View File

@ -31,6 +31,7 @@
extern Window EphyrPreExistingHostWin;
extern Bool EphyrWantGrayScale;
extern Bool ephyr_glamor;
extern Bool kdHasPointer;
extern Bool kdHasKbd;
@ -223,6 +224,7 @@ ddxProcessArgument (int argc, char **argv, int i)
}
else if (!strcmp (argv[i], "-glamor"))
{
ephyr_glamor = TRUE;
ephyrFuncs.initAccel = ephyr_glamor_init;
ephyrFuncs.enableAccel = ephyr_glamor_enable;
ephyrFuncs.disableAccel = ephyr_glamor_disable;

View File

@ -97,6 +97,7 @@ struct EphyrHostXVars
Display *dpy;
int screen;
Visual *visual;
XVisualInfo *visual_info;
Window winroot;
GC gc;
int depth;
@ -125,10 +126,14 @@ extern int monitorResolution;
char *ephyrResName = NULL;
int ephyrResNameFromCmd = 0;
char *ephyrTitle = NULL;
Bool ephyr_glamor = FALSE;
static void
hostx_set_fullscreen_hint(void);
static void
ephyr_glamor_get_visual(void);
/* X Error traps */
static int trapped_error_code = 0;
@ -364,8 +369,11 @@ hostx_init (void)
HostX.winroot = RootWindow(HostX.dpy, HostX.screen);
HostX.gc = XCreateGC(HostX.dpy, HostX.winroot, 0, NULL);
HostX.depth = DefaultDepth(HostX.dpy, HostX.screen);
HostX.visual = DefaultVisual(HostX.dpy, HostX.screen);
if (ephyr_glamor) {
ephyr_glamor_get_visual();
} else {
HostX.visual = DefaultVisual(HostX.dpy, HostX.screen);
}
class_hint = XAllocClassHint();
for (index = 0 ; index < HostX.n_screens ; index++)
@ -1448,22 +1456,18 @@ hostx_has_glx (void)
#endif /* XF86DRI */
void
ephyr_glamor_host_create_context(EphyrScreenInfo ephyr_screen)
static void
ephyr_glamor_get_visual(void)
{
Display *dpy = hostx_get_display();
Display *dpy = HostX.dpy;
int attribs[] = {GLX_RGBA,
GLX_RED_SIZE, 1,
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
None};
XVisualInfo *visual_info;
GLXContext ctx;
struct EphyrHostScreen *host_screen;
int event_base = 0, error_base = 0;
host_screen = host_screen_from_screen_info(ephyr_screen);
if (!glXQueryExtension (dpy, &event_base, &error_base))
errx(1, "Couldn't find GLX extension\n");
@ -1471,12 +1475,23 @@ ephyr_glamor_host_create_context(EphyrScreenInfo ephyr_screen)
if (visual_info == NULL)
errx(1, "Couldn't get RGB visual\n");
ctx = glXCreateContext(dpy, visual_info, NULL, True);
HostX.visual_info = visual_info;
HostX.visual = visual_info->visual;
}
void
ephyr_glamor_host_create_context(EphyrScreenInfo ephyr_screen)
{
Display *dpy = HostX.dpy;
GLXContext ctx;
struct EphyrHostScreen *host_screen;
host_screen = host_screen_from_screen_info(ephyr_screen);
ctx = glXCreateContext(dpy, HostX.visual_info, NULL, True);
if (ctx == NULL)
errx(1, "glXCreateContext failed\n");
if (!glXMakeCurrent(dpy, host_screen->win, ctx))
errx(1, "glXMakeCurrent failed\n");
XFree(visual_info);
}