]> git.cworth.org Git - apitrace/commitdiff
Basic dumping of draw buffer.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 10 Apr 2011 13:17:04 +0000 (14:17 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 10 Apr 2011 13:17:04 +0000 (14:17 +0100)
glretrace_main.cpp
glstate.py

index 1f3e594c0cbc96f75b072abeea525d71b84f2cc7..a2d2bdd75fdd47808f6577cd28d992dcec22f163 100644 (file)
@@ -103,7 +103,7 @@ checkGlError(void) {
 static void snapshot(Image::Image &image) {
     GLint drawbuffer = double_buffer ? GL_BACK : GL_FRONT;
     GLint readbuffer = double_buffer ? GL_BACK : GL_FRONT;
-    glGetIntegerv(GL_READ_BUFFER, &drawbuffer);
+    glGetIntegerv(GL_DRAW_BUFFER, &drawbuffer);
     glGetIntegerv(GL_READ_BUFFER, &readbuffer);
     glReadBuffer(drawbuffer);
     glReadPixels(0, 0, image.width, image.height, GL_RGBA, GL_UNSIGNED_BYTE, image.pixels);
index 74cdc64d580889c465e46ff6a16eea87f5c828b6..bf710d7c68e4b659d7ac5ab36105b069705a8fce 100644 (file)
@@ -3071,6 +3071,50 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level)
         json.endObject();
     }
 }
+
+static inline void
+writeDrawBufferImage(JSONWriter &json)
+{
+    GLint width  = glretrace::window_width;
+    GLint height = glretrace::window_height;
+
+    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__", "float");
+        json.writeNumberMember("__channels__", 4);
+        
+        float *pixels = new float[width*height*4];
+        
+        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);
+        glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+        glReadBuffer(readbuffer);
+
+        json.writeStringMember("__encoding__", "base64");
+        json.beginMember("__data__");
+        json.writeBase64(pixels, width * height * 4 * sizeof *pixels);
+        json.endMember(); // __data__
+
+        delete [] pixels;
+        json.endObject();
+    }
+}
+
 '''
 
         # textures
@@ -3132,6 +3176,7 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level)
         self.dump_parameters()
         self.dump_current_program()
         self.dump_textures()
+        self.dump_framebuffer()
         print '}'
         print
 
@@ -3224,6 +3269,17 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level)
         print '    json.endMember(); // texture'
         print
 
+    def dump_framebuffer(self):
+        print '    json.beginMember("framebuffer");'
+        print '    json.beginObject();'
+        print '    json.beginMember("GL_DRAW_BUFFER");'
+        # TODO: Handle FBOs
+        print '    writeDrawBufferImage(json);'
+        print '    json.endMember();'
+        print '    json.endObject();'
+        print '    json.endMember(); // framebuffer'
+        pass
+
     def write_line(s):
         self.write('  '*self.level + s + '\n')