From d7d3fb925b6993740d0126d0d7e678c27f5f1850 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 8 Oct 2009 10:33:32 +0800 Subject: mesa/main: Add support for remap table. This commit only adds the source files. It is supposed to replace the remap table in DRI drivers. Signed-off-by: Chia-I Wu --- src/mesa/glapi/remap_helper.py | 219 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 src/mesa/glapi/remap_helper.py (limited to 'src/mesa/glapi/remap_helper.py') diff --git a/src/mesa/glapi/remap_helper.py b/src/mesa/glapi/remap_helper.py new file mode 100644 index 0000000000..7e68a908e3 --- /dev/null +++ b/src/mesa/glapi/remap_helper.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python + +# Copyright (C) 2009 Chia-I Wu +# All Rights Reserved. +# +# This is based on extension_helper.py by Ian Romanick. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# on the rights to use, copy, modify, merge, publish, distribute, sub +# license, and/or sell copies of the Software, and to permit persons to whom +# the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +import gl_XML +import license +import sys, getopt, string + +def get_function_spec(func): + sig = "" + # derive parameter signature + for p in func.parameterIterator(): + if p.is_padding: + continue + # FIXME: This is a *really* ugly hack. :( + tn = p.type_expr.get_base_type_node() + if p.is_pointer(): + sig += 'p' + elif tn.integer: + sig += 'i' + elif tn.size == 4: + sig += 'f' + else: + sig += 'd' + + spec = [sig] + for ent in func.entry_points: + spec.append("gl" + ent) + + # spec is terminated by an empty string + spec.append('') + + return spec + +class PrintGlRemap(gl_XML.gl_print_base): + def __init__(self): + gl_XML.gl_print_base.__init__(self) + + self.name = "remap_helper.py (from Mesa)" + self.license = license.bsd_license_template % ("Copyright (C) 2009 Chia-I Wu ", "Chia-I Wu") + return + + + def printRealHeader(self): + print '#include "glapi/dispatch.h"' + print '#include "glapi/glapioffsets.h"' + print '' + return + + + def printBody(self, api): + print 'struct gl_function_remap {' + print ' GLint func_index;' + print ' GLint dispatch_offset; /* for sanity check */' + print '};' + print '' + + pool_indices = {} + + print '/* this is internal to remap.c */' + print '#ifdef need_MESA_remap_table' + print '' + print 'static const char _mesa_function_pool[] =' + + # output string pool + index = 0; + for f in api.functionIterateAll(): + pool_indices[f] = index + + spec = get_function_spec(f) + + # a function has either assigned offset, fixed offset, + # or no offset + if f.assign_offset: + comments = "will be remapped" + elif f.offset > 0: + comments = "offset %d" % f.offset + else: + comments = "dynamic" + + print ' /* _mesa_function_pool[%d]: %s (%s) */' \ + % (index, f.name, comments) + for line in spec: + print ' "%s\\0"' % line + index += len(line) + 1 + print ' ;' + print '' + + print '/* these functions need to be remapped */' + print 'static const struct {' + print ' GLint pool_index;' + print ' GLint remap_index;' + print '} MESA_remap_table_functions[] = {' + # output all functions that need to be remapped + # iterate by offsets so that they are sorted by remap indices + for f in api.functionIterateByOffset(): + if not f.assign_offset: + continue + print ' { %5d, %s_remap_index },' \ + % (pool_indices[f], f.name) + print ' { -1, -1 }' + print '};' + print '' + + abi = [ "1.0", "1.1", "1.2", "GL_ARB_multitexture" ] + extension_functions = {} + + # collect non-ABI functions + for f in api.functionIterateAll(): + for n in f.entry_points: + category, num = api.get_category_for_name(n) + if category not in abi: + c = gl_XML.real_category_name(category) + if not extension_functions.has_key(c): + extension_functions[c] = [] + extension_functions[c].append(f) + extensions = extension_functions.keys() + extensions.sort() + + # output ABI functions that have alternative names (with ext suffix) + print '/* these functions are in the ABI, but have alternative names */' + print 'static const struct gl_function_remap MESA_alt_functions[] = {' + for ext in extensions: + funcs = [] + for f in extension_functions[ext]: + # test if the function is in the ABI + if not f.assign_offset and f.offset >= 0: + funcs.append(f) + if not funcs: + continue + print ' /* from %s */' % ext + for f in funcs: + print ' { %5d, _gloffset_%s },' \ + % (pool_indices[f], f.name) + print ' { -1, -1 }' + print '};' + print '' + + print '#endif /* need_MESA_remap_table */' + print '' + + # output remap helpers for DRI drivers + + for ext in extensions: + funcs = [] + remapped = [] + for f in extension_functions[ext]: + if f.assign_offset: + # these are handled above + remapped.append(f) + else: + # these functions are either in the + # abi, or have offset -1 + funcs.append(f) + + print '#if defined(need_%s)' % (ext) + if remapped: + print '/* functions defined in MESA_remap_table_functions are excluded */' + + # output extension functions that need to be mapped + print 'static const struct gl_function_remap %s_functions[] = {' % (ext) + for f in funcs: + if f.offset >= 0: + print ' { %5d, _gloffset_%s },' \ + % (pool_indices[f], f.name) + else: + print ' { %5d, -1 }, /* %s */' % \ + (pool_indices[f], f.name) + print ' { -1, -1 }' + print '};' + + print '#endif' + print '' + + return + + +def show_usage(): + print "Usage: %s [-f input_file_name]" % sys.argv[0] + sys.exit(1) + +if __name__ == '__main__': + file_name = "gl_API.xml" + + try: + (args, trail) = getopt.getopt(sys.argv[1:], "f:") + except Exception,e: + show_usage() + + for (arg,val) in args: + if arg == "-f": + file_name = val + + api = gl_XML.parse_GL_API( file_name ) + + printer = PrintGlRemap() + printer.Print( api ) -- cgit v1.2.3 From 6e99e6ddbf488f6955e34ef0bc438fdcb4d90f74 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 16 Oct 2009 16:04:06 +0800 Subject: glapi: Always build libglapi.a. This is made possible by making glapioffsets.h and glapidispatch.h internal headers of glapi. They should only be included indirectly through dispatch.h by mesa. Signed-off-by: Chia-I Wu --- src/mesa/Makefile | 6 +----- src/mesa/glapi/dispatch.h | 5 +++++ src/mesa/glapi/gl_offsets.py | 7 +++++-- src/mesa/glapi/gl_table.py | 6 ++++-- src/mesa/glapi/glapidispatch.h | 6 ++++-- src/mesa/glapi/glapioffsets.h | 6 ++++-- src/mesa/glapi/remap_helper.py | 1 - src/mesa/main/api_arrayelt.c | 1 - src/mesa/main/context.c | 1 - src/mesa/main/dispatch.c | 2 +- src/mesa/main/remap_helper.h | 1 - src/mesa/main/vtxfmt_tmp.h | 1 - 12 files changed, 24 insertions(+), 19 deletions(-) (limited to 'src/mesa/glapi/remap_helper.py') diff --git a/src/mesa/Makefile b/src/mesa/Makefile index 8300b30144..6f58ad6161 100644 --- a/src/mesa/Makefile +++ b/src/mesa/Makefile @@ -39,11 +39,7 @@ libmesagallium.a: $(MESA_GALLIUM_OBJECTS) # Make archive of gl* API dispatcher functions only libglapi.a: $(GLAPI_OBJECTS) - @if [ "${WINDOW_SYSTEM}" = "dri" ] ; then \ - touch libglapi.a ; \ - else \ - $(MKLIB) -o glapi -static $(GLAPI_OBJECTS) ; \ - fi + $(MKLIB) -o glapi -static $(GLAPI_OBJECTS) ###################################################################### # Device drivers diff --git a/src/mesa/glapi/dispatch.h b/src/mesa/glapi/dispatch.h index dafcf3e8f2..6623d52469 100644 --- a/src/mesa/glapi/dispatch.h +++ b/src/mesa/glapi/dispatch.h @@ -26,7 +26,12 @@ #ifndef _DISPATCH_H #define _DISPATCH_H +#ifdef IN_DRI_DRIVER +#define _GLAPI_USE_REMAP_TABLE +#endif + #include "glapitable.h" +#include "glapioffsets.h" #include "glapidispatch.h" #endif /* _DISPATCH_H */ diff --git a/src/mesa/glapi/gl_offsets.py b/src/mesa/glapi/gl_offsets.py index 59f8d372b0..ca6c90ffd8 100644 --- a/src/mesa/glapi/gl_offsets.py +++ b/src/mesa/glapi/gl_offsets.py @@ -43,6 +43,9 @@ class PrintGlOffsets(gl_XML.gl_print_base): def printBody(self, api): abi = [ "1.0", "1.1", "1.2", "GL_ARB_multitexture" ] + print '/* this file should not be included directly in mesa */' + print '' + functions = [] abi_functions = [] count = 0 @@ -60,7 +63,7 @@ class PrintGlOffsets(gl_XML.gl_print_base): last_static = f.offset print '' - print '#if !defined(IN_DRI_DRIVER)' + print '#if !defined(_GLAPI_USE_REMAP_TABLE)' print '' for [f, index] in functions: @@ -76,7 +79,7 @@ class PrintGlOffsets(gl_XML.gl_print_base): print '#define _gloffset_%s driDispatchRemapTable[%s_remap_index]' % (f.name, f.name) print '' - print '#endif /* !defined(IN_DRI_DRIVER) */' + print '#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */' return diff --git a/src/mesa/glapi/gl_table.py b/src/mesa/glapi/gl_table.py index 6cf26f89db..0e05b3431a 100644 --- a/src/mesa/glapi/gl_table.py +++ b/src/mesa/glapi/gl_table.py @@ -79,6 +79,8 @@ class PrintRemapTable(gl_XML.gl_print_base): def printRealHeader(self): print """ +/* this file should not be included directly in mesa */ + /** * \\file glapidispatch.h * Macros for handling GL dispatch tables. @@ -132,7 +134,7 @@ class PrintRemapTable(gl_XML.gl_print_base): print '' - print '#if !defined(IN_DRI_DRIVER)' + print '#if !defined(_GLAPI_USE_REMAP_TABLE)' print '' for [f, index] in functions: @@ -162,7 +164,7 @@ class PrintRemapTable(gl_XML.gl_print_base): print '' - print '#endif /* !defined(IN_DRI_DRIVER) */' + print '#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */' return diff --git a/src/mesa/glapi/glapidispatch.h b/src/mesa/glapi/glapidispatch.h index 1d26dfb5bf..d6ba92824a 100644 --- a/src/mesa/glapi/glapidispatch.h +++ b/src/mesa/glapi/glapidispatch.h @@ -29,6 +29,8 @@ # define _GLAPI_DISPATCH_H_ +/* this file should not be included directly in mesa */ + /** * \file glapidispatch.h * Macros for handling GL dispatch tables. @@ -1281,7 +1283,7 @@ #define GET_MultiTexCoord4svARB(disp) ((disp)->MultiTexCoord4svARB) #define SET_MultiTexCoord4svARB(disp, fn) ((disp)->MultiTexCoord4svARB = fn) -#if !defined(IN_DRI_DRIVER) +#if !defined(_GLAPI_USE_REMAP_TABLE) #define CALL_AttachShader(disp, parameters) (*((disp)->AttachShader)) parameters #define GET_AttachShader(disp) ((disp)->AttachShader) @@ -4000,6 +4002,6 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ]; #define GET_GetQueryObjectui64vEXT(disp) GET_by_offset(disp, driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index]) #define SET_GetQueryObjectui64vEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index], fn) -#endif /* !defined(IN_DRI_DRIVER) */ +#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */ #endif /* !defined( _GLAPI_DISPATCH_H_ ) */ diff --git a/src/mesa/glapi/glapioffsets.h b/src/mesa/glapi/glapioffsets.h index a3807744ff..3d10260a05 100644 --- a/src/mesa/glapi/glapioffsets.h +++ b/src/mesa/glapi/glapioffsets.h @@ -29,6 +29,8 @@ #if !defined( _GLAPI_OFFSETS_H_ ) # define _GLAPI_OFFSETS_H_ +/* this file should not be included directly in mesa */ + #define _gloffset_NewList 0 #define _gloffset_EndList 1 #define _gloffset_CallList 2 @@ -438,7 +440,7 @@ #define _gloffset_MultiTexCoord4sARB 406 #define _gloffset_MultiTexCoord4svARB 407 -#if !defined(IN_DRI_DRIVER) +#if !defined(_GLAPI_USE_REMAP_TABLE) #define _gloffset_AttachShader 408 #define _gloffset_CreateProgram 409 @@ -1219,6 +1221,6 @@ #define _gloffset_GetQueryObjecti64vEXT driDispatchRemapTable[GetQueryObjecti64vEXT_remap_index] #define _gloffset_GetQueryObjectui64vEXT driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index] -#endif /* !defined(IN_DRI_DRIVER) */ +#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */ #endif /* !defined( _GLAPI_OFFSETS_H_ ) */ diff --git a/src/mesa/glapi/remap_helper.py b/src/mesa/glapi/remap_helper.py index 7e68a908e3..e47583a5d3 100644 --- a/src/mesa/glapi/remap_helper.py +++ b/src/mesa/glapi/remap_helper.py @@ -65,7 +65,6 @@ class PrintGlRemap(gl_XML.gl_print_base): def printRealHeader(self): print '#include "glapi/dispatch.h"' - print '#include "glapi/glapioffsets.h"' print '' return diff --git a/src/mesa/main/api_arrayelt.c b/src/mesa/main/api_arrayelt.c index a058227110..469b4529f9 100644 --- a/src/mesa/main/api_arrayelt.c +++ b/src/mesa/main/api_arrayelt.c @@ -32,7 +32,6 @@ #include "context.h" #include "imports.h" #include "macros.h" -#include "glapi/glapioffsets.h" #include "glapi/dispatch.h" typedef void (GLAPIENTRY *array_func)( const void * ); diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index ea820d77b3..c57d7c10b6 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -133,7 +133,6 @@ #include "viewport.h" #include "vtxfmt.h" #include "glapi/glthread.h" -#include "glapi/glapioffsets.h" #include "glapi/glapitable.h" #include "shader/program.h" #include "shader/prog_print.h" diff --git a/src/mesa/main/dispatch.c b/src/mesa/main/dispatch.c index bf1a013789..97d213e8e1 100644 --- a/src/mesa/main/dispatch.c +++ b/src/mesa/main/dispatch.c @@ -43,6 +43,7 @@ #include "main/compiler.h" #include "glapi/glapi.h" #include "glapi/glapitable.h" +#include "glapi/glapidispatch.h" #include "glapi/glthread.h" @@ -88,7 +89,6 @@ #define GLAPIENTRY #endif -#include "glapi/dispatch.h" #include "glapi/glapitemp.h" #endif /* USE_X86_ASM */ diff --git a/src/mesa/main/remap_helper.h b/src/mesa/main/remap_helper.h index 89192d37e5..3886f41862 100644 --- a/src/mesa/main/remap_helper.h +++ b/src/mesa/main/remap_helper.h @@ -26,7 +26,6 @@ */ #include "glapi/dispatch.h" -#include "glapi/glapioffsets.h" struct gl_function_remap { GLint func_index; diff --git a/src/mesa/main/vtxfmt_tmp.h b/src/mesa/main/vtxfmt_tmp.h index d56a2bb95e..ae636fb24f 100644 --- a/src/mesa/main/vtxfmt_tmp.h +++ b/src/mesa/main/vtxfmt_tmp.h @@ -30,7 +30,6 @@ #endif #include "glapi/dispatch.h" -#include "glapi/glapioffsets.h" static void GLAPIENTRY TAG(ArrayElement)( GLint i ) { -- cgit v1.2.3