("glGet", X, 1, "GL_LINEAR_MIPMAP_NEAREST"), # 0x2701
("glGet", X, 1, "GL_NEAREST_MIPMAP_LINEAR"), # 0x2702
("glGet", X, 1, "GL_LINEAR_MIPMAP_LINEAR"), # 0x2703
- ("glGet", X, 1, "GL_TEXTURE_MAG_FILTER"), # 0x2800
- ("glGet", X, 1, "GL_TEXTURE_MIN_FILTER"), # 0x2801
- ("glGet", X, 1, "GL_TEXTURE_WRAP_S"), # 0x2802
- ("glGet", X, 1, "GL_TEXTURE_WRAP_T"), # 0x2803
+ ("glGetTexParameter", E, 1, "GL_TEXTURE_MAG_FILTER"), # 0x2800
+ ("glGetTexParameter", E, 1, "GL_TEXTURE_MIN_FILTER"), # 0x2801
+ ("glGetTexParameter", E, 1, "GL_TEXTURE_WRAP_S"), # 0x2802
+ ("glGetTexParameter", E, 1, "GL_TEXTURE_WRAP_T"), # 0x2803
("glGet", X, 1, "GL_CLAMP"), # 0x2900
("glGet", X, 1, "GL_REPEAT"), # 0x2901
("glGet", F, 1, "GL_POLYGON_OFFSET_UNITS"), # 0x2A00
("glGet", X, 1, "GL_PROXY_TEXTURE_1D"), # 0x8063
("glGet", X, 1, "GL_PROXY_TEXTURE_2D"), # 0x8064
("glGet", X, 1, "GL_TEXTURE_TOO_LARGE_EXT"), # 0x8065
- ("glGet", X, 1, "GL_TEXTURE_PRIORITY"), # 0x8066
- ("glGet", X, 1, "GL_TEXTURE_RESIDENT"), # 0x8067
+ ("glGetTexParameter", I, 1, "GL_TEXTURE_PRIORITY"), # 0x8066
+ ("glGetTexParameter", B, 1, "GL_TEXTURE_RESIDENT"), # 0x8067
("glGet", I, 1, "GL_TEXTURE_BINDING_1D"), # 0x8068
("glGet", I, 1, "GL_TEXTURE_BINDING_2D"), # 0x8069
("glGet", I, 1, "GL_TEXTURE_BINDING_3D"), # 0x806A
("glGet", B, 1, "GL_TEXTURE_3D"), # 0x806F
("glGet", X, 1, "GL_PROXY_TEXTURE_3D"), # 0x8070
("glGetTexLevelParameter", I, 1, "GL_TEXTURE_DEPTH"), # 0x8071
- ("glGet", X, 1, "GL_TEXTURE_WRAP_R"), # 0x8072
+ ("glGetTexParameter", E, 1, "GL_TEXTURE_WRAP_R"), # 0x8072
("glGet", I, 1, "GL_MAX_3D_TEXTURE_SIZE"), # 0x8073
("glGet", B, 1, "GL_VERTEX_ARRAY"), # 0x8074
("glGet", B, 1, "GL_NORMAL_ARRAY"), # 0x8075
("glGet", X, 1, "GL_TEXTURE_WRAP_Q_SGIS"), # 0x8137
("glGet", I, 1, "GL_MAX_4D_TEXTURE_SIZE_SGIS"), # 0x8138
("glGet", I, 1, "GL_PIXEL_TEX_GEN_SGIX"), # 0x8139
- ("glGet", X, 1, "GL_TEXTURE_MIN_LOD"), # 0x813A
- ("glGet", X, 1, "GL_TEXTURE_MAX_LOD"), # 0x813B
- ("glGet", X, 1, "GL_TEXTURE_BASE_LEVEL"), # 0x813C
- ("glGet", X, 1, "GL_TEXTURE_MAX_LEVEL"), # 0x813D
+ ("glGetTexParameter", F, 1, "GL_TEXTURE_MIN_LOD"), # 0x813A
+ ("glGetTexParameter", F, 1, "GL_TEXTURE_MAX_LOD"), # 0x813B
+ ("glGetTexParameter", F, 1, "GL_TEXTURE_BASE_LEVEL"), # 0x813C
+ ("glGetTexParameter", F, 1, "GL_TEXTURE_MAX_LEVEL"), # 0x813D
("glGet", I, 1, "GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX"), # 0x813E
("glGet", I, 1, "GL_PIXEL_TILE_CACHE_INCREMENT_SGIX"), # 0x813F
("glGet", I, 1, "GL_PIXEL_TILE_WIDTH_SGIX"), # 0x8140
("glGet", X, 1, "GL_TEXTURE_LOD_BIAS_S_SGIX"), # 0x818E
("glGet", X, 1, "GL_TEXTURE_LOD_BIAS_T_SGIX"), # 0x818F
("glGet", X, 1, "GL_TEXTURE_LOD_BIAS_R_SGIX"), # 0x8190
- ("glGet", X, 1, "GL_GENERATE_MIPMAP"), # 0x8191
+ ("glGetTexParameter", B, 1, "GL_GENERATE_MIPMAP"), # 0x8191
("glGet", E, 1, "GL_GENERATE_MIPMAP_HINT"), # 0x8192
("glGet", X, 1, "GL_GEOMETRY_DEFORMATION_SGIX"), # 0x8194
("glGet", X, 1, "GL_TEXTURE_DEFORMATION_SGIX"), # 0x8195
("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", E, 1, "GL_MATRIX_INDEX_ARRAY_TYPE_ARB"), # 0x8847
("glGet", X, 1, "GL_MATRIX_INDEX_ARRAY_STRIDE_ARB"), # 0x8848
("glGet", X, 1, "GL_MATRIX_INDEX_ARRAY_POINTER_ARB"), # 0x8849
- ("glGet", X, 1, "GL_TEXTURE_DEPTH_SIZE"), # 0x884A
- ("glGet", X, 1, "GL_DEPTH_TEXTURE_MODE"), # 0x884B
- ("glGet", X, 1, "GL_TEXTURE_COMPARE_MODE"), # 0x884C
- ("glGet", X, 1, "GL_TEXTURE_COMPARE_FUNC"), # 0x884D
- ("glGet", X, 1, "GL_COMPARE_R_TO_TEXTURE"), # 0x884E
+ ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_DEPTH_SIZE"), # 0x884A
+ ("glGetTexParameter", E, 1, "GL_DEPTH_TEXTURE_MODE"), # 0x884B
+ ("glGetTexParameter", E, 1, "GL_TEXTURE_COMPARE_MODE"), # 0x884C
+ ("glGetTexParameter", E, 1, "GL_TEXTURE_COMPARE_FUNC"), # 0x884D
+ (None, X, 1, "GL_COMPARE_R_TO_TEXTURE"), # 0x884E
("glGet", X, 1, "GL_TEXTURE_CUBE_MAP_SEAMLESS"), # 0x884F
("glGet", X, 1, "GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV"), # 0x8850
("glGet", X, 1, "GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV"), # 0x8851
("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
static inline void
writeTextureImage(JSONWriter &json, GLenum target, GLint level)
{
- GLint width = 0, height = 0;
+ GLint width, height = 1, depth = 1;
+
+ width = 0;
glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width);
- glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height);
- if (!width || !height) {
+ 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();
json.writeNumberMember("__width__", width);
json.writeNumberMember("__height__", height);
- json.writeNumberMember("__depth__", 1);
+ json.writeNumberMember("__depth__", depth);
// Hardcoded for now, but we could chose types more adequate to the
// texture internal format
- json.writeStringMember("__type__", "float");
+ json.writeStringMember("__type__", "uint8");
+ json.writeBoolMember("__normalized__", true);
json.writeNumberMember("__channels__", 4);
- float *pixels = new float[width*height*4];
+ GLubyte *pixels = new GLubyte[depth*width*height*4];
- glGetTexImage(target, level, GL_RGBA, GL_FLOAT, pixels);
+ glGetTexImage(target, level, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
- json.writeStringMember("__encoding__", "base64");
json.beginMember("__data__");
- json.writeBase64(pixels, width * height * 4 * sizeof *pixels);
+ json.writeBase64(pixels, depth * width * height * 4 * sizeof *pixels);
json.endMember(); // __data__
delete [] pixels;
}
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 {
// 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];
+ 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);
- 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;
print
print ' json.beginObject();'
print
+ print ' GLfloat param;'
+ for function, type, count, name in parameters:
+ if function != 'glGetTexParameter' or count != 1:
+ continue
+ print ' glGetTexParameterfv(target, %s, ¶m);' % name
+ print ' json.beginMember("%s");' % name
+ JsonWriter().visit(type, 'param')
+ print ' json.endMember();'
+ print
+ print
print ' json.beginMember("levels");'
print ' json.beginArray();'
print ' GLint level = 0;'
print ' json.writeNumber(texture);'
print ' json.endMember();'
print
- print ' GLint param;'
# TODO: Generalize this
for function, type, count, name in parameters:
- if function != 'glGetTexLevelParameter':
+ if function != 'glGetTexLevelParameter' or count != 1:
continue
- print ' glGetTexLevelParameteriv(target, level, %s, ¶m);' % name
+ print ' glGetTexLevelParameterfv(target, level, %s, ¶m);' % name
print ' json.beginMember("%s");' % name
- print ' json.writeNumber(param);'
+ JsonWriter().visit(type, 'param')
print ' json.endMember();'
print
print ' json.beginMember("image");'
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