X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=glstate.py;h=80e0471e186f09cf881350cca5961219f5f5c6fa;hb=e2dfa2ec912e22d838fcbe8ae019b6b3cfab3103;hp=d46cf607f066beddc2e3c3e64e6ad790222901d2;hpb=0b210a5f07344b85d9d04348daa9078db622eb6a;p=apitrace diff --git a/glstate.py b/glstate.py index d46cf60..80e0471 100644 --- a/glstate.py +++ b/glstate.py @@ -327,11 +327,11 @@ parameters = [ ("glGet", E, 1, "GL_FEEDBACK_BUFFER_TYPE"), # 0x0DF2 ("glGet", P, 1, "GL_SELECTION_BUFFER_POINTER"), # 0x0DF3 ("glGet", I, 1, "GL_SELECTION_BUFFER_SIZE"), # 0x0DF4 - ("glGetTexLevelParameter", X, 1, "GL_TEXTURE_WIDTH"), # 0x1000 - ("glGetTexLevelParameter", X, 1, "GL_TEXTURE_HEIGHT"), # 0x1001 - ("glGetTexLevelParameter", X, 1, "GL_TEXTURE_INTERNAL_FORMAT"), # 0x1003 - ("glGet", X, 1, "GL_TEXTURE_BORDER_COLOR"), # 0x1004 - ("glGetTexLevelParameter", X, 1, "GL_TEXTURE_BORDER"), # 0x1005 + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_WIDTH"), # 0x1000 + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_HEIGHT"), # 0x1001 + ("glGetTexLevelParameter", E, 1, "GL_TEXTURE_INTERNAL_FORMAT"), # 0x1003 + ("glGetTexParameter", F, 4, "GL_TEXTURE_BORDER_COLOR"), # 0x1004 + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_BORDER"), # 0x1005 ("glGet", X, 1, "GL_DONT_CARE"), # 0x1100 ("glGet", X, 1, "GL_FASTEST"), # 0x1101 ("glGet", X, 1, "GL_NICEST"), # 0x1102 @@ -462,10 +462,10 @@ parameters = [ ("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 @@ -594,18 +594,18 @@ parameters = [ ("glGet", X, 1, "GL_RGB10_A2"), # 0x8059 ("glGet", X, 1, "GL_RGBA12"), # 0x805A ("glGet", X, 1, "GL_RGBA16"), # 0x805B - ("glGet", X, 1, "GL_TEXTURE_RED_SIZE"), # 0x805C - ("glGet", X, 1, "GL_TEXTURE_GREEN_SIZE"), # 0x805D - ("glGet", X, 1, "GL_TEXTURE_BLUE_SIZE"), # 0x805E - ("glGet", X, 1, "GL_TEXTURE_ALPHA_SIZE"), # 0x805F - ("glGet", X, 1, "GL_TEXTURE_LUMINANCE_SIZE"), # 0x8060 - ("glGet", X, 1, "GL_TEXTURE_INTENSITY_SIZE"), # 0x8061 + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_RED_SIZE"), # 0x805C + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_GREEN_SIZE"), # 0x805D + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_BLUE_SIZE"), # 0x805E + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_ALPHA_SIZE"), # 0x805F + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_LUMINANCE_SIZE"), # 0x8060 + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_INTENSITY_SIZE"), # 0x8061 ("glGet", X, 1, "GL_REPLACE_EXT"), # 0x8062 ("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 @@ -615,8 +615,8 @@ parameters = [ ("glGet", F, 1, "GL_UNPACK_IMAGE_HEIGHT"), # 0x806E ("glGet", B, 1, "GL_TEXTURE_3D"), # 0x806F ("glGet", X, 1, "GL_PROXY_TEXTURE_3D"), # 0x8070 - ("glGet", X, 1, "GL_TEXTURE_DEPTH"), # 0x8071 - ("glGet", X, 1, "GL_TEXTURE_WRAP_R"), # 0x8072 + ("glGetTexLevelParameter", I, 1, "GL_TEXTURE_DEPTH"), # 0x8071 + ("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 @@ -775,10 +775,10 @@ parameters = [ ("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 @@ -854,7 +854,7 @@ parameters = [ ("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 @@ -1346,7 +1346,7 @@ parameters = [ ("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 @@ -1360,8 +1360,8 @@ parameters = [ ("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 @@ -1372,8 +1372,8 @@ parameters = [ ("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 @@ -1435,7 +1435,7 @@ parameters = [ ("glGet", X, 1, "GL_MAP2_VERTEX_ATTRIB14_4_NV"), # 0x867E ("glGet", X, 1, "GL_MAP2_VERTEX_ATTRIB15_4_NV"), # 0x867F ("glGet", X, 1, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE"), # 0x86A0 - ("glGet", X, 1, "GL_TEXTURE_COMPRESSED"), # 0x86A1 + ("glGetTexLevelParameter", B, 1, "GL_TEXTURE_COMPRESSED"), # 0x86A1 ("glGet", X, 1, "GL_NUM_COMPRESSED_TEXTURE_FORMATS"), # 0x86A2 #XXX: the list is GL_NUM_COMPRESSED_TEXTURES #("glGet", E, 1, "GL_COMPRESSED_TEXTURE_FORMATS"), # 0x86A3 @@ -1809,11 +1809,11 @@ parameters = [ ("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 @@ -1850,7 +1850,7 @@ parameters = [ ("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 @@ -2958,7 +2958,8 @@ class StateDumper: print '#include "json.hpp"' print '#include "glimports.hpp"' print '#include "glproc.hpp"' - print '#include "glstate.hpp"' + print '#include "glsize.hpp"' + print '#include "glretrace.hpp"' print print 'static void' @@ -3037,11 +3038,21 @@ class StateDumper: 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(); @@ -3051,46 +3062,78 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level) 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); - - if (0) { - json.writeStringMember("__encoding__", "array"); - json.beginMember("__data__"); - - json.beginArray(); - for (GLint y = 0; y < height; ++y) { - json.beginArray(); - for (GLint x = 0; x < width; ++x) { - json.beginArray(); - for (GLint chan = 0; chan < 4; ++chan) { - json.writeNumber(pixels[(y*width + x)*4 + chan]); - } - json.endArray(); - } - json.endArray(); - } - json.endArray(); - json.endMember(); // __data__ - } else { - json.writeStringMember("__encoding__", "base64"); - json.beginMember("__data__"); - json.writeBase64(pixels, width * height * 4 * sizeof *pixels); - json.endMember(); // __data__ - } + glGetTexImage(target, level, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + json.beginMember("__data__"); + json.writeBase64(pixels, depth * width * height * 4 * sizeof *pixels); + 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__"); + json.writeBase64(pixels, width * height * channels * sizeof *pixels); + json.endMember(); // __data__ + + delete [] pixels; + json.endObject(); + } +} + ''' # textures @@ -3106,6 +3149,16 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level) 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;' @@ -3124,14 +3177,15 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level) print ' json.writeNumber(texture);' print ' json.endMember();' print - print ' json.beginMember("GL_TEXTURE_WIDTH");' - print ' json.writeNumber(width);' - print ' json.endMember();' - print - print ' json.beginMember("GL_TEXTURE_HEIGHT");' - print ' json.writeNumber(height);' - print ' json.endMember();' - print + # TODO: Generalize this + for function, type, count, name in parameters: + if function != 'glGetTexLevelParameter' or count != 1: + continue + print ' glGetTexLevelParameterfv(target, level, %s, ¶m);' % name + print ' json.beginMember("%s");' % name + JsonWriter().visit(type, 'param') + print ' json.endMember();' + print print ' json.beginMember("image");' print ' writeTextureImage(json, target, level);' print ' json.endMember();' @@ -3146,12 +3200,13 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level) print '}' print - print 'void state_dump(std::ostream &os)' + 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 @@ -3244,6 +3299,35 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level) print ' json.endMember(); // texture' print + def dump_framebuffer(self): + print ' json.beginMember("framebuffer");' + print ' json.beginObject();' + # 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 + def write_line(s): self.write(' '*self.level + s + '\n')