extern unsigned dump_state;
 
 void
-checkGlError(int callIdx = -1);
+checkGlError(const Trace::Call &call);
 
 void retrace_call_glx(Trace::Call &call);
 void retrace_call_wgl(Trace::Call &call);
 
             print '    glretrace::insideGlBeginEnd = true;'
         elif function.name.startswith('gl'):
             # glGetError is not allowed inside glBegin/glEnd
-            print '    glretrace::checkGlError(call.no);'
+            print '    glretrace::checkGlError(call);'
 
         if function.name == 'glFlush':
             print '    if (!glretrace::double_buffer) {'
 
 unsigned dump_state = ~0;
 
 void
-checkGlError(int callIdx) {
+checkGlError(const Trace::Call &call) {
     if (benchmark || insideGlBeginEnd) {
         return;
     }
         return;
     }
 
-    if (callIdx >= 0) {
-        std::cerr << callIdx << ": ";
-    }
+    std::cerr << call.no << ": ";
+    std::cerr << "warning: glGetError(";
+    std::cerr << call.name();
+    std::cerr << ") = ";
 
-    std::cerr << "warning: glGetError() = ";
     switch (error) {
     case GL_INVALID_ENUM:
         std::cerr << "GL_INVALID_ENUM";
     glGetIntegerv(GL_READ_BUFFER, &readbuffer);
     glReadBuffer(drawbuffer);
     glReadPixels(0, 0, image.width, image.height, GL_RGBA, GL_UNSIGNED_BYTE, image.pixels);
-    checkGlError();
     glReadBuffer(readbuffer);
 }