X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gltrace.py;h=3f907207f16a1d51b41fd881bc2af47babaf624f;hb=21f1659a20fdc9b0698f5374c49a90130678bf8e;hp=56292bd19a77650bf760cad8351a91617377a231;hpb=c9f1223760ff33be07e69725b934fb609143fb3e;p=apitrace diff --git a/gltrace.py b/gltrace.py index 56292bd..3f90720 100644 --- a/gltrace.py +++ b/gltrace.py @@ -36,30 +36,46 @@ from trace import Tracer, dump_instance class TypeGetter(stdapi.Visitor): '''Determine which glGet*v function that matches the specified type.''' + def __init__(self, prefix = 'glGet', long_suffix = True): + self.prefix = prefix + self.long_suffix = long_suffix + def visit_const(self, const): return self.visit(const.type) def visit_alias(self, alias): if alias.expr == 'GLboolean': - return 'glGetBooleanv', alias.expr + if self.long_suffix: + return self.prefix + 'Booleanv', alias.expr + else: + return self.prefix + 'iv', 'GLint' elif alias.expr == 'GLdouble': - return 'glGetDoublev', alias.expr + if self.long_suffix: + return self.prefix + 'Doublev', alias.expr + else: + return self.prefix + 'dv', alias.expr elif alias.expr == 'GLfloat': - return 'glGetFloatv', alias.expr - elif alias.expr in ('GLint', 'GLsizei'): - return 'glGetIntegerv', 'GLint' + if self.long_suffix: + return self.prefix + 'Floatv', alias.expr + else: + return self.prefix + 'fv', alias.expr + elif alias.expr in ('GLint', 'GLuint', 'GLsizei'): + if self.long_suffix: + return self.prefix + 'Integerv', 'GLint' + else: + return self.prefix + 'iv', 'GLint' else: print alias.expr assert False def visit_enum(self, enum): - return 'glGetIntegerv', 'GLint' + return self.visit(glapi.GLint) def visit_bitmask(self, bitmask): - return 'glGetIntegerv', 'GLint' + return self.visit(glapi.GLint) def visit_opaque(self, pointer): - return 'glGetPointerv', 'GLvoid *' + return self.prefix + 'Pointerv', 'GLvoid *' class GlTracer(Tracer): @@ -88,23 +104,37 @@ class GlTracer(Tracer): # Whether we need user arrays print 'static inline bool __need_user_arrays(void)' print '{' + for camelcase_name, uppercase_name in self.arrays: function_name = 'gl%sPointer' % camelcase_name enable_name = 'GL_%s_ARRAY' % uppercase_name binding_name = 'GL_%s_ARRAY_BUFFER_BINDING' % uppercase_name print ' // %s' % function_name - print ' {' - print ' GLboolean __enabled = GL_FALSE;' - print ' __glGetBooleanv(%s, &__enabled);' % enable_name - print ' if (__enabled) {' - print ' GLint __binding = 0;' - print ' __glGetIntegerv(%s, &__binding);' % binding_name - print ' if (!__binding) {' - print ' return true;' - print ' }' + print ' if (__glIsEnabled(%s)) {' % enable_name + print ' GLint __binding = 0;' + print ' __glGetIntegerv(%s, &__binding);' % binding_name + print ' if (!__binding) {' + print ' return true;' print ' }' print ' }' print + + print ' // glVertexAttribPointer' + print ' GLint __max_vertex_attribs;' + print ' __glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &__max_vertex_attribs);' + print ' for (GLint index = 0; index < __max_vertex_attribs; ++index) {' + print ' GLint __enabled = 0;' + print ' __glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &__enabled);' + print ' if (__enabled) {' + print ' GLint __binding = 0;' + print ' __glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &__binding);' + print ' if (!__binding) {' + print ' return true;' + print ' }' + print ' }' + print ' }' + print + print ' return false;' print '}' print @@ -121,7 +151,7 @@ class GlTracer(Tracer): "glEdgeFlagPointer", "glFogCoordPointer", "glSecondaryColorPointer", - + #"glVertexPointerEXT", #"glNormalPointerEXT", #"glColorPointerEXT", @@ -131,10 +161,11 @@ class GlTracer(Tracer): #"glFogCoordPointerEXT", #"glSecondaryColorPointerEXT", - #"glVertexAttribPointer", - #"glVertexAttribPointerARB", - #"glVertexAttribPointerNV", - #"glVertexAttribLPointer", + "glVertexAttribPointer", + "glVertexAttribPointerARB", + "glVertexAttribPointerNV", + "glVertexAttribLPointer", + "glVertexAttribLPointerEXT", #"glMatrixIndexPointerARB", )) @@ -257,6 +288,7 @@ class GlTracer(Tracer): # update the state print 'static void __trace_user_arrays(GLuint maxindex)' print '{' + for camelcase_name, uppercase_name in self.arrays: function_name = 'gl%sPointer' % camelcase_name enable_name = 'GL_%s_ARRAY' % uppercase_name @@ -264,42 +296,82 @@ class GlTracer(Tracer): function = api.get_function_by_name(function_name) print ' // %s' % function.name - print ' {' - print ' GLboolean __enabled = GL_FALSE;' - print ' __glGetBooleanv(%s, &__enabled);' % enable_name - print ' if (__enabled) {' - print ' GLint __binding = 0;' - print ' __glGetIntegerv(%s, &__binding);' % binding_name - print ' if (!__binding) {' + print ' if (__glIsEnabled(%s)) {;' % enable_name + print ' GLint __binding = 0;' + print ' __glGetIntegerv(%s, &__binding);' % binding_name + print ' if (!__binding) {' # Get the arguments via glGet* for arg in function.args: arg_get_enum = 'GL_%s_ARRAY_%s' % (uppercase_name, arg.name.upper()) arg_get_function, arg_type = TypeGetter().visit(arg.type) - print ' %s %s = 0;' % (arg_type, arg.name) - print ' __%s(%s, &%s);' % (arg_get_function, arg_get_enum, arg.name) + print ' %s %s = 0;' % (arg_type, arg.name) + print ' __%s(%s, &%s);' % (arg_get_function, arg_get_enum, arg.name) arg_names = ', '.join([arg.name for arg in function.args[:-1]]) - print ' size_t __size = __%s_size(%s, maxindex);' % (function.name, arg_names) + print ' size_t __size = __%s_size(%s, maxindex);' % (function.name, arg_names) # Emit a fake function - print ' unsigned __call = Trace::BeginEnter(__%s_sig);' % (function.name,) + print ' unsigned __call = Trace::BeginEnter(__%s_sig);' % (function.name,) for arg in function.args: assert not arg.output - print ' Trace::BeginArg(%u);' % (arg.index,) + print ' Trace::BeginArg(%u);' % (arg.index,) if arg.name != 'pointer': dump_instance(arg.type, arg.name) else: - print ' Trace::LiteralBlob((const void *)%s, __size);' % (arg.name) - print ' Trace::EndArg();' + print ' Trace::LiteralBlob((const void *)%s, __size);' % (arg.name) + print ' Trace::EndArg();' - print ' Trace::EndEnter();' - print ' Trace::BeginLeave(__call);' - print ' Trace::EndLeave();' - print ' }' + print ' Trace::EndEnter();' + print ' Trace::BeginLeave(__call);' + print ' Trace::EndLeave();' print ' }' print ' }' print + + # Samething, but for glVertexAttribPointer + print ' // glVertexAttribPointer' + print ' GLint __max_vertex_attribs;' + print ' __glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &__max_vertex_attribs);' + print ' for (GLint index = 0; index < __max_vertex_attribs; ++index) {' + print ' GLint __enabled = 0;' + print ' __glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &__enabled);' + print ' if (__enabled) {' + print ' GLint __binding = 0;' + print ' __glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &__binding);' + print ' if (!__binding) {' + + function = api.get_function_by_name('glVertexAttribPointer') + + # Get the arguments via glGet* + for arg in function.args[1:]: + arg_get_enum = 'GL_VERTEX_ATTRIB_ARRAY_%s' % (arg.name.upper(),) + arg_get_function, arg_type = TypeGetter('glGetVertexAttrib', False).visit(arg.type) + print ' %s %s = 0;' % (arg_type, arg.name) + print ' __%s(index, %s, &%s);' % (arg_get_function, arg_get_enum, arg.name) + + arg_names = ', '.join([arg.name for arg in function.args[1:-1]]) + print ' size_t __size = __%s_size(%s, maxindex);' % (function.name, arg_names) + + # Emit a fake function + print ' unsigned __call = Trace::BeginEnter(__%s_sig);' % (function.name,) + for arg in function.args: + assert not arg.output + print ' Trace::BeginArg(%u);' % (arg.index,) + if arg.name != 'pointer': + dump_instance(arg.type, arg.name) + else: + print ' Trace::LiteralBlob((const void *)%s, __size);' % (arg.name) + print ' Trace::EndArg();' + + print ' Trace::EndEnter();' + print ' Trace::BeginLeave(__call);' + print ' Trace::EndLeave();' + print ' }' + print ' }' + print ' }' + print + print '}' print