void KisOpenGL::initialize() { if (initialized) return; setDefaultFormat(); // we need a QSurface active to get our GL functions from the context QWindow surface; surface.setSurfaceType( QSurface::OpenGLSurface ); surface.create(); QOpenGLContext context; context.create(); context.makeCurrent( &surface ); QOpenGLFunctions *funcs = context.functions(); funcs->initializeOpenGLFunctions(); qDebug() << "OpenGL Info"; qDebug() << " Vendor: " << reinterpret_cast<const char *>(funcs->glGetString(GL_VENDOR)); qDebug() << " Renderer: " << reinterpret_cast<const char *>(funcs->glGetString(GL_RENDERER)); qDebug() << " Version: " << reinterpret_cast<const char *>(funcs->glGetString(GL_VERSION)); qDebug() << " Shading language: " << reinterpret_cast<const char *>(funcs->glGetString(GL_SHADING_LANGUAGE_VERSION)); qDebug() << " Requested format: " << QSurfaceFormat::defaultFormat(); qDebug() << " Current format: " << context.format(); glMajorVersion = context.format().majorVersion(); glMinorVersion = context.format().minorVersion(); supportsDeprecatedFunctions = (context.format().options() & QSurfaceFormat::DeprecatedFunctions); initialized = true; }
int KisOpenGL::initializeContext(QOpenGLContext* s) { #ifdef HAVE_OPENGL KisConfig cfg; dbgUI << "OpenGL: Opening new context"; // Double check we were given the version we requested QSurfaceFormat format = s->format(); glVersion = 100 * format.majorVersion() + format.minorVersion(); if (!SharedSurface) { SharedSurface = new QOffscreenSurface(); SharedSurface->setFormat(format); SharedSurface->create(); } if (!SharedContext) { SharedContext = new QOpenGLContext; SharedContext->setFormat(format); SharedContext->setShareContext(s); SharedContext->create(); SharedContext->makeCurrent(SharedSurface); } QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); QFile log(QDesktopServices::storageLocation(QDesktopServices::TempLocation) + "/krita-opengl.txt"); log.open(QFile::WriteOnly); QString vendor((const char*)f->glGetString(GL_VENDOR)); log.write(vendor.toLatin1()); log.write(", "); QString renderer((const char*)f->glGetString(GL_RENDERER)); log.write(renderer.toLatin1()); log.write(", "); QString version((const char*)f->glGetString(GL_VERSION)); log.write(version.toLatin1()); // Check if we have a bugged driver that needs fence workaround bool isOnX11 = false; #ifdef HAVE_X11 isOnX11 = true; #endif if ((isOnX11 && renderer.startsWith("AMD")) || cfg.forceOpenGLFenceWorkaround()) { NeedsFenceWorkaround = true; } #else Q_UNUSED(s); NeedsFenceWorkaround = false; #endif return glVersion; }
void QSGContext::renderContextInitialized(QSGRenderContext *renderContext) { Q_D(QSGContext); d->mutex.lock(); if (d->antialiasingMethod == UndecidedAntialiasing) { if (Q_UNLIKELY(qEnvironmentVariableIsSet("QSG_ANTIALIASING_METHOD"))) { const QByteArray aaType = qgetenv("QSG_ANTIALIASING_METHOD"); if (aaType == "msaa") d->antialiasingMethod = MsaaAntialiasing; else if (aaType == "vertex") d->antialiasingMethod = VertexAntialiasing; } if (d->antialiasingMethod == UndecidedAntialiasing) { if (renderContext->openglContext()->format().samples() > 0) d->antialiasingMethod = MsaaAntialiasing; else d->antialiasingMethod = VertexAntialiasing; } } // With OpenGL ES, except for Angle on Windows, use GrayAntialiasing, unless // some value had been requested explicitly. This could not be decided // before without a context. Now the context is ready. if (!d->distanceFieldAntialiasingDecided) { d->distanceFieldAntialiasingDecided = true; #ifndef Q_OS_WIN32 if (renderContext->openglContext()->isOpenGLES()) d->distanceFieldAntialiasing = QSGGlyphNode::GrayAntialiasing; #endif } static bool dumped = false; if (!dumped && QSG_LOG_INFO().isDebugEnabled()) { dumped = true; QSurfaceFormat format = renderContext->openglContext()->format(); QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); qCDebug(QSG_LOG_INFO) << "R/G/B/A Buffers: " << format.redBufferSize() << format.greenBufferSize() << format.blueBufferSize() << format.alphaBufferSize(); qCDebug(QSG_LOG_INFO) << "Depth Buffer: " << format.depthBufferSize(); qCDebug(QSG_LOG_INFO) << "Stencil Buffer: " << format.stencilBufferSize(); qCDebug(QSG_LOG_INFO) << "Samples: " << format.samples(); qCDebug(QSG_LOG_INFO) << "GL_VENDOR: " << (const char *) funcs->glGetString(GL_VENDOR); qCDebug(QSG_LOG_INFO) << "GL_RENDERER: " << (const char *) funcs->glGetString(GL_RENDERER); qCDebug(QSG_LOG_INFO) << "GL_VERSION: " << (const char *) funcs->glGetString(GL_VERSION); QSet<QByteArray> exts = renderContext->openglContext()->extensions(); QByteArray all; foreach (const QByteArray &e, exts) all += ' ' + e; qCDebug(QSG_LOG_INFO) << "GL_EXTENSIONS: " << all.constData(); qCDebug(QSG_LOG_INFO) << "Max Texture Size: " << renderContext->maxTextureSize(); qCDebug(QSG_LOG_INFO) << "Debug context: " << format.testOption(QSurfaceFormat::DebugContext); }
QOpenGLExtensionMatcher::QOpenGLExtensionMatcher() { QOpenGLContext *ctx = QOpenGLContext::currentContext(); QOpenGLFunctions *funcs = ctx->functions(); const char *extensionStr = 0; if (ctx->isOpenGLES() || ctx->format().majorVersion() < 3) extensionStr = reinterpret_cast<const char *>(funcs->glGetString(GL_EXTENSIONS)); if (extensionStr) { QByteArray ba(extensionStr); QList<QByteArray> extensions = ba.split(' '); m_extensions = extensions.toSet(); } else { #ifdef QT_OPENGL_3 // clear error state while (funcs->glGetError()) {} if (ctx) { qt_glGetStringi glGetStringi = (qt_glGetStringi)ctx->getProcAddress("glGetStringi"); if (!glGetStringi) return; GLint numExtensions; funcs->glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); for (int i = 0; i < numExtensions; ++i) { const char *str = reinterpret_cast<const char *>(glGetStringi(GL_EXTENSIONS, i)); m_extensions.insert(str); } } #endif // QT_OPENGL_3 } }
void Widget::renderWindowReady() { QOpenGLContext *context = QOpenGLContext::currentContext(); Q_ASSERT(context); QString vendor, renderer, version, glslVersion; const GLubyte *p; QOpenGLFunctions *f = context->functions(); if ((p = f->glGetString(GL_VENDOR))) vendor = QString::fromLatin1(reinterpret_cast<const char *>(p)); if ((p = f->glGetString(GL_RENDERER))) renderer = QString::fromLatin1(reinterpret_cast<const char *>(p)); if ((p = f->glGetString(GL_VERSION))) version = QString::fromLatin1(reinterpret_cast<const char *>(p)); if ((p = f->glGetString(GL_SHADING_LANGUAGE_VERSION))) glslVersion = QString::fromLatin1(reinterpret_cast<const char *>(p)); m_output->append(tr("*** Context information ***")); m_output->append(tr("Vendor: %1").arg(vendor)); m_output->append(tr("Renderer: %1").arg(renderer)); m_output->append(tr("OpenGL version: %1").arg(version)); m_output->append(tr("GLSL version: %1").arg(glslVersion)); m_output->append(tr("\n*** QSurfaceFormat from context ***")); printFormat(context->format()); m_output->append(tr("\n*** QSurfaceFormat from window surface ***")); printFormat(m_surface->format()); m_output->append(tr("\n*** Qt build information ***")); const char *gltype[] = { "Desktop", "GLES 2", "GLES 1" }; m_output->append(tr("Qt OpenGL configuration: %1") .arg(QString::fromLatin1(gltype[QOpenGLContext::openGLModuleType()]))); m_output->append(tr("Qt OpenGL library handle: %1") .arg(QString::number(qintptr(QOpenGLContext::openGLModuleHandle()), 16))); QList<QByteArray> extensionList = context->extensions().toList(); std::sort(extensionList.begin(), extensionList.end()); m_extensions->append(tr("Found %1 extensions:").arg(extensionList.count())); Q_FOREACH (const QByteArray &ext, extensionList) m_extensions->append(QString::fromLatin1(ext)); m_output->moveCursor(QTextCursor::Start); m_extensions->moveCursor(QTextCursor::Start); }
void KisOpenGL::initializeContext(QOpenGLContext *ctx) { initialize(); dbgUI << "OpenGL: Opening new context"; // Double check we were given the version we requested QSurfaceFormat format = ctx->format(); QOpenGLFunctions *f = ctx->functions(); f->initializeOpenGLFunctions(); #ifndef GL_RENDERER # define GL_RENDERER 0x1F01 #endif Renderer = QString((const char*)f->glGetString(GL_RENDERER)); QFile log(QDesktopServices::storageLocation(QDesktopServices::TempLocation) + "/krita-opengl.txt"); log.open(QFile::WriteOnly); QString vendor((const char*)f->glGetString(GL_VENDOR)); log.write(vendor.toLatin1()); log.write(", "); log.write(Renderer.toLatin1()); log.write(", "); QString version((const char*)f->glGetString(GL_VERSION)); log.write(version.toLatin1()); log.close(); // Check if we have a bugged driver that needs fence workaround bool isOnX11 = false; #ifdef HAVE_X11 isOnX11 = true; #endif KisConfig cfg; if ((isOnX11 && Renderer.startsWith("AMD")) || cfg.forceOpenGLFenceWorkaround()) { NeedsFenceWorkaround = true; } }
void ResultRecorder::startResults(const QString &id) { // sub process will get all this. // safer that way, as then we keep OpenGL (and QGuiApplication) out of the host if (!Options::instance.isSubProcess) return; m_results["id"] = id; QString prettyProductName = #if QT_VERSION >= 0x050400 QSysInfo::prettyProductName(); #else # if defined(Q_OS_IOS) QStringLiteral("iOS"); # elif defined(Q_OS_OSX) QString::fromLatin1("OSX %d").arg(QSysInfo::macVersion()); # elif defined(Q_OS_WIN) QString::fromLatin1("Windows %d").arg(QSysInfo::windowsVersion()); # elif defined(Q_OS_LINUX) QStringLiteral("Linux"); # elif defined(Q_OS_ANDROID) QStringLiteral("Android"); # else QStringLiteral("unknown"); # endif #endif QVariantMap osMap; osMap["prettyProductName"] = prettyProductName; osMap["platformPlugin"] = QGuiApplication::platformName(); m_results["os"] = osMap; m_results["qt"] = QT_VERSION_STR; m_results["command-line"] = qApp->arguments().join(' '); // The following code makes the assumption that an OpenGL context the GUI // thread will get the same capabilities as the render thread's OpenGL // context. Not 100% accurate, but it works... QOpenGLContext context; context.create(); QOffscreenSurface surface; // In very odd cases, we can get incompatible configs here unless we pass the // GL context's format on to the offscreen format. surface.setFormat(context.format()); surface.create(); if (!context.makeCurrent(&surface)) { qWarning() << "failed to acquire GL context to get version info."; return; } QOpenGLFunctions *func = context.functions(); #if QT_VERSION >= 0x050300 const char *vendor = (const char *) func->glGetString(GL_VENDOR); const char *renderer = (const char *) func->glGetString(GL_RENDERER); const char *version = (const char *) func->glGetString(GL_VERSION); #else Q_UNUSED(func); const char *vendor = (const char *) glGetString(GL_VENDOR); const char *renderer = (const char *) glGetString(GL_RENDERER); const char *version = (const char *) glGetString(GL_VERSION); #endif if (!Options::instance.printJsonToStdout) { std::cout << "ID: " << id.toStdString() << std::endl; std::cout << "OS: " << prettyProductName.toStdString() << std::endl; std::cout << "QPA: " << QGuiApplication::platformName().toStdString() << std::endl; std::cout << "GL_VENDOR: " << vendor << std::endl; std::cout << "GL_RENDERER: " << renderer << std::endl; std::cout << "GL_VERSION: " << version << std::endl; } QVariantMap glInfo; glInfo["vendor"] = vendor; glInfo["renderer"] = renderer; glInfo["version"] = version; m_results["opengl"] = glInfo; context.doneCurrent(); }