void CGLContextGLX::SetVSync(bool enable, int &mode) { // turn of current setting first if(m_glXSwapIntervalEXT) m_glXSwapIntervalEXT(m_dpy, m_glxWindow, 0); else if(m_glXSwapIntervalMESA) m_glXSwapIntervalMESA(0); m_iVSyncErrors = 0; if(!enable) return; if (m_glXSwapIntervalEXT && !mode) { m_glXSwapIntervalEXT(m_dpy, m_glxWindow, 1); mode = 6; } if (m_glXSwapIntervalMESA && !mode) { if(m_glXSwapIntervalMESA(1) == 0) mode = 2; else CLog::Log(LOGWARNING, "%s - glXSwapIntervalMESA failed", __FUNCTION__); } if (m_glXWaitVideoSyncSGI && m_glXGetVideoSyncSGI && !mode) { unsigned int count; if(m_glXGetVideoSyncSGI(&count) == 0) mode = 3; else CLog::Log(LOGWARNING, "%s - glXGetVideoSyncSGI failed, glcontext probably not direct", __FUNCTION__); } }
void CWinSystemX11GL::SetVSyncImpl(bool enable) { /* turn of current setting first */ if(m_glXSwapIntervalSGI) m_glXSwapIntervalSGI(0); if(m_glXSwapIntervalMESA) m_glXSwapIntervalMESA(0); m_iVSyncErrors = 0; CStdString strVendor(m_RenderVendor); strVendor.ToLower(); if(!enable) return; bool vendor_nvidia = strVendor.find("nvidia") != std::string::npos; bool vendor_ati = strVendor.compare(0, 3, "ati") == 0; if (m_glXSwapIntervalMESA && !m_iVSyncMode && vendor_ati) { if(m_glXSwapIntervalMESA(1) == 0) m_iVSyncMode = 2; else CLog::Log(LOGWARNING, "%s - glXSwapIntervalMESA failed", __FUNCTION__); } if(m_glXGetSyncValuesOML && m_glXSwapBuffersMscOML && !m_iVSyncMode) { int64_t ust, msc, sbc; if(m_glXGetSyncValuesOML(m_dpy, m_glWindow, &ust, &msc, &sbc)) m_iVSyncMode = 5; else CLog::Log(LOGWARNING, "%s - glXGetSyncValuesOML failed", __FUNCTION__); } if (m_glXWaitVideoSyncSGI && m_glXGetVideoSyncSGI && !m_iVSyncMode && !vendor_nvidia) { unsigned int count; if(m_glXGetVideoSyncSGI(&count) == 0) m_iVSyncMode = 3; else CLog::Log(LOGWARNING, "%s - glXGetVideoSyncSGI failed, glcontext probably not direct", __FUNCTION__); } if (m_glXSwapIntervalSGI && !m_iVSyncMode) { if(m_glXSwapIntervalSGI(1) == 0) m_iVSyncMode = 2; else CLog::Log(LOGWARNING, "%s - glXSwapIntervalSGI failed", __FUNCTION__); } if (m_glXSwapIntervalMESA && !m_iVSyncMode && !vendor_ati) { if(m_glXSwapIntervalMESA(1) == 0) m_iVSyncMode = 2; else CLog::Log(LOGWARNING, "%s - glXSwapIntervalMESA failed", __FUNCTION__); } }