bool makeCurrent(trace::Call &call, glws::Drawable *drawable, glws::Drawable *readable, Context *context) { Context *currentContext = currentContextPtr; glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL; glws::Drawable *currentReadable = currentContext ? currentContext->readable : NULL; if (drawable == currentDrawable && readable == currentReadable && context == currentContext) { return true; } if (currentContext) { glFlush(); currentContext->needsFlush = false; if (!retrace::doubleBuffer) { frame_complete(call); } } flushQueries(); beforeContextSwitch(); bool success = glws::makeCurrent(drawable, readable, context ? context->wsContext : NULL); if (!success) { std::cerr << "error: failed to make current OpenGL context and drawable\n"; exit(1); } if (context != currentContext) { if (context) { context->aquire(); } currentContextPtr = context; if (currentContext) { currentContext->release(); } } if (drawable && context) { context->drawable = drawable; context->readable = readable; if (!context->used) { initContext(); context->used = true; } } afterContextSwitch(); return true; }
void frame_complete(trace::Call &call) { if (retrace::profilingWithBackends) { if (profilingBoundaries[QUERY_BOUNDARY_CALL] || profilingBoundaries[QUERY_BOUNDARY_DRAWCALL]) { if (isLastPass() && curMetricBackend) { // frame end indicator ProfilerCall::data callData = {true, 0, 0, ""}; if (profilingBoundaries[QUERY_BOUNDARY_CALL]) { profiler.addQuery(QUERY_BOUNDARY_CALL, 0, &callData); } if (profilingBoundaries[QUERY_BOUNDARY_DRAWCALL]) { profiler.addQuery(QUERY_BOUNDARY_DRAWCALL, 0, &callData); } } } if (curMetricBackend) { curMetricBackend->endQuery(QUERY_BOUNDARY_FRAME); } if (profilingBoundaries[QUERY_BOUNDARY_FRAME]) { if (isLastPass() && curMetricBackend) { profiler.addQuery(QUERY_BOUNDARY_FRAME, profilingBoundariesIndex[QUERY_BOUNDARY_FRAME]++); } } } else if (retrace::profiling) { /* Complete any remaining queries */ flushQueries(); /* Indicate end of current frame */ retrace::profiler.addFrameEnd(); } retrace::frameComplete(call); glretrace::Context *currentContext = glretrace::getCurrentContext(); if (!currentContext) { return; } glws::Drawable *currentDrawable = currentContext->drawable; assert(currentDrawable); if (retrace::debug && !currentDrawable->pbuffer && !currentDrawable->visible) { retrace::warning(call) << "could not infer drawable size (glViewport never called)\n"; } if (curMetricBackend) { curMetricBackend->beginQuery(QUERY_BOUNDARY_FRAME); } }
bool makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) { glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL; if (drawable == currentDrawable && context == currentContext) { return true; } if (currentContext) { glFlush(); if (!retrace::doubleBuffer) { frame_complete(call); } } flushQueries(); bool success = glws::makeCurrent(drawable, context ? context->wsContext : NULL); if (!success) { std::cerr << "error: failed to make current OpenGL context and drawable\n"; exit(1); return false; } if (currentContext) { currentContext->drawable = NULL; } if (drawable && context) { currentContext = context; currentContext->drawable = drawable; if (!context->used) { initContext(); context->used = true; } } else { currentContext = NULL; } return true; }
void frame_complete(trace::Call &call) { if (retrace::profiling) { /* Complete any remaining queries */ flushQueries(); /* Indicate end of current frame */ retrace::profiler.addFrameEnd(); } retrace::frameComplete(call); glretrace::Context *currentContext = glretrace::getCurrentContext(); if (!currentContext) { return; } assert(currentContext->drawable); if (retrace::debug && !currentContext->drawable->visible) { retrace::warning(call) << "could not infer drawable size (glViewport never called)\n"; } }
void frame_complete(trace::Call &call) { if (retrace::profiling) { /* Complete any remaining queries */ flushQueries(); /* GPU time drifts due to being relative times, not absolute and can be * affected by the gpu switch between processes. * * To attempt to compensate we resynchronise on frame end however there is * still noticeable drift within a single frame which we do not account for. */ if (retrace::profilingCpuTimes || retrace::profilingGpuTimes) { int64_t cpuTime, gpuTime, error; getCurrentTimes(cpuTime, gpuTime); cpuTime = cpuTime - retrace::profiler.getBaseCpuTime(); gpuTime = gpuTime - retrace::profiler.getBaseGpuTime(); error = gpuTime - cpuTime * (1.0E9 / os::timeFrequency); retrace::profiler.setBaseGpuTime(retrace::profiler.getBaseGpuTime() + error); } /* Indicate end of current frame */ retrace::profiler.addFrameEnd(); } retrace::frameComplete(call); if (!currentDrawable) { return; } if (retrace::debug && !currentDrawable->visible) { retrace::warning(call) << "could not infer drawable size (glViewport never called)\n"; } }