("glGet", X, 1, "GL_SLICE_ACCUM_SUN"), # 0x85CC
("glGet", X, 1, "GL_QUAD_MESH_SUN"), # 0x8614
("glGet", X, 1, "GL_TRIANGLE_MESH_SUN"), # 0x8615
- ("glGet", X, 1, "GL_VERTEX_PROGRAM_ARB"), # 0x8620
+ ("glGet", B, 1, "GL_VERTEX_PROGRAM_ARB"), # 0x8620
("glGet", X, 1, "GL_VERTEX_STATE_PROGRAM_NV"), # 0x8621
("glGetVertexAttrib", B, 1, "GL_VERTEX_ATTRIB_ARRAY_ENABLED"), # 0x8622
("glGetVertexAttrib", I, 1, "GL_VERTEX_ATTRIB_ARRAY_SIZE"), # 0x8623
("glGet", X, 1, "GL_INVERSE_NV"), # 0x862B
("glGet", X, 1, "GL_TRANSPOSE_NV"), # 0x862C
("glGet", X, 1, "GL_INVERSE_TRANSPOSE_NV"), # 0x862D
- ("glGet", X, 1, "GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB"), # 0x862E
- ("glGet", X, 1, "GL_MAX_PROGRAM_MATRICES_ARB"), # 0x862F
+ ("glGet", I, 1, "GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB"), # 0x862E
+ ("glGet", I, 1, "GL_MAX_PROGRAM_MATRICES_ARB"), # 0x862F
("glGet", X, 1, "GL_MATRIX0_NV"), # 0x8630
("glGet", X, 1, "GL_MATRIX1_NV"), # 0x8631
("glGet", X, 1, "GL_MATRIX2_NV"), # 0x8632
("glGet", X, 1, "GL_MATRIX7_NV"), # 0x8637
("glGet", X, 1, "GL_CURRENT_MATRIX_STACK_DEPTH_ARB"), # 0x8640
("glGet", X, 1, "GL_CURRENT_MATRIX_ARB"), # 0x8641
- ("glGet", X, 1, "GL_VERTEX_PROGRAM_POINT_SIZE"), # 0x8642
- ("glGet", X, 1, "GL_VERTEX_PROGRAM_TWO_SIDE"), # 0x8643
+ ("glGet", B, 1, "GL_VERTEX_PROGRAM_POINT_SIZE"), # 0x8642
+ ("glGet", B, 1, "GL_VERTEX_PROGRAM_TWO_SIDE"), # 0x8643
("glGet", X, 1, "GL_PROGRAM_PARAMETER_NV"), # 0x8644
("glGetVertexAttrib", P, 1, "GL_VERTEX_ATTRIB_ARRAY_POINTER"), # 0x8645
("glGet", X, 1, "GL_PROGRAM_TARGET_NV"), # 0x8646
("glGet", I, 1, "GL_MAX_TEXTURE_COORDS"), # 0x8871
("glGet", I, 1, "GL_MAX_TEXTURE_IMAGE_UNITS"), # 0x8872
("glGet", I, 1, "GL_FRAGMENT_PROGRAM_BINDING_NV"), # 0x8873
- ("glGet", X, 1, "GL_PROGRAM_ERROR_STRING_ARB"), # 0x8874
+ ("glGet", S, 1, "GL_PROGRAM_ERROR_STRING_ARB"), # 0x8874
("glGet", X, 1, "GL_PROGRAM_FORMAT_ASCII_ARB"), # 0x8875
("glGet", X, 1, "GL_PROGRAM_FORMAT_ARB"), # 0x8876
("glGet", X, 1, "GL_WRITE_PIXEL_DATA_RANGE_NV"), # 0x8878
print '#include "json.hpp"'
print '#include "glimports.hpp"'
print '#include "glproc.hpp"'
+ print '#include "glsize.hpp"'
print '#include "glretrace.hpp"'
print
glGetTexImage(target, level, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
- json.writeStringMember("__encoding__", "base64");
json.beginMember("__data__");
json.writeBase64(pixels, depth * width * height * 4 * sizeof *pixels);
json.endMember(); // __data__
}
static inline void
-writeDrawBufferImage(JSONWriter &json)
+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 {
// texture internal format
json.writeStringMember("__type__", "uint8");
json.writeBoolMember("__normalized__", true);
- json.writeNumberMember("__channels__", 4);
-
- GLubyte *pixels = new GLubyte[width*height*4];
+ 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);
- glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+
+ 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.writeStringMember("__encoding__", "base64");
json.beginMember("__data__");
- json.writeBase64(pixels, width * height * 4 * sizeof *pixels);
+ json.writeBase64(pixels, width * height * channels * sizeof *pixels);
json.endMember(); // __data__
delete [] pixels;
def dump_framebuffer(self):
print ' json.beginMember("framebuffer");'
print ' json.beginObject();'
- print ' json.beginMember("GL_DRAW_BUFFER");'
- # TODO: Handle FBOs
- print ' writeDrawBufferImage(json);'
+ # TODO: Handle real FBOs
+ print
+ print ' json.beginMember("GL_RGBA");'
+ print ' writeDrawBufferImage(json, GL_RGBA);'
print ' json.endMember();'
+ print
+ print ' GLint depth_bits = 0;'
+ print ' glGetIntegerv(GL_DEPTH_BITS, &depth_bits);'
+ print ' if (depth_bits) {'
+ print ' json.beginMember("GL_DEPTH_COMPONENT");'
+ print ' writeDrawBufferImage(json, GL_DEPTH_COMPONENT);'
+ print ' json.endMember();'
+ print ' }'
+ print
+ print ' GLint stencil_bits = 0;'
+ print ' glGetIntegerv(GL_STENCIL_BITS, &stencil_bits);'
+ print ' if (stencil_bits) {'
+ print ' json.beginMember("GL_STENCIL_INDEX");'
+ print ' writeDrawBufferImage(json, GL_STENCIL_INDEX);'
+ print ' json.endMember();'
+ print ' }'
+ print
print ' json.endObject();'
print ' json.endMember(); // framebuffer'
pass