4#include <QtCore/private/qobject_p.h>
5#include <QtCore/qglobal.h>
6#include <QtCore/qvarlengtharray.h>
7#include <QtGui/qopengl.h>
8#include <QtGui/qopenglfunctions.h>
9#include <QtGui/qoffscreensurface.h>
388#if defined(GL_KHR_debug) && defined(GL_DEBUG_SOURCE_API_KHR)
389#define USE_MANUAL_DEFS
398#define GL_KHR_debug 1
399#define USE_MANUAL_DEFS
402#ifdef USE_MANUAL_DEFS
404#ifndef GL_DEBUG_OUTPUT_SYNCHRONOUS
405#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
407#ifndef GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH
408#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
410#ifndef GL_DEBUG_CALLBACK_FUNCTION
411#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
413#ifndef GL_DEBUG_CALLBACK_USER_PARAM
414#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
416#ifndef GL_DEBUG_SOURCE_API
417#define GL_DEBUG_SOURCE_API 0x8246
419#ifndef GL_DEBUG_SOURCE_WINDOW_SYSTEM
420#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
422#ifndef GL_DEBUG_SOURCE_SHADER_COMPILER
423#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
425#ifndef GL_DEBUG_SOURCE_THIRD_PARTY
426#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
428#ifndef GL_DEBUG_SOURCE_APPLICATION
429#define GL_DEBUG_SOURCE_APPLICATION 0x824A
431#ifndef GL_DEBUG_SOURCE_OTHER
432#define GL_DEBUG_SOURCE_OTHER 0x824B
434#ifndef GL_DEBUG_TYPE_ERROR
435#define GL_DEBUG_TYPE_ERROR 0x824C
437#ifndef GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
438#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
440#ifndef GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
441#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
443#ifndef GL_DEBUG_TYPE_PORTABILITY
444#define GL_DEBUG_TYPE_PORTABILITY 0x824F
446#ifndef GL_DEBUG_TYPE_PERFORMANCE
447#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
449#ifndef GL_DEBUG_TYPE_OTHER
450#define GL_DEBUG_TYPE_OTHER 0x8251
452#ifndef GL_DEBUG_TYPE_MARKER
453#define GL_DEBUG_TYPE_MARKER 0x8268
455#ifndef GL_DEBUG_TYPE_PUSH_GROUP
456#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
458#ifndef GL_DEBUG_TYPE_POP_GROUP
459#define GL_DEBUG_TYPE_POP_GROUP 0x826A
461#ifndef GL_DEBUG_SEVERITY_NOTIFICATION
462#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
464#ifndef GL_MAX_DEBUG_GROUP_STACK_DEPTH
465#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
467#ifndef GL_DEBUG_GROUP_STACK_DEPTH
468#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
471#define GL_BUFFER 0x82E0
474#define GL_SHADER 0x82E1
477#define GL_PROGRAM 0x82E2
480#define GL_QUERY 0x82E3
482#ifndef GL_PROGRAM_PIPELINE
483#define GL_PROGRAM_PIPELINE 0x82E4
486#define GL_SAMPLER 0x82E6
488#ifndef GL_DISPLAY_LIST
489#define GL_DISPLAY_LIST 0x82E7
491#ifndef GL_MAX_LABEL_LENGTH
492#define GL_MAX_LABEL_LENGTH 0x82E8
494#ifndef GL_MAX_DEBUG_MESSAGE_LENGTH
495#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
497#ifndef GL_MAX_DEBUG_LOGGED_MESSAGES
498#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
500#ifndef GL_DEBUG_LOGGED_MESSAGES
501#define GL_DEBUG_LOGGED_MESSAGES 0x9145
503#ifndef GL_DEBUG_SEVERITY_HIGH
504#define GL_DEBUG_SEVERITY_HIGH 0x9146
506#ifndef GL_DEBUG_SEVERITY_MEDIUM
507#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
509#ifndef GL_DEBUG_SEVERITY_LOW
510#define GL_DEBUG_SEVERITY_LOW 0x9148
512#ifndef GL_DEBUG_OUTPUT
513#define GL_DEBUG_OUTPUT 0x92E0
515#ifndef GL_CONTEXT_FLAG_DEBUG_BIT
516#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
518#ifndef GL_STACK_OVERFLOW
519#define GL_STACK_OVERFLOW 0x0503
521#ifndef GL_STACK_UNDERFLOW
522#define GL_STACK_UNDERFLOW 0x0504
948 return (d == debugMessage.d)
949 || (d->
id == debugMessage.d->
id
965#ifndef QT_NO_DEBUG_STREAM
975 debug.nospace() <<
"QOpenGLDebugMessage::Source("
990 debug.nospace() <<
"QOpenGLDebugMessage::Type("
1005 debug.nospace() <<
"QOpenGLDebugMessage::Severity("
1020 debug.nospace() <<
"QOpenGLDebugMessage("
1047 QOpenGLDebugMessage::Types
types,
1075 : glDebugMessageControl(
nullptr),
1076 glDebugMessageInsert(
nullptr),
1077 glDebugMessageCallback(
nullptr),
1078 glGetDebugMessageLog(
nullptr),
1081 oldDebugCallbackFunction(
nullptr),
1083 maxMessageLength(0),
1087 debugWasEnabled(
false),
1088 syncDebugWasEnabled(
false)
1100 const GLchar *rawMessage)
1110 messagePrivate->
id =
id;
1124 QOpenGLDebugMessage::Types
types,
1130 qWarning(
"QOpenGLDebugLogger::%s(): object must be initialized before enabling/disabling messages", callerName.
constData());
1134 qWarning(
"QOpenGLDebugLogger::%s(): invalid source specified", callerName.
constData());
1138 qWarning(
"QOpenGLDebugLogger::%s(): invalid type specified", callerName.
constData());
1142 qWarning(
"QOpenGLDebugLogger::%s(): invalid severity specified", callerName.
constData());
1150 if (
ids.size() > 0) {
1177#define CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(type, source, target) \
1178 if (source == QOpenGLDebugMessage::Any ## type) { \
1179 target << GL_DONT_CARE; \
1181 for (uint i = 1; i <= QOpenGLDebugMessage::Last ## type; i = i << 1) \
1182 if (source.testFlag(QOpenGLDebugMessage:: type (i))) \
1183 target << qt_message ## type ## ToGL (QOpenGLDebugMessage:: type (i)); \
1189#undef CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS
1194 const GLuint *
const idPtr = idCount ?
ids.constData() :
nullptr;
1213 QSurface *currentSurface =
nullptr;
1217 if (
context != currentContext) {
1220 currentSurface = currentContext->
surface();
1224 offscreenSurface->create();
1226 qWarning(
"QOpenGLDebugLoggerPrivate::_q_contextAboutToBeDestroyed(): could not make the owning GL context current for cleanup");
1232 if (offscreenSurface) {
1251 const GLchar *rawMessage,
1272 qRegisterMetaType<QOpenGLDebugMessage>();
1302 qWarning(
"QOpenGLDebugLogger::initialize(): no current OpenGL context found.");
1314 qWarning(
"QOpenGLDebugLogger::initialize(): cannot initialize the object while logging. Please stop the logging first.");
1321 d->initialized =
false;
1322 d->context =
nullptr;
1328 connect(
d->context,
SIGNAL(aboutToBeDestroyed()),
this,
SLOT(_q_contextAboutToBeDestroyed()));
1330#define GET_DEBUG_PROC_ADDRESS(procName) \
1331 d->procName = reinterpret_cast< qt_ ## procName ## _t >( \
1332 d->context->getProcAddress(d->context->isOpenGLES() ? (#procName "KHR") : (#procName)) \
1343#undef GET_DEBUG_PROC_ADDRESS
1349 qWarning(
"QOpenGLDebugLogger::initialize(): the current context is not a debug context:\n"
1350 " this means that the GL may not generate any debug output at all.\n"
1351 " To avoid this warning, try creating the context with the\n"
1352 " QSurfaceFormat::DebugContext surface format option.");
1356 d->initialized =
true;
1368 return d->isLogging;
1396 if (!
d->initialized) {
1397 qWarning(
"QOpenGLDebugLogger::startLogging(): object must be initialized before logging can start");
1401 qWarning(
"QOpenGLDebugLogger::startLogging(): this object is already logging");
1405 d->isLogging =
true;
1433 return d->loggingMode;
1448 if (!currentContext || currentContext !=
d->context) {
1449 qWarning(
"QOpenGLDebugLogger::stopLogging(): attempting to stop logging with the wrong OpenGL context current");
1453 d->isLogging =
false;
1455 d->glDebugMessageCallback(
d->oldDebugCallbackFunction,
d->oldDebugCallbackParameter);
1458 if (!
d->debugWasEnabled)
1461 if (
d->syncDebugWasEnabled)
1483 if (!
d->initialized) {
1484 qWarning(
"QOpenGLDebugLogger::logMessage(): object must be initialized before logging messages");
1489 qWarning(
"QOpenGLDebugLogger::logMessage(): using a message source different from ApplicationSource\n"
1490 " or ThirdPartySource is not supported by GL_KHR_debug. The message will not be logged.");
1497 qWarning(
"QOpenGLDebugLogger::logMessage(): the message has a non-valid type and/or severity. The message will not be logged.");
1507 if (rawMessage.
size() >
d->maxMessageLength) {
1508 qWarning(
"QOpenGLDebugLogger::logMessage(): message too long, truncating it\n"
1509 " (%d bytes long, but the GL accepts up to %d bytes)",
int(rawMessage.
size()),
d->maxMessageLength);
1510 rawMessage.
resize(
d->maxMessageLength - 1);
1517 d->glDebugMessageInsert(
source,
1546 if (!
d->initialized) {
1547 qWarning(
"QOpenGLDebugLogger::pushGroup(): object must be initialized before pushing a debug group");
1552 qWarning(
"QOpenGLDebugLogger::pushGroup(): using a source different from ApplicationSource\n"
1553 " or ThirdPartySource is not supported by GL_KHR_debug. The group will not be pushed.");
1559 if (rawName.
size() >
d->maxMessageLength) {
1560 qWarning(
"QOpenGLDebugLogger::pushGroup(): group name too long, truncating it\n"
1561 " (%d bytes long, but the GL accepts up to %d bytes)",
int(rawName.
size()),
d->maxMessageLength);
1562 rawName.
resize(
d->maxMessageLength - 1);
1589 if (!
d->initialized) {
1590 qWarning(
"QOpenGLDebugLogger::pushGroup(): object must be initialized before popping a debug group");
1594 d->glPopDebugGroup();
1606 QOpenGLDebugMessage::Types
types,
1623 QOpenGLDebugMessage::Sources
sources,
1624 QOpenGLDebugMessage::Types
types)
1644 QOpenGLDebugMessage::Types
types,
1661 QOpenGLDebugMessage::Sources
sources,
1662 QOpenGLDebugMessage::Types
types)
1684 if (!
d->initialized) {
1685 qWarning(
"QOpenGLDebugLogger::loggedMessages(): object must be initialized before reading logged messages");
1689 static const GLuint maxMessageCount = 128;
1691 GLenum messageSources[maxMessageCount];
1692 GLenum messageTypes[maxMessageCount];
1693 GLuint messageIds[maxMessageCount];
1694 GLenum messageSeverities[maxMessageCount];
1695 GLsizei messageLengths[maxMessageCount];
1698 messagesBuffer.
resize(maxMessageCount *
d->maxMessageLength);
1702 messagesRead =
d->glGetDebugMessageLog(maxMessageCount,
1709 messagesBuffer.
data());
1711 const char *messagesBufferPtr = messagesBuffer.
constData();
1712 for (
GLuint i = 0;
i < messagesRead; ++
i) {
1718 messagePrivate->
id = messageIds[
i];
1722 messagesBufferPtr += messageLengths[
i];
1725 }
while (messagesRead == maxMessageCount);
1771 if (!
d->initialized) {
1772 qWarning(
"QOpenGLDebugLogger::maximumMessageLength(): object must be initialized before reading the maximum message length");
1775 return d->maxMessageLength;
1781#include "moc_qopengldebug.cpp"
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
void resize(qsizetype size)
Sets the size of the byte array to size bytes.
QByteArray & append(char c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
bool makeCurrent(QSurface *surface)
Makes the context current in the current thread, against the given surface.
QSurfaceFormat format() const
Returns the format of the underlying platform context, if create() has been called.
static QOpenGLContext * currentContext()
Returns the last context which called makeCurrent in the current thread, or \nullptr,...
void doneCurrent()
Convenience function for calling makeCurrent with a 0 surface.
QOpenGLFunctions * functions() const
Get the QOpenGLFunctions instance for this context.
QSurface * surface() const
Returns the surface the context has been made current with.
void _q_contextAboutToBeDestroyed()
qt_glDebugMessageCallback_t glDebugMessageCallback
qt_glPushDebugGroup_t glPushDebugGroup
void controlDebugMessages(QOpenGLDebugMessage::Sources sources, QOpenGLDebugMessage::Types types, QOpenGLDebugMessage::Severities severities, const QList< GLuint > &ids, const QByteArray &callerName, bool enable)
QOpenGLDebugLoggerPrivate()
qt_glDebugMessageInsert_t glDebugMessageInsert
void * oldDebugCallbackParameter
GLDEBUGPROC oldDebugCallbackFunction
qt_glGetPointerv_t glGetPointerv
QOpenGLDebugLogger::LoggingMode loggingMode
qt_glDebugMessageControl_t glDebugMessageControl
qt_glGetDebugMessageLog_t glGetDebugMessageLog
void handleMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *rawMessage)
qt_glPopDebugGroup_t glPopDebugGroup
The QOpenGLDebugLogger enables logging of OpenGL debugging messages.
LoggingMode loggingMode
the logging mode passed to startLogging().
void stopLogging()
Stops logging messages from the OpenGL server.
qint64 maximumMessageLength() const
Returns the maximum supported length, in bytes, for the text of the messages passed to logMessage().
bool isLogging() const
Returns true if this object is currently logging, false otherwise.
QOpenGLDebugLogger(QObject *parent=nullptr)
Constructs a new logger object with the given parent.
bool initialize()
Initializes the object in the current OpenGL context.
void disableMessages(QOpenGLDebugMessage::Sources sources=QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types=QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities=QOpenGLDebugMessage::AnySeverity)
Disables the logging of messages with the given sources, of the given types and with the given severi...
LoggingMode
The LoggingMode enum defines the logging mode of the logger object.
~QOpenGLDebugLogger()
Destroys the logger object.
void logMessage(const QOpenGLDebugMessage &debugMessage)
Inserts the message debugMessage into the OpenGL debug log.
void pushGroup(const QString &name, GLuint id=0, QOpenGLDebugMessage::Source source=QOpenGLDebugMessage::ApplicationSource)
Pushes a debug group with name name, id id, and source source onto the debug groups stack.
void enableMessages(QOpenGLDebugMessage::Sources sources=QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types=QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities=QOpenGLDebugMessage::AnySeverity)
Enables the logging of messages from the given sources, of the given types and with the given severit...
void startLogging(LoggingMode loggingMode=AsynchronousLogging)
Starts logging messages coming from the OpenGL server.
QList< QOpenGLDebugMessage > loggedMessages() const
Reads all the available messages in the OpenGL internal debug log and returns them.
void popGroup()
Pops the topmost debug group from the debug groups stack.
QOpenGLDebugMessage::Source source
QOpenGLDebugMessage::Type type
QOpenGLDebugMessagePrivate()
QOpenGLDebugMessage::Severity severity
The QOpenGLDebugMessage class wraps an OpenGL debug message.
QOpenGLDebugMessage & operator=(const QOpenGLDebugMessage &debugMessage)
Assigns the message debugMessage to this object, and returns a reference to the copy.
QOpenGLDebugMessage()
Constructs a debug message with an empty message string, id set to 0, source set to InvalidSource,...
static QOpenGLDebugMessage createThirdPartyMessage(const QString &text, GLuint id=0, Severity severity=NotificationSeverity, Type type=OtherType)
Constructs and returns a debug message with text as its text, id as id, severity as severity,...
QDebug operator<<(QDebug debug, const QOpenGLDebugMessage &message)
Writes the message message into the debug object debug for debugging purposes.
QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Type type)
Writes the type type into the debug object debug for debugging purposes.
Source source() const
Returns the source of the debug message.
QString message() const
Returns the textual message contained by this debug message.
Type
The Type enum defines the type of the debug message.
static QOpenGLDebugMessage createApplicationMessage(const QString &text, GLuint id=0, Severity severity=NotificationSeverity, Type type=OtherType)
Constructs and returns a debug message with text as its text, id as id, severity as severity,...
Source
The Source enum defines the source of the debug message.
GLuint id() const
Returns the id of the debug message.
~QOpenGLDebugMessage()
Destroys this debug message.
Severity severity() const
Returns the severity of the debug message.
QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Source source)
Writes the source source into the debug object debug for debugging purposes.
Severity
The Severity enum defines the severity of the debug message.
bool operator==(const QOpenGLDebugMessage &debugMessage) const
Returns true if this debug message is equal to debugMessage, or false otherwise.
Type type() const
Returns the type of the debug message.
QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Severity severity)
Writes the severity severity into the debug object debug for debugging purposes.
The QOpenGLFunctions class provides cross-platform access to the OpenGL ES 2.0 API.
void glGetIntegerv(GLenum pname, GLint *params)
Convenience function that calls glGetIntegerv(pname, params).
T * data() const noexcept
Returns the value of the pointer referenced by this object.
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QByteArray toUtf8() const &
static VulkanServerBufferGlFunctions * funcs
Combined button and popup list for selecting options.
#define QByteArrayLiteral(str)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define QOPENGLF_APIENTRYP
#define QOPENGLF_APIENTRY
#define GL_DEBUG_TYPE_MARKER
#define GL_DEBUG_SEVERITY_LOW
GLsizei GLenum GLenum GLuint GLenum * severities
GLsizei GLenum GLenum GLuint GLenum GLsizei * lengths
#define GL_DEBUG_SOURCE_THIRD_PARTY
static void QOPENGLF_APIENTRY qt_opengl_debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *rawMessage, const GLvoid *userParam)
#define GL_DEBUG_TYPE_PORTABILITY
#define GL_DEBUG_TYPE_OTHER
static GLenum qt_messageTypeToGL(QOpenGLDebugMessage::Type type)
GLsizei GLenum GLenum GLuint GLenum GLsizei GLchar * messageLog
#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
GLenum GLenum GLsizei const GLuint * ids
#define GL_DEBUG_TYPE_PUSH_GROUP
GLenum GLuint GLenum GLsizei length
#define GL_DEBUG_SOURCE_APPLICATION
#define GL_DEBUG_SOURCE_OTHER
GLenum GLenum GLsizei const GLuint GLboolean enabled
#define GL_DEBUG_SEVERITY_MEDIUM
static QOpenGLDebugMessage::Severity qt_messageSeverityFromGL(GLenum severity)
static QOpenGLDebugMessage::Type qt_messageTypeFromGL(GLenum type)
#define GL_DEBUG_SOURCE_SHADER_COMPILER
static GLenum qt_messageSourceToGL(QOpenGLDebugMessage::Source source)
#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
static GLenum qt_messageSeverityToGL(QOpenGLDebugMessage::Severity severity)
#define GL_DEBUG_SEVERITY_NOTIFICATION
#define GL_DEBUG_TYPE_POP_GROUP
GLenum GLenum GLsizei count
#define GL_DEBUG_SOURCE_WINDOW_SYSTEM
#define GL_DEBUG_SOURCE_API
static QString qt_messageTypeToString(QOpenGLDebugMessage::Type type)
void(QOPENGLF_APIENTRY * GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const GLvoid *userParam)
#define GL_DEBUG_TYPE_ERROR
#define CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(type, source, target)
GLuint GLsizei const GLchar * message
#define GL_DEBUG_SEVERITY_HIGH
#define GET_DEBUG_PROC_ADDRESS(procName)
GLsizei GLenum GLenum * types
static QString qt_messageSourceToString(QOpenGLDebugMessage::Source source)
#define GL_DEBUG_TYPE_PERFORMANCE
static QOpenGLDebugMessage::Source qt_messageSourceFromGL(GLenum source)
GLenum GLuint GLenum GLsizei const GLchar * buf
static QString qt_messageSeverityToString(QOpenGLDebugMessage::Severity severity)
typedef GLint(GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)(GLuint program
GLsizei GLenum GLenum GLuint GLenum * severities
GLenum GLenum GLsizei const GLuint * ids
GLsizei GLenum GLenum * types
GLenum GLuint GLenum GLsizei length
typedef GLsizei(GL_APIENTRYP PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)(GLuint target)
typedef GLenum(GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSKHRPROC)(void)
GLuint GLsizei const GLchar * message
typedef GLboolean(GL_APIENTRYP PFNGLISENABLEDIOESPROC)(GLenum target
GLsizei GLsizei GLchar * source
#define GL_MAX_DEBUG_MESSAGE_LENGTH
GLdouble GLdouble GLdouble GLdouble q
#define GL_DEBUG_CALLBACK_USER_PARAM
#define GL_DEBUG_CALLBACK_FUNCTION
#define GL_DEBUG_OUTPUT_SYNCHRONOUS
#define Q_ASSERT_X(cond, x, msg)
#define QStringLiteral(str)
myObject disconnect()
[26]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent