bool CGLContextEGL::Refresh(bool force, int screen, Window glWindow, bool &newContext) { m_sync.cont = 0; // refresh context if (m_eglContext && !force) { if (m_eglSurface == EGL_NO_SURFACE) { m_eglSurface = eglCreateWindowSurface(m_eglDisplay, m_eglConfig, glWindow, NULL); if (m_eglSurface == EGL_NO_SURFACE) { CLog::Log(LOGERROR, "failed to create EGL window surface %d\n", eglGetError()); return false; } } CLog::Log(LOGDEBUG, "CWinSystemX11::RefreshEGLContext: refreshing context"); eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext); return true; } // create context bool retVal = false; if (m_eglDisplay == EGL_NO_DISPLAY) { m_eglDisplay = eglGetDisplay((EGLNativeDisplayType)m_dpy); if (m_eglDisplay == EGL_NO_DISPLAY) { CLog::Log(LOGERROR, "failed to get egl display\n"); return false; } if (!eglInitialize(m_eglDisplay, NULL, NULL)) { CLog::Log(LOGERROR, "failed to initialize egl display\n"); return false; } } XVisualInfo vMask; XVisualInfo *vInfo = nullptr; int availableVisuals = 0; vMask.screen = screen; XWindowAttributes winAttr; if (XGetWindowAttributes(m_dpy, glWindow, &winAttr)) { vMask.visualid = XVisualIDFromVisual(winAttr.visual); vInfo = XGetVisualInfo(m_dpy, VisualScreenMask | VisualIDMask, &vMask, &availableVisuals); if (!vInfo) { CLog::Log(LOGWARNING, "Failed to get VisualInfo of visual 0x%x", (unsigned) vMask.visualid); } else if(!IsSuitableVisual(vInfo)) { CLog::Log(LOGWARNING, "Visual 0x%x of the window is not suitable, looking for another one...", (unsigned) vInfo->visualid); XFree(vInfo); vInfo = nullptr; } } else CLog::Log(LOGWARNING, "Failed to get window attributes"); if (vInfo) { CLog::Log(LOGNOTICE, "Using visual 0x%x", (unsigned) vInfo->visualid); if (m_eglContext) { eglMakeCurrent(m_eglContext, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroyContext(m_eglDisplay, m_eglContext); m_eglContext = EGL_NO_CONTEXT; if (m_eglSurface) { eglDestroySurface(m_eglDisplay, m_eglSurface); m_eglSurface = EGL_NO_SURFACE; } eglTerminate(m_eglDisplay); m_eglDisplay = EGL_NO_DISPLAY; XSync(m_dpy, False); newContext = true; } m_eglDisplay = eglGetDisplay((EGLNativeDisplayType)m_dpy); if (m_eglDisplay == EGL_NO_DISPLAY) { CLog::Log(LOGERROR, "failed to get egl display"); return false; } if (!eglInitialize(m_eglDisplay, NULL, NULL)) { CLog::Log(LOGERROR, "failed to initialize egl\n"); return false; } if (!eglBindAPI(EGL_OPENGL_API)) { CLog::Log(LOGERROR, "failed to initialize egl"); XFree(vInfo); return false; } if (m_eglConfig == EGL_NO_CONFIG) { m_eglConfig = GetEGLConfig(m_eglDisplay, vInfo); } if (m_eglConfig == EGL_NO_CONFIG) { CLog::Log(LOGERROR, "failed to get eglconfig for visual id"); XFree(vInfo); return false; } if (m_eglSurface == EGL_NO_SURFACE) { m_eglSurface = eglCreateWindowSurface(m_eglDisplay, m_eglConfig, glWindow, NULL); if (m_eglSurface == EGL_NO_SURFACE) { CLog::Log(LOGERROR, "failed to create EGL window surface %d", eglGetError()); XFree(vInfo); return false; } } EGLint contextAttributes[] = { EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 2, EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR, EGL_NONE }; m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, contextAttributes); if (m_eglContext == EGL_NO_CONTEXT) { EGLint contextAttributes[] = { EGL_CONTEXT_MAJOR_VERSION_KHR, 2, EGL_NONE }; m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, contextAttributes); if (m_eglContext == EGL_NO_CONTEXT) { CLog::Log(LOGERROR, "failed to create EGL context\n"); return false; } CLog::Log(LOGWARNING, "Failed to get an OpenGL context supporting core profile 3.2, \ using legacy mode with reduced feature set"); } if (!eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext)) { CLog::Log(LOGERROR, "Failed to make context current %p %p %p\n", m_eglDisplay, m_eglSurface, m_eglContext); return false; } XFree(vInfo); retVal = true; }
bool CGLContextEGL::Refresh(bool force, int screen, Window glWindow, bool &newContext) { // refresh context if (m_eglContext && !force) { if (m_eglSurface == EGL_NO_SURFACE) { m_eglSurface = eglCreateWindowSurface(m_eglDisplay, m_eglConfig, glWindow, NULL); if (m_eglSurface == EGL_NO_SURFACE) { CLog::Log(LOGERROR, "failed to create EGL window surface %d\n", eglGetError()); return false; } } CLog::Log(LOGDEBUG, "CWinSystemX11::RefreshEGLContext: refreshing context"); eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext); return true; } // create context bool retVal = false; if (m_eglDisplay == EGL_NO_DISPLAY) { m_eglDisplay = eglGetDisplay((EGLNativeDisplayType)m_dpy); if (m_eglDisplay == EGL_NO_DISPLAY) { CLog::Log(LOGERROR, "failed to get egl display\n"); return false; } if (!eglInitialize(m_eglDisplay, NULL, NULL)) { CLog::Log(LOGERROR, "failed to initialize egl display\n"); return false; } } XVisualInfo vMask; XVisualInfo *visuals; XVisualInfo *vInfo = NULL; int availableVisuals = 0; vMask.screen = screen; XWindowAttributes winAttr; /* Assume a depth of 24 in case the below calls to XGetWindowAttributes() or XGetVisualInfo() fail. That shouldn't happen unless something is fatally wrong, but lets prepare for everything. */ vMask.depth = 24; if (XGetWindowAttributes(m_dpy, glWindow, &winAttr)) { vMask.visualid = XVisualIDFromVisual(winAttr.visual); vInfo = XGetVisualInfo(m_dpy, VisualScreenMask | VisualIDMask, &vMask, &availableVisuals); if (!vInfo) CLog::Log(LOGWARNING, "Failed to get VisualInfo of visual 0x%x", (unsigned) vMask.visualid); else if(!IsSuitableVisual(vInfo)) { CLog::Log(LOGWARNING, "Visual 0x%x of the window is not suitable, looking for another one...", (unsigned) vInfo->visualid); vMask.depth = vInfo->depth; XFree(vInfo); vInfo = NULL; } } else CLog::Log(LOGWARNING, "Failed to get window attributes"); /* As per glXMakeCurrent documentation, we have to use the same visual as m_glWindow. Since that was not suitable for use, we try to use another one with the same depth and hope that the used implementation is less strict than the documentation. */ if (!vInfo) { visuals = XGetVisualInfo(m_dpy, VisualScreenMask | VisualDepthMask, &vMask, &availableVisuals); for (int i = 0; i < availableVisuals; i++) { if (IsSuitableVisual(&visuals[i])) { vMask.visualid = visuals[i].visualid; vInfo = XGetVisualInfo(m_dpy, VisualScreenMask | VisualIDMask, &vMask, &availableVisuals); break; } } XFree(visuals); } if (vInfo) { CLog::Log(LOGNOTICE, "Using visual 0x%x", (unsigned) vInfo->visualid); if (m_eglContext) { eglMakeCurrent(m_eglContext, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroyContext(m_eglDisplay, m_eglContext); m_eglContext = EGL_NO_CONTEXT; if (m_eglSurface) { eglDestroySurface(m_eglDisplay, m_eglSurface); m_eglSurface = EGL_NO_SURFACE; } eglTerminate(m_eglDisplay); m_eglDisplay = EGL_NO_DISPLAY; XSync(m_dpy, FALSE); newContext = true; } m_eglDisplay = eglGetDisplay((EGLNativeDisplayType)m_dpy); if (m_eglDisplay == EGL_NO_DISPLAY) { CLog::Log(LOGERROR, "failed to get egl display"); return false; } if (!eglInitialize(m_eglDisplay, NULL, NULL)) { CLog::Log(LOGERROR, "failed to initialize egl\n"); return false; } #if defined (HAS_GL) if (!eglBindAPI(EGL_OPENGL_API)) { CLog::Log(LOGERROR, "failed to initialize egl"); XFree(vInfo); return false; } #endif if(m_eglConfig == EGL_NO_CONFIG) { m_eglConfig = getEGLConfig(m_eglDisplay, vInfo); } if (m_eglConfig == EGL_NO_CONFIG) { CLog::Log(LOGERROR, "failed to get eglconfig for visual id"); XFree(vInfo); return false; } if (m_eglSurface == EGL_NO_SURFACE) { m_eglSurface = eglCreateWindowSurface(m_eglDisplay, m_eglConfig, glWindow, NULL); if (m_eglSurface == EGL_NO_SURFACE) { CLog::Log(LOGERROR, "failed to create EGL window surface %d", eglGetError()); XFree(vInfo); return false; } } EGLint contextAttributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, contextAttributes); if (m_eglContext == EGL_NO_CONTEXT) { CLog::Log(LOGERROR, "failed to create EGL context\n"); return false; } if (!eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext)) { CLog::Log(LOGERROR, "Failed to make context current %p %p %p\n", m_eglDisplay, m_eglSurface, m_eglContext); return false; } XFree(vInfo); retVal = true; } else { CLog::Log(LOGERROR, "EGL Error: vInfo is NULL!"); } return retVal; }
bool CGLContextGLX::Refresh(bool force, int screen, Window glWindow, bool &newContext) { bool retVal = false; m_glxWindow = glWindow; m_nScreen = screen; // refresh context if (m_glxContext && !force) { CLog::Log(LOGDEBUG, "CWinSystemX11::RefreshGlxContext: refreshing context"); glXMakeCurrent(m_dpy, None, NULL); glXMakeCurrent(m_dpy, glWindow, m_glxContext); return true; } // create context XVisualInfo vMask; XVisualInfo *visuals; XVisualInfo *vInfo = NULL; int availableVisuals = 0; vMask.screen = screen; XWindowAttributes winAttr; /* Assume a depth of 24 in case the below calls to XGetWindowAttributes() or XGetVisualInfo() fail. That shouldn't happen unless something is fatally wrong, but lets prepare for everything. */ vMask.depth = 24; if (XGetWindowAttributes(m_dpy, glWindow, &winAttr)) { vMask.visualid = XVisualIDFromVisual(winAttr.visual); vInfo = XGetVisualInfo(m_dpy, VisualScreenMask | VisualIDMask, &vMask, &availableVisuals); if (!vInfo) CLog::Log(LOGWARNING, "Failed to get VisualInfo of visual 0x%x", (unsigned) vMask.visualid); else if(!IsSuitableVisual(vInfo)) { CLog::Log(LOGWARNING, "Visual 0x%x of the window is not suitable, looking for another one...", (unsigned) vInfo->visualid); vMask.depth = vInfo->depth; XFree(vInfo); vInfo = NULL; } } else CLog::Log(LOGWARNING, "Failed to get window attributes"); /* As per glXMakeCurrent documentation, we have to use the same visual as m_glWindow. Since that was not suitable for use, we try to use another one with the same depth and hope that the used implementation is less strict than the documentation. */ if (!vInfo) { visuals = XGetVisualInfo(m_dpy, VisualScreenMask | VisualDepthMask, &vMask, &availableVisuals); for (int i = 0; i < availableVisuals; i++) { if (IsSuitableVisual(&visuals[i])) { vMask.visualid = visuals[i].visualid; vInfo = XGetVisualInfo(m_dpy, VisualScreenMask | VisualIDMask, &vMask, &availableVisuals); break; } } XFree(visuals); } if (vInfo) { CLog::Log(LOGNOTICE, "Using visual 0x%x", (unsigned) vInfo->visualid); if (m_glxContext) { glXMakeCurrent(m_dpy, None, NULL); glXDestroyContext(m_dpy, m_glxContext); XSync(m_dpy, FALSE); } if ((m_glxContext = glXCreateContext(m_dpy, vInfo, NULL, True))) { // make this context current glXMakeCurrent(m_dpy, glWindow, m_glxContext); retVal = true; } else CLog::Log(LOGERROR, "GLX Error: Could not create context"); XFree(vInfo); } else { CLog::Log(LOGERROR, "GLX Error: vInfo is NULL!"); } return retVal; }