]> git.cworth.org Git - apitrace/blobdiff - glstate.py
Use the process ID as process name when /proc/self/exe can't be read.
[apitrace] / glstate.py
index 40431ca99c243b360ad7f9e545b985ae8dd51b52..38084151979f6ad62aaed2381efc687b1738cfaa 100644 (file)
@@ -38,7 +38,7 @@ texture_targets = [
     ('GL_TEXTURE_2D', 'GL_TEXTURE_BINDING_2D'),
     ('GL_TEXTURE_3D', 'GL_TEXTURE_BINDING_3D'),
     ('GL_TEXTURE_RECTANGLE', 'GL_TEXTURE_BINDING_RECTANGLE'),
-    #(GL_TEXTURE_CUBE_MAP, 'GL_TEXTURE_BINDING_CUBE_MAP')
+    ('GL_TEXTURE_CUBE_MAP', 'GL_TEXTURE_BINDING_CUBE_MAP')
 ]
 
 
@@ -172,6 +172,8 @@ glGetVertexAttrib = StateGetter('glGetVertexAttrib', {I: 'iv', F: 'fv', D: 'dv',
 glGetTexParameter = StateGetter('glGetTexParameter', {I: 'iv', F: 'fv'})
 glGetTexEnv = StateGetter('glGetTexEnv', {I: 'iv', F: 'fv'})
 glGetTexLevelParameter = StateGetter('glGetTexLevelParameter', {I: 'iv', F: 'fv'})
+glGetShader = StateGetter('glGetShaderiv', {I: 'iv'})
+glGetProgram = StateGetter('glGetProgram', {I: 'iv'})
 glGetProgramARB = StateGetter('glGetProgram', {I: 'iv', F: 'fv', S: 'Stringv'}, 'ARB')
 
 
@@ -195,7 +197,7 @@ class JsonWriter(Visitor):
 
     def visit_enum(self, enum, instance):
         if enum.expr == 'GLenum':
-            print '    writeEnum(json, %s);' % instance
+            print '    dumpEnum(json, %s);' % instance
         else:
             print '    json.writeNumber(%s);' % instance
 
@@ -230,19 +232,17 @@ class StateDumper:
 
     def dump(self):
         print '#include <string.h>'
-        print '#include <iostream>'
-        print '#include <algorithm>'
         print
-        print '#include "image.hpp"'
         print '#include "json.hpp"'
-        print '#include "glimports.hpp"'
         print '#include "glproc.hpp"'
         print '#include "glsize.hpp"'
-        print '#include "glretrace.hpp"'
+        print '#include "glstate.hpp"'
+        print
+        print 'namespace glstate {'
         print
 
-        print 'static const char *'
-        print '_enum_string(GLenum pname)'
+        print 'const char *'
+        print 'enumToString(GLenum pname)'
         print '{'
         print '    switch(pname) {'
         for name in GLenum.values:
@@ -254,24 +254,10 @@ class StateDumper:
         print '}'
         print
 
-        print 'static const char *'
-        print 'enum_string(GLenum pname)'
-        print '{'
-        print '    const char *s = _enum_string(pname);'
-        print '    if (s) {'
-        print '        return s;'
-        print '    } else {'
-        print '        static char buf[16];'
-        print '        snprintf(buf, sizeof buf, "0x%04x", pname);'
-        print '        return buf;'
-        print '    }'
-        print '}'
-        print
-
-        print 'static inline void'
-        print 'writeEnum(JSONWriter &json, GLenum pname)'
+        print 'void'
+        print 'dumpEnum(JSONWriter &json, GLenum pname)'
         print '{'
-        print '    const char *s = _enum_string(pname);'
+        print '    const char *s = enumToString(pname);'
         print '    if (s) {'
         print '        json.writeString(s);'
         print '    } else {'
@@ -280,387 +266,8 @@ class StateDumper:
         print '}'
         print
 
-        # shaders
-        print '''
-static void
-writeShader(JSONWriter &json, GLuint shader)
-{
-    if (!shader) {
-        return;
-    }
-
-    GLint shader_type = 0;
-    glGetShaderiv(shader, GL_SHADER_TYPE, &shader_type);
-    if (!shader_type) {
-        return;
-    }
-
-    GLint source_length = 0;
-    glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &source_length);
-    if (!source_length) {
-        return;
-    }
-
-    GLchar *source = new GLchar[source_length];
-    GLsizei length = 0;
-    source[0] = 0;
-    glGetShaderSource(shader, source_length, &length, source);
-
-    json.beginMember(enum_string(shader_type));
-    json.writeString(source);
-    json.endMember();
-
-    delete [] source;
-}
-
-static inline void
-writeCurrentProgram(JSONWriter &json)
-{
-    GLint program = 0;
-    glGetIntegerv(GL_CURRENT_PROGRAM, &program);
-    if (!program) {
-        return;
-    }
-
-    GLint attached_shaders = 0;
-    glGetProgramiv(program, GL_ATTACHED_SHADERS, &attached_shaders);
-    if (!attached_shaders) {
-        return;
-    }
-
-    GLuint *shaders = new GLuint[attached_shaders];
-    GLsizei count = 0;
-    glGetAttachedShaders(program, attached_shaders, &count, shaders);
-    for (GLsizei i = 0; i < count; ++ i) {
-       writeShader(json, shaders[i]);
-    }
-    delete [] shaders;
-}
-
-static inline void
-writeArbProgram(JSONWriter &json, GLenum target)
-{
-    if (!glIsEnabled(target)) {
-        return;
-    }
-
-    GLint program_length = 0;
-    glGetProgramivARB(target, GL_PROGRAM_LENGTH_ARB, &program_length);
-    if (!program_length) {
-        return;
-    }
-
-    GLchar *source = new GLchar[program_length + 1];
-    source[0] = 0;
-    glGetProgramStringARB(target, GL_PROGRAM_STRING_ARB, source);
-    source[program_length] = 0;
-
-    json.beginMember(enum_string(target));
-    json.writeString(source);
-    json.endMember();
-
-    delete [] source;
-}
-'''
-
-        # texture image
-        print '''
-static inline void
-writeTextureImage(JSONWriter &json, GLenum target, GLint level)
-{
-    GLint width, height = 1, depth = 1;
-
-    width = 0;
-    glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width);
-
-    if (target != GL_TEXTURE_1D) {
-        height = 0;
-        glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height);
-        if (target == GL_TEXTURE_3D) {
-            depth = 0;
-            glGetTexLevelParameteriv(target, level, GL_TEXTURE_DEPTH, &depth);
-        }
-    }
-
-    if (width <= 0 || height <= 0 || depth <= 0) {
-        json.writeNull();
-    } else {
-        json.beginObject();
-
-        // Tell the GUI this is no ordinary object, but an image
-        json.writeStringMember("__class__", "image");
-
-        json.writeNumberMember("__width__", width);
-        json.writeNumberMember("__height__", height);
-        json.writeNumberMember("__depth__", depth);
-
-        // Hardcoded for now, but we could chose types more adequate to the
-        // texture internal format
-        json.writeStringMember("__type__", "uint8");
-        json.writeBoolMember("__normalized__", true);
-        json.writeNumberMember("__channels__", 4);
-        
-        GLubyte *pixels = new GLubyte[depth*width*height*4];
-        
-        glGetTexImage(target, level, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
-
-        json.beginMember("__data__");
-        char *pngBuffer;
-        int pngBufferSize;
-        Image::writePixelsToBuffer(pixels, width, height, 4, false, &pngBuffer, &pngBufferSize);
-        json.writeBase64(pngBuffer, pngBufferSize);
-        free(pngBuffer);
-        json.endMember(); // __data__
-
-        delete [] pixels;
-        json.endObject();
-    }
-}
-
-static inline void
-writeDrawBufferImage(JSONWriter &json, GLenum format)
-{
-    GLint width  = glretrace::window_width;
-    GLint height = glretrace::window_height;
-
-    GLint channels = __gl_format_channels(format);
-
-    if (!width || !height) {
-        json.writeNull();
-    } else {
-        json.beginObject();
-
-        // Tell the GUI this is no ordinary object, but an image
-        json.writeStringMember("__class__", "image");
-
-        json.writeNumberMember("__width__", width);
-        json.writeNumberMember("__height__", height);
-        json.writeNumberMember("__depth__", 1);
-
-        // Hardcoded for now, but we could chose types more adequate to the
-        // texture internal format
-        json.writeStringMember("__type__", "uint8");
-        json.writeBoolMember("__normalized__", true);
-        json.writeNumberMember("__channels__", channels);
-
-        GLubyte *pixels = new GLubyte[width*height*channels];
-        
-        GLint drawbuffer = glretrace::double_buffer ? GL_BACK : GL_FRONT;
-        GLint readbuffer = glretrace::double_buffer ? GL_BACK : GL_FRONT;
-        glGetIntegerv(GL_DRAW_BUFFER, &drawbuffer);
-        glGetIntegerv(GL_READ_BUFFER, &readbuffer);
-        glReadBuffer(drawbuffer);
-
-        glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
-        glPixelStorei(GL_PACK_ALIGNMENT, 1);
-
-        glReadPixels(0, 0, width, height, format, GL_UNSIGNED_BYTE, pixels);
-
-        glPopClientAttrib();
-        glReadBuffer(readbuffer);
-
-        json.beginMember("__data__");
-        char *pngBuffer;
-        int pngBufferSize;
-        Image::writePixelsToBuffer(pixels, width, height, channels, false, &pngBuffer, &pngBufferSize);
-        //std::cerr <<" Before = "<<(width * height * channels * sizeof *pixels)
-        //          <<", after = "<<pngBufferSize << ", ratio = " << double(width * height * channels * sizeof *pixels)/pngBufferSize;
-        json.writeBase64(pngBuffer, pngBufferSize);
-        free(pngBuffer);
-        json.endMember(); // __data__
-
-        delete [] pixels;
-        json.endObject();
-    }
-}
-
-static inline GLuint
-downsampledFramebuffer(GLuint oldFbo, GLint drawbuffer,
-                       GLint colorRb, GLint depthRb, GLint stencilRb,
-                       GLuint *rbs, GLint *numRbs)
-{
-    GLuint fbo;
-    GLint format;
-    GLint w, h;
-
-    *numRbs = 0;
-
-    glGenFramebuffers(1, &fbo);
-    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-
-    glBindRenderbuffer(GL_RENDERBUFFER, colorRb);
-    glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                 GL_RENDERBUFFER_WIDTH, &w);
-    glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                 GL_RENDERBUFFER_HEIGHT, &h);
-    glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                 GL_RENDERBUFFER_INTERNAL_FORMAT, &format);
-
-    glGenRenderbuffers(1, &rbs[*numRbs]);
-    glBindRenderbuffer(GL_RENDERBUFFER, rbs[*numRbs]);
-    glRenderbufferStorage(GL_RENDERBUFFER, format, w, h);
-    glFramebufferRenderbuffer(GL_FRAMEBUFFER, drawbuffer,
-                              GL_RENDERBUFFER, rbs[*numRbs]);
-
-    glBindFramebuffer(GL_READ_FRAMEBUFFER, oldFbo);
-    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
-    glDrawBuffer(drawbuffer);
-    glReadBuffer(drawbuffer);
-    glBlitFramebuffer(0, 0, w, h, 0, 0, w, h,
-                      GL_COLOR_BUFFER_BIT, GL_NEAREST);
-    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-    ++*numRbs;
-
-    if (stencilRb == depthRb && stencilRb) {
-        //combined depth and stencil buffer
-        glBindRenderbuffer(GL_RENDERBUFFER, depthRb);
-        glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                     GL_RENDERBUFFER_WIDTH, &w);
-        glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                     GL_RENDERBUFFER_HEIGHT, &h);
-        glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                     GL_RENDERBUFFER_INTERNAL_FORMAT, &format);
-
-        glGenRenderbuffers(1, &rbs[*numRbs]);
-        glBindRenderbuffer(GL_RENDERBUFFER, rbs[*numRbs]);
-        glRenderbufferStorage(GL_RENDERBUFFER, format, w, h);
-        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
-                                  GL_RENDERBUFFER, rbs[*numRbs]);
-        glBindFramebuffer(GL_READ_FRAMEBUFFER, oldFbo);
-        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
-        glBlitFramebuffer(0, 0, w, h, 0, 0, w, h,
-                          GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
-        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-        ++*numRbs;
-    } else {
-        if (depthRb) {
-            glBindRenderbuffer(GL_RENDERBUFFER, depthRb);
-            glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                         GL_RENDERBUFFER_WIDTH, &w);
-            glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                         GL_RENDERBUFFER_HEIGHT, &h);
-            glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                         GL_RENDERBUFFER_INTERNAL_FORMAT, &format);
-
-            glGenRenderbuffers(1, &rbs[*numRbs]);
-            glBindRenderbuffer(GL_RENDERBUFFER, rbs[*numRbs]);
-            glRenderbufferStorage(GL_RENDERBUFFER, format, w, h);
-            glFramebufferRenderbuffer(GL_FRAMEBUFFER,
-                                      GL_DEPTH_ATTACHMENT,
-                                      GL_RENDERBUFFER, rbs[*numRbs]);
-            glBindFramebuffer(GL_READ_FRAMEBUFFER, oldFbo);
-            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
-            glDrawBuffer(GL_DEPTH_ATTACHMENT);
-            glReadBuffer(GL_DEPTH_ATTACHMENT);
-            glBlitFramebuffer(0, 0, w, h, 0, 0, w, h,
-                              GL_DEPTH_BUFFER_BIT, GL_NEAREST);
-            ++*numRbs;
-        }
-        if (stencilRb) {
-            glBindRenderbuffer(GL_RENDERBUFFER, stencilRb);
-            glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                         GL_RENDERBUFFER_WIDTH, &w);
-            glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                         GL_RENDERBUFFER_HEIGHT, &h);
-            glGetRenderbufferParameteriv(GL_RENDERBUFFER,
-                                     GL_RENDERBUFFER_INTERNAL_FORMAT, &format);
-
-            glGenRenderbuffers(1, &rbs[*numRbs]);
-            glBindRenderbuffer(GL_RENDERBUFFER, rbs[*numRbs]);
-            glRenderbufferStorage(GL_RENDERBUFFER, format, w, h);
-            glFramebufferRenderbuffer(GL_FRAMEBUFFER,
-                                      GL_STENCIL_ATTACHMENT,
-                                      GL_RENDERBUFFER, rbs[*numRbs]);
-            glBindFramebuffer(GL_READ_FRAMEBUFFER, oldFbo);
-            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
-            glDrawBuffer(GL_STENCIL_ATTACHMENT);
-            glReadBuffer(GL_STENCIL_ATTACHMENT);
-            glBlitFramebuffer(0, 0, w, h, 0, 0, w, h,
-                              GL_STENCIL_BUFFER_BIT, GL_NEAREST);
-            ++*numRbs;
-        }
-    }
-
-    return fbo;
-}
-
-static void
-writeDrawBuffers(JSONWriter &json, GLboolean writeDepth, GLboolean writeStencil)
-{
-    json.beginMember("GL_RGBA");
-    writeDrawBufferImage(json, GL_RGBA);
-    json.endMember();
-
-    if (writeDepth) {
-        json.beginMember("GL_DEPTH_COMPONENT");
-        writeDrawBufferImage(json, GL_DEPTH_COMPONENT);
-        json.endMember();
-    }
-
-    if (writeStencil) {
-        json.beginMember("GL_STENCIL_INDEX");
-        writeDrawBufferImage(json, GL_STENCIL_INDEX);
-        json.endMember();
-    }
-}
-
-'''
-
-        # textures
-        print 'static inline void'
-        print 'writeTexture(JSONWriter &json, GLenum target, GLenum binding)'
+        print 'void dumpParameters(JSONWriter &json)'
         print '{'
-        print '    GLint texture = 0;'
-        print '    glGetIntegerv(binding, &texture);'
-        print '    if (!glIsEnabled(target) && !texture) {'
-        print '        json.writeNull();'
-        print '        return;'
-        print '    }'
-        print
-        print '    json.beginObject();'
-        print '    json.beginMember("levels");'
-        print '    json.beginArray();'
-        print '    GLint level = 0;'
-        print '    do {'
-        print '        GLint width = 0, height = 0;'
-        print '        glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width);'
-        print '        glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height);'
-        print '        if (!width || !height) {'
-        print '            break;'
-        print '        }'
-        print '        json.beginObject();'
-        print
-        # FIXME: This is not the original texture name in the trace -- we need
-        # to do a reverse lookup of the texture mappings to find the original one
-        print '        json.beginMember("binding");'
-        print '        json.writeNumber(texture);'
-        print '        json.endMember();'
-        print
-        print '        json.beginMember("image");'
-        print '        writeTextureImage(json, target, level);'
-        print '        json.endMember();'
-        print
-        print '        json.endObject();'
-        print '        ++level;'
-        print '    } while(true);'
-        print '    json.endArray();'
-        print '    json.endMember(); // levels'
-        print
-        print '    json.endObject();'
-        print '}'
-        print
-
-        print 'void glretrace::state_dump(std::ostream &os)'
-        print '{'
-        print '    JSONWriter json(os);'
-        self.dump_parameters()
-        self.dump_current_program()
-        self.dump_textures()
-        self.dump_framebuffer()
-        print '}'
-        print
-
-    def dump_parameters(self):
         print '    json.beginMember("parameters");'
         print '    json.beginObject();'
         
@@ -675,7 +282,10 @@ writeDrawBuffers(JSONWriter &json, GLboolean writeDepth, GLboolean writeStencil)
 
         print '    json.endObject();'
         print '    json.endMember(); // parameters'
+        print '}'
         print
+        
+        print '} /*namespace glstate */'
 
     def dump_material_params(self):
         for face in ['GL_FRONT', 'GL_BACK']:
@@ -780,117 +390,6 @@ writeDrawBuffers(JSONWriter &json, GLboolean writeDepth, GLboolean writeStencil)
         print '    }'
         print
 
-    def dump_current_program(self):
-        print '    json.beginMember("shaders");'
-        print '    json.beginObject();'
-        print '    writeCurrentProgram(json);'
-        for target in self.program_targets:
-            print '    writeArbProgram(json, %s);' % target
-        print '    json.endObject();'
-        print '    json.endMember(); //shaders'
-        print
-
-    def dump_textures(self):
-        print '    {'
-        print '        json.beginMember("textures");'
-        print '        json.beginArray();'
-        print '        GLint active_texture = GL_TEXTURE0;'
-        print '        glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);'
-        print '        GLint max_texture_coords = 0;'
-        print '        glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_texture_coords);'
-        print '        GLint max_combined_texture_image_units = 0;'
-        print '        glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_combined_texture_image_units);'
-        print '        GLint max_units = std::max(max_combined_texture_image_units, max_texture_coords);'
-        print '        for (GLint unit = 0; unit < max_units; ++unit) {'
-        print '            glActiveTexture(GL_TEXTURE0 + unit);'
-        print '            json.beginObject();'
-        for target, binding in texture_targets:
-            print '            json.beginMember("%s");' % target
-            print '            writeTexture(json, %s, %s);' % (target, binding)
-            print '            json.endMember();'
-        print '            json.endObject();'
-        print '        }'
-        print '        glActiveTexture(active_texture);'
-        print '        json.endArray();'
-        print '        json.endMember(); // texture'
-        print '    }'
-        print
-
-    def dump_framebuffer(self):
-        print '    json.beginMember("framebuffer");'
-        print '    json.beginObject();'
-        # TODO: Handle real FBOs
-        print
-        print '    GLint boundDrawFbo = 0, boundReadFbo = 0;'
-        print '    glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundDrawFbo);'
-        print '    glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &boundReadFbo);'
-        print '    if (!boundDrawFbo) {'
-        print '        GLint depth_bits = 0;'
-        print '        glGetIntegerv(GL_DEPTH_BITS, &depth_bits);'
-        print '        GLint stencil_bits = 0;'
-        print '        glGetIntegerv(GL_STENCIL_BITS, &stencil_bits);'
-        print '        writeDrawBuffers(json, depth_bits, stencil_bits);'
-        print '    } else {'
-        print '        GLint colorRb, stencilRb, depthRb;'
-        print '        GLint boundRb;'
-        print '        glGetIntegerv(GL_RENDERBUFFER_BINDING, &boundRb);'
-        print '        GLint drawbuffer = glretrace::double_buffer ? GL_BACK : GL_FRONT;'
-        print '        glGetIntegerv(GL_DRAW_BUFFER, &drawbuffer);'
-        print
-        print '        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,'
-        print '                                              drawbuffer,'
-        print '                                              GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,'
-        print '                                              &colorRb);'
-        print '        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,'
-        print '                                              GL_DEPTH_ATTACHMENT,'
-        print '                                              GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,'
-        print '                                              &depthRb);'
-        print '        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,'
-        print '                                              GL_STENCIL_ATTACHMENT,'
-        print '                                              GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,'
-        print '                                              &stencilRb);'
-        print
-        print '        GLint colorSamples, depthSamples, stencilSamples;'
-        print '        GLuint rbs[3];'
-        print '        GLint numRbs = 0;'
-        print '        GLuint fboCopy = 0;'
-        print '        glBindRenderbuffer(GL_RENDERBUFFER, colorRb);'
-        print '        glGetRenderbufferParameteriv(GL_RENDERBUFFER,'
-        print '                                     GL_RENDERBUFFER_SAMPLES, &colorSamples);'
-        print '        glBindRenderbuffer(GL_RENDERBUFFER, depthRb);'
-        print '        glGetRenderbufferParameteriv(GL_RENDERBUFFER,'
-        print '                                     GL_RENDERBUFFER_SAMPLES, &depthSamples);'
-        print '        glBindRenderbuffer(GL_RENDERBUFFER, stencilRb);'
-        print '        glGetRenderbufferParameteriv(GL_RENDERBUFFER,'
-        print '                                     GL_RENDERBUFFER_SAMPLES, &stencilSamples);'
-        print '        glBindRenderbuffer(GL_RENDERBUFFER, boundRb);'
-        print
-        print '        if (colorSamples || depthSamples || stencilSamples) {'
-        print '            //glReadPixels doesnt support multisampled buffers so we need'
-        print '            // to blit the fbo to a temporary one'
-        print '            fboCopy = downsampledFramebuffer(boundDrawFbo, drawbuffer,'
-        print '                                             colorRb, depthRb, stencilRb,'
-        print '                                             rbs, &numRbs);'
-        print '        }'
-        print '        glDrawBuffer(drawbuffer);'
-        print '        glReadBuffer(drawbuffer);'
-        print
-        print '        writeDrawBuffers(json, depthRb, stencilRb);'
-        print
-        print '        if (fboCopy) {'
-        print '            glBindFramebuffer(GL_FRAMEBUFFER, boundDrawFbo);'
-        print '            glBindFramebuffer(GL_READ_FRAMEBUFFER, boundReadFbo);'
-        print '            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, boundDrawFbo);'
-        print '            glBindRenderbuffer(GL_RENDERBUFFER_BINDING, boundRb);'
-        print '            glDeleteRenderbuffers(numRbs, rbs);'
-        print '            glDeleteFramebuffers(1, &fboCopy);'
-        print '        }'
-        print '    }'
-        print
-        print '    json.endObject();'
-        print '    json.endMember(); // framebuffer'
-        pass
-
     def dump_atoms(self, getter, *args):
         for function, type, count, name in parameters:
             inflection = getter.inflector.radical + getter.suffix