import stdapi
import glapi
+import glparams
from glxapi import glxapi
from trace import Tracer, dump_instance
class GlTracer(Tracer):
- def header(self, api):
- Tracer.header(self, api)
- self.state_tracker_decl(api)
-
- def footer(self, api):
- Tracer.footer(self, api)
- self.state_tracker_impl(api)
-
arrays = [
("Vertex", "VERTEX"),
("Normal", "NORMAL"),
]
arrays.reverse()
- def state_tracker_decl(self, api):
+ def header(self, api):
+ Tracer.header(self, api)
+
print '// Whether user arrays were used'
print 'static bool __user_arrays = false;'
print
# Generate memcpy's signature
self.trace_function_decl(glapi.memcpy)
-
+
+ # Generate a helper function to determine whether a parameter name
+ # refers to a symbolic value or not
+ print 'static bool'
+ print 'is_symbolic_pname(GLenum pname) {'
+ print ' switch(pname) {'
+ for function, type, count, name in glparams.parameters:
+ if type is glapi.GLenum:
+ print ' case %s:' % name
+ print ' return true;'
+ print ' default:'
+ print ' return false;'
+ print ' }'
+ print '}'
+ print
+
+ # Generate a helper function to determine whether a parameter value is
+ # potentially symbolic or not; i.e., if the value can be represented in
+ # an enum or not
+ print 'template<class T>'
+ print 'static inline bool'
+ print 'is_symbolic_param(T param) {'
+ print ' return static_cast<T>(static_cast<GLenum>(param)) == param;'
+ print '}'
+ print
+
+ # Generate a helper function to know how many elements a parameter has
+ print 'static size_t'
+ print 'pname_size(GLenum pname) {'
+ print ' switch(pname) {'
+ for function, type, count, name in glparams.parameters:
+ if type is not None:
+ print ' case %s: return %u;' % (name, count)
+ print ' case GL_COMPRESSED_TEXTURE_FORMATS: {'
+ print ' GLint num_compressed_texture_formats = 0;'
+ print ' __glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &num_compressed_texture_formats);'
+ print ' return num_compressed_texture_formats;'
+ print ' }'
+ print ' default:'
+ print r' OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);'
+ print ' return 1;'
+ print ' }'
+ print '}'
+ print
+
array_pointer_function_names = set((
"glVertexPointer",
"glNormalPointer",
"glFogCoordPointer",
"glSecondaryColorPointer",
- #"glVertexPointerEXT",
- #"glNormalPointerEXT",
- #"glColorPointerEXT",
- #"glIndexPointerEXT",
- #"glTexCoordPointerEXT",
- #"glEdgeFlagPointerEXT",
- #"glFogCoordPointerEXT",
- #"glSecondaryColorPointerEXT",
+ "glInterleavedArrays",
+
+ "glVertexPointerEXT",
+ "glNormalPointerEXT",
+ "glColorPointerEXT",
+ "glIndexPointerEXT",
+ "glTexCoordPointerEXT",
+ "glEdgeFlagPointerEXT",
+ "glFogCoordPointerEXT",
+ "glSecondaryColorPointerEXT",
"glVertexAttribPointer",
"glVertexAttribPointerARB",
"glVertexAttribPointerNV",
+ "glVertexAttribIPointer",
+ "glVertexAttribIPointerEXT",
"glVertexAttribLPointer",
"glVertexAttribLPointerEXT",
draw_function_names = set((
'glDrawArrays',
+ 'glDrawArraysEXT',
'glDrawElements',
'glDrawRangeElements',
+ 'glDrawRangeElementsEXT',
))
interleaved_formats = [
print ' if (!__array_buffer) {'
print ' __user_arrays = true;'
self.dispatch_function(function)
+
+ # And also break down glInterleavedArrays into the individual calls
+ if function.name == 'glInterleavedArrays':
+ print
+
+ # Initialize the enable flags
+ for camelcase_name, uppercase_name in self.arrays:
+ flag_name = '__' + uppercase_name.lower()
+ print ' GLboolean %s = GL_FALSE;' % flag_name
+ print
+
+ # Switch for the interleaved formats
+ print ' switch (format) {'
+ for format in self.interleaved_formats:
+ print ' case %s:' % format
+ for camelcase_name, uppercase_name in self.arrays:
+ flag_name = '__' + uppercase_name.lower()
+ if format.find('_' + uppercase_name[0]) >= 0:
+ print ' %s = GL_TRUE;' % flag_name
+ print ' break;'
+ print ' default:'
+ print ' return;'
+ print ' }'
+ print
+
+ # Emit fake glEnableClientState/glDisableClientState flags
+ for camelcase_name, uppercase_name in self.arrays:
+ flag_name = '__' + uppercase_name.lower()
+ enable_name = 'GL_%s_ARRAY' % uppercase_name
+
+ # Emit a fake function
+ print ' {'
+ print ' static const Trace::FunctionSig &__sig = %s ? __glEnableClientState_sig : __glDisableClientState_sig;' % flag_name
+ print ' unsigned __call = Trace::BeginEnter(__sig);'
+ print ' Trace::BeginArg(0);'
+ dump_instance(glapi.GLenum, enable_name)
+ print ' Trace::EndArg();'
+ print ' Trace::EndEnter();'
+ print ' Trace::BeginLeave(__call);'
+ print ' Trace::EndLeave();'
+ print ' }'
+
print ' return;'
print ' }'
print ' __trace_user_arrays(maxindex);'
print ' }'
- # And also break down glInterleavedArrays into the individual calls
- if function.name == 'glInterleavedArrays':
- print ' GLint __array_buffer = 0;'
- print ' __glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &__array_buffer);'
- print ' if (!__array_buffer) {'
- print ' __user_arrays = true;'
- self.dispatch_function(function)
- print
-
- # Initialize the enable flags
- for camelcase_name, uppercase_name in self.arrays:
- flag_name = '__' + uppercase_name.lower()
- print ' GLboolean %s = GL_FALSE;' % flag_name
- print
-
- # Swicth for the interleaved formats
- print ' switch (format) {'
- for format in self.interleaved_formats:
- print ' case %s:' % format
- for camelcase_name, uppercase_name in self.arrays:
- flag_name = '__' + uppercase_name.lower()
- if format.find('_' + uppercase_name[0]) >= 0:
- print ' %s = GL_TRUE;' % flag_name
- print ' break;'
- print ' default:'
- print ' return;'
- print ' }'
- print
-
- # Emit fake glEnableClientState/glDisableClientState flags
- for camelcase_name, uppercase_name in self.arrays:
- flag_name = '__' + uppercase_name.lower()
- enable_name = 'GL_%s_ARRAY' % uppercase_name
-
- # Emit a fake function
- print ' {'
- print ' static const Trace::FunctionSig &__sig = %s ? __glEnableClientState_sig : __glDisableClientState_sig;' % flag_name
- print ' unsigned __call = Trace::BeginEnter(__sig);'
- print ' Trace::BeginArg(0);'
- dump_instance(glapi.GLenum, enable_name)
- print ' Trace::EndArg();'
- print ' Trace::EndEnter();'
- print ' Trace::BeginLeave(__call);'
- print ' Trace::EndLeave();'
- print ' }'
-
- print ' return;'
- print ' }'
-
# Emit a fake memcpy on
if function.name in ('glUnmapBuffer', 'glUnmapBufferARB'):
print ' struct buffer_mapping *mapping = get_buffer_mapping(target);'
print ' }'
return
+ # Several GL state functions take GLenum symbolic names as
+ # integer/floats; so dump the symbolic name whenever possible
+ if arg.type in (glapi.GLint, glapi.GLfloat) and arg.name == 'param':
+ assert arg.index > 0
+ assert function.args[arg.index - 1].name == 'pname'
+ assert function.args[arg.index - 1].type == glapi.GLenum
+ print ' if (is_symbolic_pname(pname) && is_symbolic_param(%s)) {' % arg.name
+ dump_instance(glapi.GLenum, arg.name)
+ print ' } else {'
+ Tracer.dump_arg_instance(self, function, arg)
+ print ' }'
+ return
+
Tracer.dump_arg_instance(self, function, arg)
- def state_tracker_impl(self, api):
- # A simple state tracker to track the pointer values
+ def footer(self, api):
+ Tracer.footer(self, api)
+ # A simple state tracker to track the pointer values
# update the state
print 'static void __trace_user_arrays(GLuint maxindex)'
print '{'