X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glstate.py;h=fb3e090bff8d094f66ce0ee4ea78ecfc9918d014;hb=4d0ef5d3d040704f61e0814c9260c1a2ca11c24d;hp=cfdca912c19bef659cc3e0d178c96a2273f352ae;hpb=e8e172573ca3f0041d9a32d58a5da3fd36483de9;p=apitrace diff --git a/glstate.py b/glstate.py index cfdca91..fb3e090 100644 --- a/glstate.py +++ b/glstate.py @@ -41,6 +41,10 @@ texture_targets = [ ('GL_TEXTURE_CUBE_MAP', 'GL_TEXTURE_BINDING_CUBE_MAP') ] +framebuffer_targets = [ + ('GL_DRAW_FRAMEBUFFER', 'GL_DRAW_FRAMEBUFFER_BINDING'), + ('GL_READ_FRAMEBUFFER', 'GL_READ_FRAMEBUFFER_BINDING'), +] class GetInflector: '''Objects that describes how to inflect.''' @@ -172,8 +176,10 @@ 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') +glGetFramebufferAttachmentParameter = StateGetter('glGetFramebufferAttachmentParameter', {I: 'iv'}) class JsonWriter(Visitor): @@ -196,7 +202,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 @@ -231,19 +237,17 @@ class StateDumper: def dump(self): print '#include ' - print '#include ' - print '#include ' 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: @@ -255,24 +259,17 @@ class StateDumper: print '}' print - print 'static const char *' - print 'enum_string(GLenum pname)' + print 'static void' + print 'dumpFramebufferAttachementParameters(JSONWriter &json, GLenum target, GLenum attachment)' 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 ' }' + self.dump_attachment_parameters('target', 'attachment') 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 {' @@ -281,383 +278,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) { - return; - } else { - char label[512]; - - GLint active_texture = GL_TEXTURE0; - glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); - snprintf(label, sizeof label, "%s, %s, level = %i", _enum_string(active_texture), _enum_string(target), level); - - json.beginMember(label); - - 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 = "<