File indexing completed on 2025-02-21 10:11:22
0001
0002
0003
0004 #ifndef QOPENGLDEBUG_H
0005 #define QOPENGLDEBUG_H
0006
0007 #include <QtOpenGL/qtopenglglobal.h>
0008
0009 #ifndef QT_NO_OPENGL
0010
0011 #include <QtCore/qshareddata.h>
0012 #include <QtCore/qflags.h>
0013 #include <QtCore/qlist.h>
0014 #include <QtCore/qmetatype.h>
0015 #include <QtCore/qdebug.h>
0016 #include <QtGui/qopenglcontext.h>
0017
0018 #if defined(Q_QDOC)
0019 #undef GLuint
0020 typedef unsigned int GLuint;
0021 #endif
0022
0023 QT_BEGIN_NAMESPACE
0024
0025 class QOpenGLDebugLogger;
0026 class QOpenGLDebugLoggerPrivate;
0027 class QOpenGLDebugMessagePrivate;
0028
0029 class Q_OPENGL_EXPORT QOpenGLDebugMessage
0030 {
0031 public:
0032 enum Source {
0033 InvalidSource = 0x00000000,
0034 APISource = 0x00000001,
0035 WindowSystemSource = 0x00000002,
0036 ShaderCompilerSource = 0x00000004,
0037 ThirdPartySource = 0x00000008,
0038 ApplicationSource = 0x00000010,
0039 OtherSource = 0x00000020,
0040 LastSource = OtherSource,
0041 AnySource = 0xffffffff
0042 };
0043 Q_DECLARE_FLAGS(Sources, Source)
0044
0045 enum Type {
0046 InvalidType = 0x00000000,
0047 ErrorType = 0x00000001,
0048 DeprecatedBehaviorType = 0x00000002,
0049 UndefinedBehaviorType = 0x00000004,
0050 PortabilityType = 0x00000008,
0051 PerformanceType = 0x00000010,
0052 OtherType = 0x00000020,
0053 MarkerType = 0x00000040,
0054 GroupPushType = 0x00000080,
0055 GroupPopType = 0x00000100,
0056 LastType = GroupPopType,
0057 AnyType = 0xffffffff
0058 };
0059 Q_DECLARE_FLAGS(Types, Type)
0060
0061 enum Severity {
0062 InvalidSeverity = 0x00000000,
0063 HighSeverity = 0x00000001,
0064 MediumSeverity = 0x00000002,
0065 LowSeverity = 0x00000004,
0066 NotificationSeverity = 0x00000008,
0067 LastSeverity = NotificationSeverity,
0068 AnySeverity = 0xffffffff
0069 };
0070 Q_DECLARE_FLAGS(Severities, Severity)
0071
0072 QOpenGLDebugMessage();
0073 QOpenGLDebugMessage(const QOpenGLDebugMessage &debugMessage);
0074
0075 QOpenGLDebugMessage &operator=(const QOpenGLDebugMessage &debugMessage);
0076 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QOpenGLDebugMessage)
0077 ~QOpenGLDebugMessage();
0078
0079 void swap(QOpenGLDebugMessage &other) noexcept { d.swap(other.d); }
0080
0081 Source source() const;
0082 Type type() const;
0083 Severity severity() const;
0084 GLuint id() const;
0085 QString message() const;
0086
0087 static QOpenGLDebugMessage createApplicationMessage(const QString &text,
0088 GLuint id = 0,
0089 Severity severity = NotificationSeverity,
0090 Type type = OtherType);
0091 static QOpenGLDebugMessage createThirdPartyMessage(const QString &text,
0092 GLuint id = 0,
0093 Severity severity = NotificationSeverity,
0094 Type type = OtherType);
0095
0096 bool operator==(const QOpenGLDebugMessage &debugMessage) const;
0097 inline bool operator!=(const QOpenGLDebugMessage &debugMessage) const { return !operator==(debugMessage); }
0098
0099 private:
0100 friend class QOpenGLDebugLogger;
0101 friend class QOpenGLDebugLoggerPrivate;
0102 QSharedDataPointer<QOpenGLDebugMessagePrivate> d;
0103 };
0104
0105 Q_DECLARE_SHARED(QOpenGLDebugMessage)
0106 Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Sources)
0107 Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Types)
0108 Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Severities)
0109
0110 #ifndef QT_NO_DEBUG_STREAM
0111 Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, const QOpenGLDebugMessage &message);
0112 Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Source source);
0113 Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Type type);
0114 Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Severity severity);
0115 #endif
0116
0117 class QOpenGLDebugLoggerPrivate;
0118
0119 class Q_OPENGL_EXPORT QOpenGLDebugLogger : public QObject
0120 {
0121 Q_OBJECT
0122 Q_PROPERTY(LoggingMode loggingMode READ loggingMode)
0123
0124 public:
0125 enum LoggingMode {
0126 AsynchronousLogging,
0127 SynchronousLogging
0128 };
0129 Q_ENUM(LoggingMode)
0130
0131 explicit QOpenGLDebugLogger(QObject *parent = nullptr);
0132 ~QOpenGLDebugLogger();
0133
0134 bool initialize();
0135
0136 bool isLogging() const;
0137 LoggingMode loggingMode() const;
0138
0139 qint64 maximumMessageLength() const;
0140
0141 void pushGroup(const QString &name,
0142 GLuint id = 0,
0143 QOpenGLDebugMessage::Source source = QOpenGLDebugMessage::ApplicationSource);
0144 void popGroup();
0145
0146 void enableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
0147 QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType,
0148 QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity);
0149
0150 void enableMessages(const QList<GLuint> &ids,
0151 QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
0152 QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType);
0153
0154 void disableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
0155 QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType,
0156 QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity);
0157
0158 void disableMessages(const QList<GLuint> &ids,
0159 QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
0160 QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType);
0161
0162 QList<QOpenGLDebugMessage> loggedMessages() const;
0163
0164 public Q_SLOTS:
0165 void logMessage(const QOpenGLDebugMessage &debugMessage);
0166 void startLogging(LoggingMode loggingMode = AsynchronousLogging);
0167 void stopLogging();
0168
0169 Q_SIGNALS:
0170 void messageLogged(const QOpenGLDebugMessage &debugMessage);
0171
0172 private:
0173 Q_DISABLE_COPY(QOpenGLDebugLogger)
0174 Q_DECLARE_PRIVATE(QOpenGLDebugLogger)
0175 Q_PRIVATE_SLOT(d_func(), void _q_contextAboutToBeDestroyed())
0176 };
0177
0178 QT_END_NAMESPACE
0179
0180 QT_DECL_METATYPE_EXTERN(QOpenGLDebugMessage, Q_OPENGL_EXPORT)
0181
0182 #endif
0183
0184 #endif