print r' glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_position);'
print r' if (error_position != -1) {'
print r' const char *error_string = (const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB);'
- print r' std::cerr << call.no << ": warning: " << error_string << "\n";'
+ print r' retrace::warning(call) << error_string << "\n";'
print r' }'
if function.name == 'glCompileShader':
print r' GLint compile_status = 0;'
print r' glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length);'
print r' GLchar *infoLog = new GLchar[info_log_length];'
print r' glGetShaderInfoLog(shader, info_log_length, NULL, infoLog);'
- print r' std::cerr << call.no << ": warning: " << infoLog << "\n";'
+ print r' retrace::warning(call) << infoLog << "\n";'
print r' delete [] infoLog;'
print r' }'
if function.name == 'glLinkProgram':
print r' glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_length);'
print r' GLchar *infoLog = new GLchar[info_log_length];'
print r' glGetProgramInfoLog(program, info_log_length, NULL, infoLog);'
- print r' std::cerr << call.no << ": warning: " << infoLog << "\n";'
+ print r' retrace::warning(call) << infoLog << "\n";'
print r' delete [] infoLog;'
print r' }'
if function.name == 'glCompileShaderARB':
print r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);'
print r' GLchar *infoLog = new GLchar[info_log_length];'
print r' glGetInfoLogARB(shaderObj, info_log_length, NULL, infoLog);'
- print r' std::cerr << call.no << ": warning: " << infoLog << "\n";'
+ print r' retrace::warning(call) << infoLog << "\n";'
print r' delete [] infoLog;'
print r' }'
if function.name == 'glLinkProgramARB':
print r' glGetObjectParameterivARB(programObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);'
print r' GLchar *infoLog = new GLchar[info_log_length];'
print r' glGetInfoLogARB(programObj, info_log_length, NULL, infoLog);'
- print r' std::cerr << call.no << ": warning: " << infoLog << "\n";'
+ print r' retrace::warning(call) << infoLog << "\n";'
print r' delete [] infoLog;'
print r' }'
if function.name in ('glMapBuffer', 'glMapBufferARB', 'glMapBufferRange', 'glMapNamedBufferEXT', 'glMapNamedBufferRangeEXT'):
print r' if (!__result) {'
- print r' std::cerr << call.no << ": warning: failed to map buffer\n";'
+ print r' retrace::warning(call) << "failed to map buffer\n";'
print r' }'
if function.name in ('glGetAttribLocation', 'glGetAttribLocationARB'):
print r' GLint __orig_result = call.ret->toSInt();'
print r' if (__result != __orig_result) {'
- print r' std::cerr << call.no << ": warning: vertex attrib location mismatch " << __orig_result << " -> " << __result << "\n";'
+ print r' retrace::warning(call) << "vertex attrib location mismatch " << __orig_result << " -> " << __result << "\n";'
print r' }'
if function.name in ('glCheckFramebufferStatus', 'glCheckFramebufferStatusEXT', 'glCheckNamedFramebufferStatusEXT'):
print r' GLint __orig_result = call.ret->toSInt();'
print r' if (__orig_result == GL_FRAMEBUFFER_COMPLETE &&'
print r' __result != GL_FRAMEBUFFER_COMPLETE) {'
- print r' std::cerr << call.no << ": warning: incomplete framebuffer (" << glstate::enumToString(__result) << ")\n";'
+ print r' retrace::warning(call) << "incomplete framebuffer (" << glstate::enumToString(__result) << ")\n";'
print r' }'
print ' }'
return;
}
- if (retrace::verbosity == 0) {
- std::cout << call;
- std::cout.flush();
- }
+ std::ostream & os = retrace::warning(call);
- std::cerr << call.no << ": ";
- std::cerr << "warning: glGetError(";
- std::cerr << call.name();
- std::cerr << ") = ";
+ os << "glGetError(";
+ os << call.name();
+ os << ") = ";
switch (error) {
case GL_INVALID_ENUM:
- std::cerr << "GL_INVALID_ENUM";
+ os << "GL_INVALID_ENUM";
break;
case GL_INVALID_VALUE:
- std::cerr << "GL_INVALID_VALUE";
+ os << "GL_INVALID_VALUE";
break;
case GL_INVALID_OPERATION:
- std::cerr << "GL_INVALID_OPERATION";
+ os << "GL_INVALID_OPERATION";
break;
case GL_STACK_OVERFLOW:
- std::cerr << "GL_STACK_OVERFLOW";
+ os << "GL_STACK_OVERFLOW";
break;
case GL_STACK_UNDERFLOW:
- std::cerr << "GL_STACK_UNDERFLOW";
+ os << "GL_STACK_UNDERFLOW";
break;
case GL_OUT_OF_MEMORY:
- std::cerr << "GL_OUT_OF_MEMORY";
+ os << "GL_OUT_OF_MEMORY";
break;
case GL_INVALID_FRAMEBUFFER_OPERATION:
- std::cerr << "GL_INVALID_FRAMEBUFFER_OPERATION";
+ os << "GL_INVALID_FRAMEBUFFER_OPERATION";
break;
case GL_TABLE_TOO_LARGE:
- std::cerr << "GL_TABLE_TOO_LARGE";
+ os << "GL_TABLE_TOO_LARGE";
break;
default:
- std::cerr << error;
+ os << error;
break;
}
- std::cerr << "\n";
+ os << "\n";
}
/**
int verbosity = 0;
+static bool call_dumped = false;
+
+
+static void dumpCall(Trace::Call &call) {
+ if (verbosity >= 0 && !call_dumped) {
+ std::cout << call;
+ std::cout.flush();
+ call_dumped = true;
+ }
+}
+
+
+std::ostream &warning(Trace::Call &call) {
+ dumpCall(call);
+
+ std::cerr << call.no << ": ";
+ std::cerr << "warning: ";
+
+ return std::cerr;
+}
+
+
void ignore(Trace::Call &call) {
(void)call;
}
-static void unknown(Trace::Call &call) {
- if (verbosity >= 0) {
- std::cerr << call.no << ": warning: unknown call " << call.name() << "\n";
- }
+void unknown(Trace::Call &call) {
+ warning(call) << "unknown call " << call.name() << "\n";
}
inline void Retracer::addCallback(const Entry *entry) {
void Retracer::retrace(Trace::Call &call) {
+ call_dumped = false;
+
if (verbosity >= 1) {
- std::cout << call;
- std::cout.flush();
+ dumpCall(call);
}
Callback callback = 0;