- def visit_bitmask(self, bitmask, lvalue, rvalue):
- self.visit(bitmask.type, lvalue, rvalue)
-
- def visit_array(self, array, lvalue, rvalue):
- print ' const Trace::Array *__a%s = dynamic_cast<const Trace::Array *>(&%s);' % (array.id, rvalue)
- print ' if (__a%s) {' % (array.id)
- length = '__a%s->values.size()' % array.id
- print ' %s = new %s[%s];' % (lvalue, array.type, length)
- index = '__j' + array.id
- print ' for(size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length)
- try:
- self.visit(array.type, '%s[%s]' % (lvalue, index), '*__a%s->values[%s]' % (array.id, index))
- finally:
- print ' }'
- print ' } else {'
- print ' %s = NULL;' % lvalue
- print ' }'
-
- def visit_pointer(self, pointer, lvalue, rvalue):
- print ' const Trace::Array *__a%s = dynamic_cast<const Trace::Array *>(&%s);' % (pointer.id, rvalue)
- print ' if (__a%s) {' % (pointer.id)
- print ' %s = new %s;' % (lvalue, pointer.type)
- try:
- self.visit(pointer.type, '%s[0]' % (lvalue,), '*__a%s->values[0]' % (pointer.id,))
- finally:
- print ' } else {'
- print ' %s = NULL;' % lvalue
+import stdapi
+import glapi
+from retrace import Retracer
+
+
+class GlRetracer(Retracer):
+
+ def retrace_function(self, function):
+ Retracer.retrace_function(self, function)
+
+ array_pointer_function_names = set((
+ "glVertexPointer",
+ "glNormalPointer",
+ "glColorPointer",
+ "glIndexPointer",
+ "glTexCoordPointer",
+ "glEdgeFlagPointer",
+ "glFogCoordPointer",
+ "glSecondaryColorPointer",
+
+ "glInterleavedArrays",
+
+ #"glVertexPointerEXT",
+ #"glNormalPointerEXT",
+ #"glColorPointerEXT",
+ #"glIndexPointerEXT",
+ #"glTexCoordPointerEXT",
+ #"glEdgeFlagPointerEXT",
+ #"glFogCoordPointerEXT",
+ #"glSecondaryColorPointerEXT",
+
+ "glVertexAttribPointer",
+ "glVertexAttribPointerARB",
+ "glVertexAttribPointerNV",
+ "glVertexAttribLPointer",
+ "glVertexAttribLPointerEXT",
+
+ #"glMatrixIndexPointerARB",
+ ))
+
+ draw_array_function_names = set([
+ "glDrawArrays",
+ "glDrawArraysEXT",
+ "glDrawArraysIndirect",
+ "glDrawArraysInstanced",
+ "glDrawArraysInstancedARB",
+ "glDrawArraysInstancedEXT",
+ "glDrawMeshArraysSUN",
+ "glMultiDrawArrays",
+ "glMultiDrawArraysEXT",
+ "glMultiModeDrawArraysIBM",
+ ])
+
+ draw_elements_function_names = set([
+ "glDrawElements",
+ "glDrawElementsBaseVertex",
+ "glDrawElementsIndirect",
+ "glDrawElementsInstanced",
+ "glDrawElementsInstancedARB",
+ "glDrawElementsInstancedBaseVertex",
+ "glDrawElementsInstancedEXT",
+ "glDrawRangeElements",
+ "glDrawRangeElementsBaseVertex",
+ "glDrawRangeElementsEXT",
+ #"glMultiDrawElements",
+ #"glMultiDrawElementsBaseVertex",
+ #"glMultiDrawElementsEXT",
+ #"glMultiModeDrawElementsIBM",
+ ])
+
+ def retrace_function_body(self, function):
+ is_array_pointer = function.name in self.array_pointer_function_names
+ is_draw_array = function.name in self.draw_array_function_names
+ is_draw_elements = function.name in self.draw_elements_function_names
+
+ if is_array_pointer or is_draw_array or is_draw_elements:
+ print ' if (Trace::Parser::version < 1) {'
+
+ if is_array_pointer or is_draw_array:
+ print ' GLint __array_buffer = 0;'
+ print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &__array_buffer);'
+ print ' if (!__array_buffer) {'
+ self.fail_function(function)
+ print ' }'
+
+ if is_draw_elements:
+ print ' GLint __element_array_buffer = 0;'
+ print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &__element_array_buffer);'
+ print ' if (!__element_array_buffer) {'
+ self.fail_function(function)
+ print ' }'
+