# HG changeset patch # User Teemu Piippo # Date 1655743796 -10800 # Node ID 10a6298f636f1c544ea0dcfd46136414bd60cbed # Parent 1fa0e1de9f0a05cd57b04defd057aab60f6b1f16 Add an option to log opengl messages diff -r 1fa0e1de9f0a -r 10a6298f636f CMakeLists.txt --- a/CMakeLists.txt Mon Jun 20 18:40:22 2022 +0300 +++ b/CMakeLists.txt Mon Jun 20 19:49:56 2022 +0300 @@ -40,6 +40,7 @@ src/gl/axesprogram.cpp src/gl/basicshaderprogram.cpp src/gl/compiler.cpp + src/gl/debug.cpp src/gl/gridprogram.cpp src/gl/partrenderer.cpp # src/gl/vertexprogram.cpp @@ -83,6 +84,7 @@ src/gl/basicshaderprogram.h src/gl/common.h src/gl/compiler.h + src/gl/debug.h src/gl/gridprogram.h src/gl/partrenderer.h # src/gl/vertexprogram.h diff -r 1fa0e1de9f0a -r 10a6298f636f src/basics.h --- a/src/basics.h Mon Jun 20 18:40:22 2022 +0300 +++ b/src/basics.h Mon Jun 20 19:49:56 2022 +0300 @@ -300,10 +300,12 @@ struct Message { QDateTime time; - enum { Info, Warning, Error } type; + enum Type { Info, Warning, Error } type; QString text; }; +Q_DECLARE_METATYPE(Message) + inline Message logInfo(const QString text) { return Message{.time = QDateTime::currentDateTime(), .type = Message::Info, .text = text}; diff -r 1fa0e1de9f0a -r 10a6298f636f src/gl/debug.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gl/debug.cpp Mon Jun 20 19:49:56 2022 +0300 @@ -0,0 +1,100 @@ +#include "debug.h" + +QString sourceToString(const QOpenGLDebugMessage::Source source) +{ + switch (source) { + case QOpenGLDebugMessage::InvalidSource: + return QObject::tr("invalid"); + case QOpenGLDebugMessage::APISource: + return QObject::tr("API"); + case QOpenGLDebugMessage::WindowSystemSource: + return QObject::tr("window system"); + case QOpenGLDebugMessage::ShaderCompilerSource: + return QObject::tr("shader compiler"); + case QOpenGLDebugMessage::ThirdPartySource: + return QObject::tr("third party"); + case QOpenGLDebugMessage::ApplicationSource: + return QObject::tr("application"); + case QOpenGLDebugMessage::OtherSource: + return QObject::tr("other"); + case QOpenGLDebugMessage::AnySource: + return QObject::tr("any"); + } + return ""; +} + +QString typeToString(const QOpenGLDebugMessage::Type type) +{ + switch (type) { + case QOpenGLDebugMessage::ErrorType: + return QObject::tr("error"); + case QOpenGLDebugMessage::DeprecatedBehaviorType: + return QObject::tr("deprecated behavior"); + case QOpenGLDebugMessage::UndefinedBehaviorType: + return QObject::tr("undefined behavior"); + case QOpenGLDebugMessage::PortabilityType: + return QObject::tr("portability"); + case QOpenGLDebugMessage::PerformanceType: + return QObject::tr("performance"); + case QOpenGLDebugMessage::MarkerType: + return QObject::tr("marker"); + case QOpenGLDebugMessage::GroupPushType: + return QObject::tr("push group"); + case QOpenGLDebugMessage::GroupPopType: + return QObject::tr("pop group"); + case QOpenGLDebugMessage::OtherType: + return QObject::tr("other"); + case QOpenGLDebugMessage::InvalidType: + return QObject::tr("invalid"); + case QOpenGLDebugMessage::AnyType: + return QObject::tr("any"); + } + return ""; +} + +QString severityToString(const QOpenGLDebugMessage::Severity severity) +{ + switch (severity) { + case QOpenGLDebugMessage::HighSeverity: + return QObject::tr("high"); + case QOpenGLDebugMessage::MediumSeverity: + return QObject::tr("medium"); + case QOpenGLDebugMessage::LowSeverity: + return QObject::tr("low"); + case QOpenGLDebugMessage::NotificationSeverity: + return QObject::tr("notification"); + case QOpenGLDebugMessage::InvalidSeverity: + return QObject::tr("invalid"); + case QOpenGLDebugMessage::AnySeverity: + return QObject::tr("any"); + } + return ""; +} + +constexpr Message::Type severityToMessageType(const QOpenGLDebugMessage::Severity severity) +{ + switch (severity) { + case QOpenGLDebugMessage::HighSeverity: + return Message::Error; + case QOpenGLDebugMessage::MediumSeverity: + return Message::Warning; + default: + return Message::Info; + } +} + +Message debugMessageToString(const QOpenGLDebugMessage& glmessage) +{ + QString text; + QTextStream stream{&text}; + stream << QObject::tr("OpenGL debug message [%1]").arg(glmessage.id()) << "\n"; + stream << QObject::tr("Source: %1\n").arg(sourceToString(glmessage.source())); + stream << QObject::tr("Type: %1\n").arg(typeToString(glmessage.type())); + stream << QObject::tr("Severity: %1\n").arg(severityToString(glmessage.severity())); + stream << glmessage.message(); + return Message{ + .time = QDateTime::currentDateTime(), + .type = severityToMessageType(glmessage.severity()), + .text = text, + }; +} diff -r 1fa0e1de9f0a -r 10a6298f636f src/gl/debug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gl/debug.h Mon Jun 20 19:49:56 2022 +0300 @@ -0,0 +1,5 @@ +#pragma once +#include +#include "basics.h" + +Message debugMessageToString(const QOpenGLDebugMessage& glmessage); diff -r 1fa0e1de9f0a -r 10a6298f636f src/gl/partrenderer.cpp --- a/src/gl/partrenderer.cpp Mon Jun 20 18:40:22 2022 +0300 +++ b/src/gl/partrenderer.cpp Mon Jun 20 19:49:56 2022 +0300 @@ -27,6 +27,8 @@ #include "partrenderer.h" #include "model.h" #include "gl/compiler.h" +#include "gl/debug.h" +#include "settings.h" static constexpr double MIN_ZOOM = -3.0; static constexpr double MAX_ZOOM = 3.0; @@ -47,6 +49,9 @@ QSurfaceFormat surfaceFormat; surfaceFormat.setSamples(8); this->setFormat(surfaceFormat); + connect(&this->logger, &QOpenGLDebugLogger::messageLogged, [&](const QOpenGLDebugMessage& glmessage){ + Q_EMIT this->message(debugMessageToString(glmessage)); + }); connect(model, &Model::rowsInserted, [&]{ this->needBuild = true; }); @@ -92,6 +97,10 @@ for (RenderLayer* layer : this->inactiveRenderLayers) { layer->initializeGL(); } + this->logger.initialize(); + if (setting()) { + this->logger.startLogging(); + } connect(this->model, &Model::dataChanged, this, &PartRenderer::build); this->initialized = true; this->modelQuaternion = glm::angleAxis(glm::radians(30.0f), glm::vec3{-1, 0, 0}); @@ -484,6 +493,15 @@ { this->build(); } + if (this->initialized) { + this->makeCurrent(); + if (setting()) { + this->logger.startLogging(); + } + else { + this->logger.stopLogging(); + } + } Q_EMIT this->renderPreferencesChanged(); this->update(); } diff -r 1fa0e1de9f0a -r 10a6298f636f src/gl/partrenderer.h --- a/src/gl/partrenderer.h Mon Jun 20 18:40:22 2022 +0300 +++ b/src/gl/partrenderer.h Mon Jun 20 19:49:56 2022 +0300 @@ -1,5 +1,6 @@ #pragma once #include +#include #include "basics.h" #include "gl/common.h" #include "gl/compiler.h" @@ -29,6 +30,7 @@ std::vector activeRenderLayers; std::vector inactiveRenderLayers; bool frozen = false; + QOpenGLDebugLogger logger; public: PartRenderer( Model* model, @@ -50,6 +52,7 @@ void modelMatrixChanged(const glm::mat4& newMatrix); void viewMatrixChanged(const glm::mat4& newMatrix); void renderPreferencesChanged(); + void message(const Message& message); private: void initializeGL() override; void resizeGL(int width, int height) override; diff -r 1fa0e1de9f0a -r 10a6298f636f src/main.cpp --- a/src/main.cpp Mon Jun 20 18:40:22 2022 +0300 +++ b/src/main.cpp Mon Jun 20 19:49:56 2022 +0300 @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include "mainwindow.h" @@ -55,6 +56,7 @@ QCoreApplication::setApplicationName(::appName); QCoreApplication::setOrganizationName("hecknology.net"); QCoreApplication::setOrganizationDomain("hecknology.net"); + qRegisterMetaType(); qRegisterMetaTypeStreamOperators("Library"); qRegisterMetaTypeStreamOperators("Libraries"); qRegisterMetaTypeStreamOperators(); @@ -343,7 +345,6 @@ return result; } -#include int main(int argc, char *argv[]) { doQtRegistrations(); @@ -478,6 +479,7 @@ } } }); + QObject::connect(data->canvas.get(), &PartRenderer::message, &messageLog, &MessageLog::addMessage); const QFileInfo fileInfo{*documents.modelPath(modelId)}; ModelSubWindow* subWindow = new ModelSubWindow{modelId, ui.mdiArea}; subWindow->setWidget(data->canvas.get()); @@ -636,6 +638,7 @@ ui.messageLog->setProperty("shouldAutoScroll", bar->value() == bar->maximum()); }); QObject::connect(&messageLog, &MessageLog::rowsInserted, [&]{ + ui.messageLog->resizeRowsToContents(); if (ui.messageLog->property("shouldAutoScroll").toBool()) { ui.messageLog->scrollToBottom(); } diff -r 1fa0e1de9f0a -r 10a6298f636f src/mainwindow.ui --- a/src/mainwindow.ui Mon Jun 20 18:40:22 2022 +0300 +++ b/src/mainwindow.ui Mon Jun 20 19:49:56 2022 +0300 @@ -228,12 +228,21 @@ + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAlwaysOn + true QAbstractItemView::ScrollPerPixel + + QAbstractItemView::ScrollPerPixel + Qt::DotLine diff -r 1fa0e1de9f0a -r 10a6298f636f src/settings.h --- a/src/settings.h Mon Jun 20 18:40:22 2022 +0300 +++ b/src/settings.h Mon Jun 20 19:49:56 2022 +0300 @@ -38,6 +38,7 @@ SETTING(MainSplitterState, QByteArray{}) SETTING(RecentFiles, QStringList{}) SETTING(ViewMode, QMdiArea::TabbedView) +SETTING(LogOpenGLDebugMessages, false) // File management options SETTING(Libraries, QVector{}) diff -r 1fa0e1de9f0a -r 10a6298f636f src/settingseditor/settingseditor.cpp --- a/src/settingseditor/settingseditor.cpp Mon Jun 20 18:40:22 2022 +0300 +++ b/src/settingseditor/settingseditor.cpp Mon Jun 20 19:49:56 2022 +0300 @@ -45,6 +45,7 @@ setSetting(this->ui.selectedColorButton->selectedColor()); setSetting(static_cast(this->ui.lineThickness->value())); setSetting(this->ui.lineAntiAliasing->isChecked()); + setSetting(this->ui.logOpenGLDebugMessages->isChecked()); const int viewMode = this->ui.viewModeButtonGroup->checkedId(); if (viewMode != -1) { setSetting(static_cast(viewMode)); @@ -82,6 +83,7 @@ this->ui.selectedColorButton->setSelectedColor(setting()); this->ui.lineThickness->setValue(double_cast(setting())); this->ui.lineAntiAliasing->setChecked(setting()); + this->ui.logOpenGLDebugMessages->setChecked(setting()); auto* const viewModeButton = this->ui.viewModeButtonGroup->button(setting()); if (viewModeButton != nullptr) { viewModeButton->setChecked(true); diff -r 1fa0e1de9f0a -r 10a6298f636f src/settingseditor/settingseditor.ui --- a/src/settingseditor/settingseditor.ui Mon Jun 20 18:40:22 2022 +0300 +++ b/src/settingseditor/settingseditor.ui Mon Jun 20 19:49:56 2022 +0300 @@ -6,8 +6,8 @@ 0 0 - 574 - 416 + 716 + 472 @@ -236,6 +236,33 @@ + + + Debug + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Log OpenGL debug messages + + + + +