| 849 | } |
| 850 | |
| 851 | bool |
| 852 | AppManager::initializeOpenGLFunctionsOnce(bool createOpenGLContext) |
| 853 | { |
| 854 | QMutexLocker k(&_imp->openGLFunctionsMutex); |
| 855 | |
| 856 | if (!_imp->hasInitializedOpenGLFunctions) { |
| 857 | OSGLContextPtr glContext; |
| 858 | bool checkRenderingReq = true; |
| 859 | if (createOpenGLContext) { |
| 860 | try { |
| 861 | _imp->initGLAPISpecific(); |
| 862 | |
| 863 | glContext = _imp->renderingContextPool->attachGLContextToRender(false /*checkIfGLLoaded*/); |
| 864 | if (glContext) { |
| 865 | // Make the context current and check its version |
| 866 | glContext->setContextCurrentNoRender(); |
| 867 | } else { |
| 868 | AppManagerPrivate::OpenGLRequirementsData& vdata = _imp->glRequirements[eOpenGLRequirementsTypeViewer]; |
| 869 | AppManagerPrivate::OpenGLRequirementsData& rdata = _imp->glRequirements[eOpenGLRequirementsTypeRendering]; |
| 870 | rdata.error = tr("Error creating OpenGL context."); |
| 871 | vdata.error = rdata.error; |
| 872 | rdata.hasRequirements = false; |
| 873 | vdata.hasRequirements = false; |
| 874 | AppManagerPrivate::addOpenGLRequirementsString(rdata.error, eOpenGLRequirementsTypeRendering); |
| 875 | AppManagerPrivate::addOpenGLRequirementsString(vdata.error, eOpenGLRequirementsTypeViewer); |
| 876 | } |
| 877 | |
| 878 | |
| 879 | } catch (const std::exception& e) { |
| 880 | std::cerr << "Error while loading OpenGL: " << e.what() << std::endl; |
| 881 | std::cerr << "OpenGL rendering is disabled. " << std::endl; |
| 882 | AppManagerPrivate::OpenGLRequirementsData& vdata = _imp->glRequirements[eOpenGLRequirementsTypeViewer]; |
| 883 | AppManagerPrivate::OpenGLRequirementsData& rdata = _imp->glRequirements[eOpenGLRequirementsTypeRendering]; |
| 884 | rdata.hasRequirements = false; |
| 885 | vdata.hasRequirements = false; |
| 886 | vdata.error = tr("Error while creating OpenGL context: %1").arg(QString::fromUtf8(e.what())); |
| 887 | rdata.error = tr("Error while creating OpenGL context: %1").arg(QString::fromUtf8(e.what())); |
| 888 | AppManagerPrivate::addOpenGLRequirementsString(rdata.error, eOpenGLRequirementsTypeRendering); |
| 889 | AppManagerPrivate::addOpenGLRequirementsString(vdata.error, eOpenGLRequirementsTypeViewer); |
| 890 | checkRenderingReq = false; |
| 891 | } |
| 892 | if (!glContext) { |
| 893 | return false; |
| 894 | } |
| 895 | } |
| 896 | |
| 897 | // The following requires a valid OpenGL context to be created |
| 898 | _imp->initGl(checkRenderingReq); |
| 899 | if (createOpenGLContext) { |
| 900 | if (hasOpenGLForRequirements(eOpenGLRequirementsTypeRendering)) { |
| 901 | try { |
| 902 | OSGLContext::checkOpenGLVersion(); |
| 903 | } catch (const std::exception& e) { |
| 904 | AppManagerPrivate::OpenGLRequirementsData& data = _imp->glRequirements[eOpenGLRequirementsTypeRendering]; |
| 905 | data.hasRequirements = false; |
| 906 | if ( !data.error.isEmpty() ) { |
| 907 | data.error = QString::fromUtf8( e.what() ); |
| 908 | } |
no test coverage detected