X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glstate.py;h=7ab2dd14def421e0f6214fd9766eef55d2e08137;hb=32420d2167c14c4c00d351e8807031b64bce06ef;hp=38084151979f6ad62aaed2381efc687b1738cfaa;hpb=2e3fff6025fac330cbf00c8b81766dcbcf6298b5;p=apitrace diff --git a/glstate.py b/glstate.py index 3808415..7ab2dd1 100644 --- a/glstate.py +++ b/glstate.py @@ -27,10 +27,10 @@ '''Generate code to dump most GL state into JSON.''' -from stdapi import * +from specs.stdapi import * -from gltypes import * -from glparams import * +from specs.gltypes import * +from specs.glparams import * texture_targets = [ @@ -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.''' @@ -175,6 +179,7 @@ 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): @@ -184,9 +189,9 @@ class JsonWriter(Visitor): It expects a previously declared JSONWriter instance named "json".''' def visit_literal(self, literal, instance): - if literal.format == 'Bool': + if literal.kind == 'Bool': print ' json.writeBool(%s);' % instance - elif literal.format in ('SInt', 'Uint', 'Float', 'Double'): + elif literal.kind in ('SInt', 'Uint', 'Float', 'Double'): print ' json.writeNumber(%s);' % instance else: raise NotImplementedError @@ -244,7 +249,7 @@ class StateDumper: print 'const char *' print 'enumToString(GLenum pname)' print '{' - print ' switch(pname) {' + print ' switch (pname) {' for name in GLenum.values: print ' case %s:' % name print ' return "%s";' % name @@ -254,6 +259,13 @@ class StateDumper: print '}' print + print 'static void' + print 'dumpFramebufferAttachementParameters(JSONWriter &json, GLenum target, GLenum attachment)' + print '{' + self.dump_attachment_parameters('target', 'attachment') + print '}' + print + print 'void' print 'dumpEnum(JSONWriter &json, GLenum pname)' print '{' @@ -279,6 +291,7 @@ class StateDumper: self.dump_texenv_params() self.dump_program_params() self.dump_texture_parameters() + self.dump_framebuffer_parameters() print ' json.endObject();' print ' json.endMember(); // parameters' @@ -367,13 +380,18 @@ class StateDumper: print ' json.beginMember(name);' print ' glActiveTexture(GL_TEXTURE0 + unit);' print ' json.beginObject();' - print ' GLint texture;' + print ' GLboolean enabled;' + print ' GLint binding;' print for target, binding in texture_targets: print ' // %s' % target - print ' texture = 0;' - print ' glGetIntegerv(%s, &texture);' % binding - print ' if (glIsEnabled(%s) || texture) {' % target + print ' enabled = GL_FALSE;' + print ' glGetBooleanv(%s, &enabled);' % target + print ' json.writeBoolMember("%s", enabled);' % target + print ' binding = 0;' + print ' glGetIntegerv(%s, &binding);' % binding + print ' json.writeNumberMember("%s", binding);' % binding + print ' if (enabled || binding) {' print ' json.beginMember("%s");' % target print ' json.beginObject();' self.dump_atoms(glGetTexParameter, target) @@ -390,6 +408,44 @@ class StateDumper: print ' }' print + def dump_framebuffer_parameters(self): + print ' {' + print ' GLint max_color_attachments = 0;' + print ' glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &max_color_attachments);' + print ' GLint framebuffer;' + for target, binding in framebuffer_targets: + print ' // %s' % target + print ' framebuffer = 0;' + print ' glGetIntegerv(%s, &framebuffer);' % binding + print ' if (framebuffer) {' + print ' json.beginMember("%s");' % target + print ' json.beginObject();' + print ' for (GLint i = 0; i < max_color_attachments; ++i) {' + print ' GLint color_attachment = GL_COLOR_ATTACHMENT0 + i;' + print ' dumpFramebufferAttachementParameters(json, %s, color_attachment);' % target + print ' }' + print ' dumpFramebufferAttachementParameters(json, %s, GL_DEPTH_ATTACHMENT);' % target + print ' dumpFramebufferAttachementParameters(json, %s, GL_STENCIL_ATTACHMENT);' % target + print ' json.endObject();' + print ' json.endMember(); // %s' % target + print ' }' + print + print ' }' + print + + def dump_attachment_parameters(self, target, attachment): + print ' {' + print ' GLint object_type = GL_NONE;' + print ' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &object_type);' % (target, attachment) + print ' if (object_type != GL_NONE) {' + print ' json.beginMember(enumToString(%s));' % attachment + print ' json.beginObject();' + self.dump_atoms(glGetFramebufferAttachmentParameter, target, attachment) + print ' json.endObject();' + print ' json.endMember(); // GL_x_ATTACHMENT' + print ' }' + print ' }' + def dump_atoms(self, getter, *args): for function, type, count, name in parameters: inflection = getter.inflector.radical + getter.suffix