diff options
author | Ian Romanick <[email protected]> | 2006-10-11 22:37:14 +0000 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2006-10-11 22:37:14 +0000 |
commit | f3f51bc844c8749250724d164722402cb9a07dc7 (patch) | |
tree | 68ccc40931c2d10f7a521d531609aeeb5b1637f9 /src/mesa/glapi/gl_procs.py | |
parent | 8a5871a98c23ce1a1d893b681f59dc8c42228dd1 (diff) |
Fix bug #4681.
glDeleteTextures and glDeleteTexturesEXT were erroneously listed as
aliases of each other. For anything /except/ GLX protocol they are
aliases. This set of changes allows functions that are functionally
identical but have different GLX protocol to be listed as aliases.
When building with GLX_INDIRECT_RENDERING set, different static
functions are used. These functions determine whether the current
context is direct rendering or not. If the context is direct
rendering, the aliased function (e.g., glDeleteTextures in the case of
glDeleteTexturesEXT) is called. If the context is not direct
rendering, the correct GLX protocol is sent.
For a deeper explanation of what is changed, please see:
http://dri.freedesktop.org/wiki/PartiallyAliasedFunctions
Diffstat (limited to 'src/mesa/glapi/gl_procs.py')
-rw-r--r-- | src/mesa/glapi/gl_procs.py | 79 |
1 files changed, 45 insertions, 34 deletions
diff --git a/src/mesa/glapi/gl_procs.py b/src/mesa/glapi/gl_procs.py index 88d99d25a4e..425943d25d2 100644 --- a/src/mesa/glapi/gl_procs.py +++ b/src/mesa/glapi/gl_procs.py @@ -26,7 +26,7 @@ # Ian Romanick <[email protected]> import license -import gl_XML +import gl_XML, glX_XML import sys, getopt class PrintGlProcs(gl_XML.gl_print_base): @@ -37,28 +37,34 @@ class PrintGlProcs(gl_XML.gl_print_base): self.name = "gl_procs.py (from Mesa)" self.license = license.bsd_license_template % ( \ """Copyright (C) 1999-2001 Brian Paul All Rights Reserved. -(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM") +(C) Copyright IBM Corporation 2004, 2006""", "BRIAN PAUL, IBM") def printRealHeader(self): - print '/* This file is only included by glapi.c and is used for' - print ' * the GetProcAddress() function' - print ' */' - print '' - print 'typedef struct {' - print ' GLint Name_offset;' - print '#ifdef NEED_FUNCTION_POINTER' - print ' _glapi_proc Address;' - print '#endif' - print ' GLuint Offset;' - print '} glprocs_table_t;' - print '' - print '#ifdef NEED_FUNCTION_POINTER' - print '# define NAME_FUNC_OFFSET(n,f,o) { n , (_glapi_proc) f , o }' - print '#else' - print '# define NAME_FUNC_OFFSET(n,f,o) { n , o }' - print '#endif' - print '' + print """ +/* This file is only included by glapi.c and is used for + * the GetProcAddress() function + */ + +typedef struct { + GLint Name_offset; +#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) + _glapi_proc Address; +#endif + GLuint Offset; +} glprocs_table_t; + +#if !defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING) +# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , o } +#elif defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING) +# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f1 , o } +#elif defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING) +# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f2 , o } +#elif !defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING) +# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f3 , o } +#endif + +""" return def printRealFooter(self): @@ -89,7 +95,7 @@ class PrintGlProcs(gl_XML.gl_print_base): for func in api.functionIterateByOffset(): name = func.dispatch_name() self.printFunctionString(func.name) - table.append((base_offset, name, func.name)) + table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.name)) # The length of the function's name, plus 2 for "gl", # plus 1 for the NUL. @@ -102,7 +108,13 @@ class PrintGlProcs(gl_XML.gl_print_base): if n != func.name: name = func.dispatch_name() self.printFunctionString( n ) - table.append((base_offset, name, func.name)) + + if func.has_different_protocol(n): + alt_name = "gl" + func.static_glx_name(n) + table.append((base_offset, "gl" + name, alt_name, alt_name, func.name)) + else: + table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.name)) + base_offset += len(n) + 3 @@ -113,22 +125,22 @@ class PrintGlProcs(gl_XML.gl_print_base): print '' print '/* FIXME: Having these (incorrect) prototypes here is ugly. */' - print '#ifdef NEED_FUNCTION_POINTER' + print '#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)' for func in api.functionIterateByOffset(): for n in func.entry_points: - if not func.is_static_entry_point(func.name): + if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)): print 'extern void gl_dispatch_stub_%u(void);' % (func.offset) break - print '#endif /* NEED_FUNCTION_POINTER */' + print '#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */' print '' print 'static const glprocs_table_t static_functions[] = {' - for (offset, disp_name, real_name) in table: - print ' NAME_FUNC_OFFSET( %5u, gl%s, _gloffset_%s ),' % (offset, disp_name, real_name) + for info in table: + print ' NAME_FUNC_OFFSET(%5u, %s, %s, %s, _gloffset_%s),' % info - print ' NAME_FUNC_OFFSET( -1, NULL, 0 )' + print ' NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)' print '};' return @@ -136,9 +148,9 @@ class PrintGlProcs(gl_XML.gl_print_base): def show_usage(): print "Usage: %s [-f input_file_name] [-m mode]" % sys.argv[0] print "mode can be one of:" - print " long - Create code for compilers that can handle very " + print " long - Create code for compilers that can handle very" print " long string constants. (default)" - print " short - Create code for compilers that can only handle " + print " short - Create code for compilers that can only handle" print " ANSI C89 string constants." sys.exit(1) @@ -162,7 +174,6 @@ if __name__ == '__main__': else: show_usage() - api = gl_XML.parse_GL_API( file_name ) - - printer = PrintGlProcs( long_string ) - printer.Print( api ) + api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory()) + printer = PrintGlProcs(long_string) + printer.Print(api) |