XVisualInfo EglContext::selectBestVisual(::Display* XDisplay, unsigned int bitsPerPixel, const ContextSettings& settings) { // Get the initialized EGL display EGLDisplay display = getInitializedDisplay(); // Get the best EGL config matching the default video settings EGLConfig config = getBestConfig(display, bitsPerPixel, settings); // Retrieve the visual id associated with this EGL config EGLint nativeVisualId; eglCheck(eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &nativeVisualId)); if (nativeVisualId == 0) { // Should never happen... err() << "No EGL visual found. You should check your graphics driver" << std::endl; return XVisualInfo(); } XVisualInfo vTemplate; vTemplate.visualid = static_cast<VisualID>(nativeVisualId); // Get X11 visuals compatible with this EGL config XVisualInfo *availableVisuals, bestVisual; int visualCount = 0; availableVisuals = XGetVisualInfo(XDisplay, VisualIDMask, &vTemplate, &visualCount); if (visualCount == 0) { // Can't happen... err() << "No X11 visual found. Bug in your EGL implementation ?" << std::endl; return XVisualInfo(); } // Pick up the best one bestVisual = availableVisuals[0]; XFree(availableVisuals); return bestVisual; }
XVisualInfo GlxContext::selectBestVisual(::Display* display, unsigned int bitsPerPixel, const ContextSettings& settings) { // Retrieve all the visuals int count; XVisualInfo* visuals = XGetVisualInfo(display, 0, NULL, &count); if (visuals) { // Evaluate all the returned visuals, and pick the best one int bestScore = 0xFFFF; XVisualInfo bestVisual; for (int i = 0; i < count; ++i) { // Check mandatory attributes int doubleBuffer; glXGetConfig(display, &visuals[i], GLX_DOUBLEBUFFER, &doubleBuffer); if (!doubleBuffer) continue; // Extract the components of the current visual int red, green, blue, alpha, depth, stencil, multiSampling, samples; glXGetConfig(display, &visuals[i], GLX_RED_SIZE, &red); glXGetConfig(display, &visuals[i], GLX_GREEN_SIZE, &green); glXGetConfig(display, &visuals[i], GLX_BLUE_SIZE, &blue); glXGetConfig(display, &visuals[i], GLX_ALPHA_SIZE, &alpha); glXGetConfig(display, &visuals[i], GLX_DEPTH_SIZE, &depth); glXGetConfig(display, &visuals[i], GLX_STENCIL_SIZE, &stencil); glXGetConfig(display, &visuals[i], GLX_SAMPLE_BUFFERS_ARB, &multiSampling); glXGetConfig(display, &visuals[i], GLX_SAMPLES_ARB, &samples); // Evaluate the visual int color = red + green + blue + alpha; int score = evaluateFormat(bitsPerPixel, settings, color, depth, stencil, multiSampling ? samples : 0); // If it's better than the current best, make it the new best if (score < bestScore) { bestScore = score; bestVisual = visuals[i]; } } // Free the array of visuals XFree(visuals); return bestVisual; } else { // Should never happen... err() << "No GLX visual found. You should check your graphics driver" << std::endl; return XVisualInfo(); } }
Window::Window (Display& display, int width, int height, ::Visual* visual) : m_display (display) , m_colormap (None) , m_window (None) , m_visible (false) { XSetWindowAttributes swa; ::Display* const dpy = m_display.getXDisplay(); ::Window root = DefaultRootWindow(dpy); unsigned long mask = CWBorderPixel | CWEventMask; // If redirect is enabled, window size can't be guaranteed and it is up to // the window manager to decide whether to honor sizing requests. However, // overriding that causes window to appear as an overlay, which causes // other issues, so this is disabled by default. const bool overrideRedirect = false; if (overrideRedirect) { mask |= CWOverrideRedirect; swa.override_redirect = true; } if (visual == DE_NULL) visual = CopyFromParent; else { XVisualInfo info = XVisualInfo(); bool succ = display.getVisualInfo(XVisualIDFromVisual(visual), info); TCU_CHECK_INTERNAL(succ); root = RootWindow(dpy, info.screen); m_colormap = XCreateColormap(dpy, root, visual, AllocNone); swa.colormap = m_colormap; mask |= CWColormap; } swa.border_pixel = 0; swa.event_mask = ExposureMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask; if (width == glu::RenderConfig::DONT_CARE) width = DEFAULT_WINDOW_WIDTH; if (height == glu::RenderConfig::DONT_CARE) height = DEFAULT_WINDOW_HEIGHT; m_window = XCreateWindow(dpy, root, 0, 0, width, height, 0, CopyFromParent, InputOutput, visual, mask, &swa); TCU_CHECK(m_window); Atom deleteAtom = m_display.getDeleteAtom(); XSetWMProtocols(dpy, m_window, &deleteAtom, 1); }
Window::Window (Display& display, int width, int height, ::Visual* visual) : m_display (display) , m_colormap (None) , m_window (None) , m_visible (false) { XSetWindowAttributes swa; ::Display* dpy = m_display.getXDisplay(); ::Window root = DefaultRootWindow(dpy); unsigned long mask = CWBorderPixel | CWEventMask; if (visual == DE_NULL) visual = CopyFromParent; else { XVisualInfo info = XVisualInfo(); bool succ = display.getVisualInfo(XVisualIDFromVisual(visual), info); TCU_CHECK_INTERNAL(succ); root = RootWindow(dpy, info.screen); m_colormap = XCreateColormap(dpy, root, visual, AllocNone); swa.colormap = m_colormap; mask |= CWColormap; } swa.border_pixel = 0; swa.event_mask = ExposureMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask; mask |= CWOverrideRedirect; swa.override_redirect = true; if (width == glu::RenderConfig::DONT_CARE) width = DEFAULT_WINDOW_WIDTH; if (height == glu::RenderConfig::DONT_CARE) height = DEFAULT_WINDOW_HEIGHT; m_window = XCreateWindow(dpy, root, 0, 0, width, height, 0, CopyFromParent, InputOutput, visual, mask, &swa); TCU_CHECK(m_window); Atom deleteAtom = m_display.getDeleteAtom(); XSetWMProtocols(dpy, m_window, &deleteAtom, 1); }