fix GL_DOT3_RGBA texture combiner mode in generated fragment programs (bug #11030)
[mesa.git] / src / mesa / glapi / gl_x86_asm.py
index f5196784fb5cefdef194218035466cc26d0d6216..403e87261b09d3b223de9d2ff90b0d214d0adc3f 100644 (file)
@@ -25,7 +25,8 @@
 # Authors:
 #    Ian Romanick <idr@us.ibm.com>
 
-import gl_XML, license
+import license
+import gl_XML, glX_XML
 import sys, getopt
 
 class PrintGenericStubs(gl_XML.gl_print_base):
@@ -52,18 +53,6 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print '#include "assyntax.h"'
                print '#include "glapioffsets.h"'
                print ''
-               print "/* If we build with gcc's -fvisibility=hidden flag, we'll need to change"
-               print "* the symbol visibility mode to 'default'."
-               print '*/'
-               print '#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303'
-               print '#  pragma GCC visibility push(default)'
-               print '#  define HIDDEN(x) .hidden x'
-               print '#else'
-               print '#  define HIDDEN(x)'
-               print '#endif'
-               print ''
-               print '#ifndef __WIN32__'
-               print ''        
                print '#if defined(STDCALL_API)'
                print '# if defined(USE_MGL_NAMESPACE)'
                print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n2))'
@@ -73,6 +62,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print '#else'
                print '# if defined(USE_MGL_NAMESPACE)'
                print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n))'
+               print '#  define _glapi_Dispatch _mglapi_Dispatch'
                print '# else'
                print '#  define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n))'
                print '# endif'
@@ -92,12 +82,18 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print ''
                print '#ifdef GLX_USE_TLS'
                print ''
+               print '#ifdef GLX_X86_READONLY_TEXT'
+               print '# define CTX_INSNS MOV_L(GS:(EAX), EAX)'
+               print '#else'
+               print '# define CTX_INSNS NOP /* Pad for init_glapi_relocs() */'
+               print '#endif'
+               print ''
                print '#  define GL_STUB(fn,off,fn_alt)\t\t\t\\'
                print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
                print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
                print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
                print '\tCALL(_x86_get_dispatch) ;\t\t\t\\'
-               print '\tNOP ;\t\t\t\t\t\t\\'
+               print '\tCTX_INSNS ;                                    \\'
                print '\tJMP(GL_OFFSET(off))'
                print ''
                print '#elif defined(PTHREADS)'
@@ -105,7 +101,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
                print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
                print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
-               print '\tMOV_L(CONTENT(GLNAME(_glapi_DispatchTSD)), EAX) ;\t\\'
+               print '\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\'
                print '\tTEST_L(EAX, EAX) ;\t\t\t\t\\'
                print '\tJE(1f) ;\t\t\t\t\t\\'
                print '\tJMP(GL_OFFSET(off)) ;\t\t\t\t\\'
@@ -116,7 +112,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print 'ALIGNTEXT16;\t\t\t\t\t\t\\'
                print 'GLOBL_FN(GL_PREFIX(fn, fn_alt));\t\t\t\\'
                print 'GL_PREFIX(fn, fn_alt):\t\t\t\t\t\\'
-               print '\tMOV_L(CONTENT(GLNAME(_glapi_DispatchTSD)), EAX) ;\t\\'
+               print '\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) ;\t\\'
                print '\tTEST_L(EAX, EAX) ;\t\t\t\t\\'
                print '\tJE(1f) ;\t\t\t\t\t\\'
                print '\tJMP(GL_OFFSET(off)) ;\t\t\t\t\\'
@@ -148,7 +144,10 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print '\tHIDDEN(GLNAME(_x86_get_dispatch))'
                print 'ALIGNTEXT16'
                print 'GLNAME(_x86_get_dispatch):'
-               print '\tmovl\t%gs:_glapi_tls_Dispatch@NTPOFF, %eax'
+               print '\tcall   1f'
+               print '1:\tpopl %eax'
+               print '\taddl   $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax'
+               print '\tmovl   _glapi_tls_Dispatch@GOTNTPOFF(%eax), %eax'
                print '\tret'
                print ''
                print '#elif defined(PTHREADS)'
@@ -168,7 +167,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print '#endif'
                print ''
 
-               print '#if defined( GLX_USE_TLS )'
+               print '#if defined( GLX_USE_TLS ) && !defined( GLX_X86_READONLY_TEXT )'
                print '\t\t.section\twtext, "awx", @progbits'
                print '#endif /* defined( GLX_USE_TLS ) */'
 
@@ -201,26 +200,41 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print '3:       .p2align 2        /* pad out section */'
                print '#endif /* GLX_USE_TLS */'
                print ''
-               print '#endif  /* __WIN32__ */'
+               print '#if defined (__ELF__) && defined (__linux__)'
+               print ' .section .note.GNU-stack,"",%progbits'
+               print '#endif'
                return
 
 
        def printBody(self, api):
                for f in api.functionIterateByOffset():
+                       name = f.dispatch_name()
                        stack = self.get_stack_size(f)
+                       alt = "%s@%u" % (name, stack)
+
+                       print '\tGL_STUB(%s, _gloffset_%s, %s)' % (name, f.name, alt)
+
+                       if not f.is_static_entry_point(f.name):
+                               print '\tHIDDEN(GL_PREFIX(%s, %s))' % (name, alt)
 
-                       alt = "%s@%u" % (f.name, stack)
-                       print '\tGL_STUB(%s, _gloffset_%s, %s)' % (f.name, f.name, alt)
 
                for f in api.functionIterateByOffset():
+                       name = f.dispatch_name()
                        stack = self.get_stack_size(f)
+                       alt = "%s@%u" % (name, stack)
 
-                       alt = "%s@%u" % (f.name, stack)
+                       if f.is_static_entry_point(f.name):
+                               for n in f.entry_points:
+                                       if n != f.name:
+                                               alt2 = "%s@%u" % (n, stack)
+                                               text = '\tGL_STUB_ALIAS(%s, _gloffset_%s, %s, %s, %s)' % (n, f.name, alt2, f.name, alt)
 
-                       for n in f.entry_points:
-                               if n != f.name:
-                                       alt2 = "%s@%u" % (n, stack)
-                                       print '\tGL_STUB_ALIAS(%s, _gloffset_%s, %s, %s, %s)' % (n, f.name, alt2, f.name, alt)
+                                               if f.has_different_protocol(n):
+                                                       print '#ifndef GLX_INDIRECT_RENDERING'
+                                                       print text
+                                                       print '#endif'
+                                               else:
+                                                       print text
 
                return
 
@@ -249,6 +263,5 @@ if __name__ == '__main__':
                print "ERROR: Invalid mode \"%s\" specified." % mode
                show_usage()
 
-       api = gl_XML.parse_GL_API( file_name )
-
-       printer.Print( api )
+       api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
+       printer.Print(api)