void
checkGlError(trace::Call &call) {
GLenum error = glGetError();
- if (error == GL_NO_ERROR) {
- return;
- }
-
- std::ostream & os = retrace::warning(call);
-
- os << "glGetError(";
- os << call.name();
- os << ") = ";
-
- switch (error) {
- case GL_INVALID_ENUM:
- os << "GL_INVALID_ENUM";
- break;
- case GL_INVALID_VALUE:
- os << "GL_INVALID_VALUE";
- break;
- case GL_INVALID_OPERATION:
- os << "GL_INVALID_OPERATION";
- break;
- case GL_STACK_OVERFLOW:
- os << "GL_STACK_OVERFLOW";
- break;
- case GL_STACK_UNDERFLOW:
- os << "GL_STACK_UNDERFLOW";
- break;
- case GL_OUT_OF_MEMORY:
- os << "GL_OUT_OF_MEMORY";
- break;
- case GL_INVALID_FRAMEBUFFER_OPERATION:
- os << "GL_INVALID_FRAMEBUFFER_OPERATION";
- break;
- case GL_TABLE_TOO_LARGE:
- os << "GL_TABLE_TOO_LARGE";
- break;
- default:
- os << error;
- break;
+ while (error != GL_NO_ERROR) {
+ std::ostream & os = retrace::warning(call);
+
+ os << "glGetError(";
+ os << call.name();
+ os << ") = ";
+
+ switch (error) {
+ case GL_INVALID_ENUM:
+ os << "GL_INVALID_ENUM";
+ break;
+ case GL_INVALID_VALUE:
+ os << "GL_INVALID_VALUE";
+ break;
+ case GL_INVALID_OPERATION:
+ os << "GL_INVALID_OPERATION";
+ break;
+ case GL_STACK_OVERFLOW:
+ os << "GL_STACK_OVERFLOW";
+ break;
+ case GL_STACK_UNDERFLOW:
+ os << "GL_STACK_UNDERFLOW";
+ break;
+ case GL_OUT_OF_MEMORY:
+ os << "GL_OUT_OF_MEMORY";
+ break;
+ case GL_INVALID_FRAMEBUFFER_OPERATION:
+ os << "GL_INVALID_FRAMEBUFFER_OPERATION";
+ break;
+ case GL_TABLE_TOO_LARGE:
+ os << "GL_TABLE_TOO_LARGE";
+ break;
+ default:
+ os << error;
+ break;
+ }
+ os << "\n";
+
+ error = glGetError();
}
- os << "\n";
}
static void
void
initContext() {
- const char* extensions = (const char*)glGetString(GL_EXTENSIONS);
-
/* Ensure we have adequate extension support */
- supportsTimestamp = glws::checkExtension("GL_ARB_timer_query", extensions);
- supportsElapsed = glws::checkExtension("GL_EXT_timer_query", extensions) || supportsTimestamp;
- supportsOcclusion = glws::checkExtension("GL_ARB_occlusion_query", extensions);
- supportsDebugOutput = glws::checkExtension("GL_ARB_debug_output", extensions);
+ assert(currentContext);
+ supportsTimestamp = currentContext->hasExtension("GL_ARB_timer_query");
+ supportsElapsed = currentContext->hasExtension("GL_EXT_timer_query") || supportsTimestamp;
+ supportsOcclusion = currentContext->hasExtension("GL_ARB_occlusion_query");
+ supportsDebugOutput = currentContext->hasExtension("GL_ARB_debug_output");
/* Check for timer query support */
if (retrace::profilingGpuTimes) {
getCurrentTimes(cpuTime, gpuTime);
cpuTime = cpuTime - retrace::profiler.getBaseCpuTime();
gpuTime = gpuTime - retrace::profiler.getBaseGpuTime();
- error = gpuTime - cpuTime;
+ error = gpuTime - cpuTime * (1.0E9 / os::timeFrequency);
retrace::profiler.setBaseGpuTime(retrace::profiler.getBaseGpuTime() + error);
}
retrace::frameComplete(call);
- if (!currentDrawable) {
+ if (!currentContext) {
return;
}
- if (retrace::debug && !currentDrawable->visible) {
+ if (retrace::debug && !currentContext->drawable->visible) {
retrace::warning(call) << "could not infer drawable size (glViewport never called)\n";
}
}
image::Image *
retrace::getSnapshot(void) {
- if (!glretrace::currentDrawable) {
+ if (!glretrace::currentContext) {
return NULL;
}
retrace::dumpState(std::ostream &os)
{
if (glretrace::insideGlBeginEnd ||
- !glretrace::currentDrawable ||
!glretrace::currentContext) {
return false;
}
void
retrace::waitForInput(void) {
while (glws::processEvents()) {
+ os::sleep(100*1000);
}
}