89 QOpenGLContext *ctx = QOpenGLContext::currentContext();
91 if (timer && context == ctx)
96 qWarning(
"A current OpenGL context is required to create timer query objects");
100 if (context->isOpenGLES()) {
101 qWarning(
"QOpenGLTimerQuery: Not supported on OpenGL ES");
106 core =
new QOpenGLQueryHelper(context);
109 QSurfaceFormat f = context->format();
110 if (f.version() <= std::pair(3, 2)
111 && !context->hasExtension(QByteArrayLiteral(
"GL_ARB_timer_query"))
112 && context->hasExtension(QByteArrayLiteral(
"GL_EXT_timer_query"))) {
113 ext =
new QExtTimerQueryHelper(context);
114 }
else if (f.version() <= std::pair(3, 2)
115 && !context->hasExtension(QByteArrayLiteral(
"GL_ARB_timer_query"))
116 && !context->hasExtension(QByteArrayLiteral(
"GL_EXT_timer_query"))) {
117 qWarning(
"QOpenGLTimerQuery requires one of:\n"
118 " OpenGL 3.3 or newer,\n"
119 " OpenGL 3.2 and the ARB_timer_query extension\n"
120 " or the EXT_timer query extension");
124 core->glGenQueries(1, &timer);
272QOpenGLTimerQuery::~QOpenGLTimerQuery()
274 QOpenGLContext* ctx = QOpenGLContext::currentContext();
276 Q_D(QOpenGLTimerQuery);
277 QOpenGLContext *oldContext =
nullptr;
278 if (d->context != ctx) {
280 if (d->context->makeCurrent(oldContext->surface())) {
283 qWarning(
"QOpenGLTimerQuery::~QOpenGLTimerQuery() failed to make query objects's context current");
292 if (!oldContext->makeCurrent(oldContext->surface()))
293 qWarning(
"QOpenGLTimerQuery::~QOpenGLTimerQuery() failed to restore current context");
472 if (!timers.isEmpty() && timers.at(0) != 0 && timers.size() == requestedSampleCount)
475 QOpenGLContext *ctx = QOpenGLContext::currentContext();
476 if (context && context != ctx) {
477 qWarning(
"QTimeMonitor: Attempting to use different OpenGL context to recreate timers.\n"
478 "Please call destroy() first or use the same context to previously create");
484 qWarning(
"A current OpenGL context is required to create timer query objects");
489 timers.resize(requestedSampleCount);
490 timeSamples.resize(requestedSampleCount);
493 core =
new QOpenGLQueryHelper(context);
496 QSurfaceFormat f = context->format();
497 if (f.version() <= std::pair(3, 2)
498 && !context->hasExtension(QByteArrayLiteral(
"GL_ARB_timer_query"))
499 && context->hasExtension(QByteArrayLiteral(
"GL_EXT_timer_query"))) {
500 ext =
new QExtTimerQueryHelper(context);
501 }
else if (f.version() <= std::pair(3, 2)
502 && !context->hasExtension(QByteArrayLiteral(
"GL_ARB_timer_query"))
503 && !context->hasExtension(QByteArrayLiteral(
"GL_EXT_timer_query"))) {
504 qWarning(
"QOpenGLTimeMonitor requires one of:\n"
505 " OpenGL 3.3 or newer,\n"
506 " OpenGL 3.2 and the ARB_timer_query extension\n"
507 " or the EXT_timer query extension");
511 core->glGenQueries(requestedSampleCount, timers.data());
512 return (timers.at(0) != 0);
580 QList<GLuint64> intervals(timers.size() - 1);
583 const QList<GLuint64> timeStamps = samples();
584 for (
int i = 0; i < intervals.size(); ++i)
585 intervals[i] = timeStamps[i+1] - timeStamps[i];
595 for (
int i = 0; i < currentSample; ++i)
596 ext->glGetQueryObjectui64vEXT(timers.at(i), GL_QUERY_RESULT, &intervals[i]);
663QOpenGLTimeMonitor::~QOpenGLTimeMonitor()
665 QOpenGLContext* ctx = QOpenGLContext::currentContext();
667 Q_D(QOpenGLTimeMonitor);
668 QOpenGLContext *oldContext =
nullptr;
669 if (d->context != ctx) {
671 if (d->context->makeCurrent(oldContext->surface())) {
674 qWarning(
"QOpenGLTimeMonitor::~QOpenGLTimeMonitor() failed to make time monitor's context current");
683 if (!oldContext->makeCurrent(oldContext->surface()))
684 qWarning(
"QOpenGLTimeMonitor::~QOpenGLTimeMonitor() failed to restore current context");