| 946 | } |
| 947 | |
| 948 | bool |
| 949 | AppManager::initializeOpenGLFunctionsOnce(bool createOpenGLContext) |
| 950 | { |
| 951 | QMutexLocker k(&_imp->openGLFunctionsMutex); |
| 952 | |
| 953 | if (!_imp->hasInitializedOpenGLFunctions) { |
| 954 | OSGLContextPtr glContext; |
| 955 | bool checkRenderingReq = true; |
| 956 | if (createOpenGLContext) { |
| 957 | try { |
| 958 | _imp->initGLAPISpecific(); |
| 959 | |
| 960 | glContext = _imp->renderingContextPool->attachGLContextToRender(false /*checkIfGLLoaded*/); |
| 961 | if (glContext) { |
| 962 | // Make the context current and check its version |
| 963 | glContext->setContextCurrentNoRender(); |
| 964 | } else { |
| 965 | AppManagerPrivate::OpenGLRequirementsData& vdata = _imp->glRequirements[eOpenGLRequirementsTypeViewer]; |
| 966 | AppManagerPrivate::OpenGLRequirementsData& rdata = _imp->glRequirements[eOpenGLRequirementsTypeRendering]; |
| 967 | rdata.error = tr("Error creating OpenGL context."); |
| 968 | vdata.error = rdata.error; |
| 969 | rdata.hasRequirements = false; |
| 970 | vdata.hasRequirements = false; |
| 971 | AppManagerPrivate::addOpenGLRequirementsString(rdata.error, eOpenGLRequirementsTypeRendering); |
| 972 | AppManagerPrivate::addOpenGLRequirementsString(vdata.error, eOpenGLRequirementsTypeViewer); |
| 973 | } |
| 974 | |
| 975 | |
| 976 | } catch (const std::exception& e) { |
| 977 | std::cerr << "Error while loading OpenGL: " << e.what() << std::endl; |
| 978 | std::cerr << "OpenGL rendering is disabled. " << std::endl; |
| 979 | AppManagerPrivate::OpenGLRequirementsData& vdata = _imp->glRequirements[eOpenGLRequirementsTypeViewer]; |
| 980 | AppManagerPrivate::OpenGLRequirementsData& rdata = _imp->glRequirements[eOpenGLRequirementsTypeRendering]; |
| 981 | rdata.hasRequirements = false; |
| 982 | vdata.hasRequirements = false; |
| 983 | vdata.error = tr("Error while creating OpenGL context: %1").arg(QString::fromUtf8(e.what())); |
| 984 | rdata.error = tr("Error while creating OpenGL context: %1").arg(QString::fromUtf8(e.what())); |
| 985 | AppManagerPrivate::addOpenGLRequirementsString(rdata.error, eOpenGLRequirementsTypeRendering); |
| 986 | AppManagerPrivate::addOpenGLRequirementsString(vdata.error, eOpenGLRequirementsTypeViewer); |
| 987 | checkRenderingReq = false; |
| 988 | } |
| 989 | if (!glContext) { |
| 990 | return false; |
| 991 | } |
| 992 | } |
| 993 | |
| 994 | // The following requires a valid OpenGL context to be created |
| 995 | _imp->initGl(checkRenderingReq); |
| 996 | if (createOpenGLContext) { |
| 997 | if (hasOpenGLForRequirements(eOpenGLRequirementsTypeRendering)) { |
| 998 | try { |
| 999 | OSGLContext::checkOpenGLVersion(); |
| 1000 | } catch (const std::exception& e) { |
| 1001 | AppManagerPrivate::OpenGLRequirementsData& data = _imp->glRequirements[eOpenGLRequirementsTypeRendering]; |
| 1002 | data.hasRequirements = false; |
| 1003 | if ( !data.error.isEmpty() ) { |
| 1004 | data.error = QString::fromUtf8( e.what() ); |
| 1005 | } |
no test coverage detected