Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / mesa / glapi / glX_proto_send.py
index 30ffd2b1d7de1c9b9685dbc83738fed3c9ce3c93..daca1b767a3cbcaf47d3eed20430f91de61b058f 100644 (file)
@@ -166,9 +166,12 @@ class PrintGlxProtoStubs(glX_proto_common.glx_print_proto):
                print '#include "indirect.h"'
                print '#include "glxclient.h"'
                print '#include "indirect_size.h"'
+               print '#include "dispatch.h"'
+               print '#include "glapi.h"'
+               print '#include "glthread.h"'
                print '#include <GL/glxproto.h>'
                print '#ifdef USE_XCB'
-               print '#include <X11/xcl.h>'
+               print '#include <X11/Xlib-xcb.h>'
                print '#include <xcb/xcb.h>'
                print '#include <xcb/glx.h>'
                print '#endif /* USE_XCB */'
@@ -330,7 +333,7 @@ const GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
                                        if image.img_pad_dimensions:
                                                do_it = 1
                                                break
-                       
+
 
                                if do_it:
                                        [h, n] = hash_pixel_function(func)
@@ -341,26 +344,48 @@ const GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
                                                generated_stubs.append(h)
 
                                                fake_func = glx_pixel_function_stub( func, n )
-                                               self.printFunction( fake_func )
+                                               self.printFunction(fake_func, fake_func.name)
 
 
-                       self.printFunction( func )
+                       self.printFunction(func, func.name)
+                       if func.glx_sop and func.glx_vendorpriv:
+                               self.printFunction(func, func.glx_vendorpriv_names[0])
 
                return
 
 
-       def printFunction(self, func):
+       def printFunction(self, func, name):
+               footer = '}\n'
                if func.glx_rop == ~0:
                        print 'static %s' % (func.return_type)
                        print '%s( unsigned opcode, unsigned dim, %s )' % (func.name, func.get_parameter_string())
+                       print '{'
                else:
-                       print '#define %s %d' % (func.opcode_name(), func.opcode_value())
-
-                       print '%s' % (func.return_type)
-                       print '__indirect_gl%s(%s)' % (func.name, func.get_parameter_string())
-
+                       if func.has_different_protocol(name):
+                               if func.return_type == "void":
+                                       ret_string = ''
+                               else:
+                                       ret_string = "return "
+
+                               func_name = func.static_glx_name(name)
+                               print '#define %s %d' % (func.opcode_vendor_name(name), func.glx_vendorpriv)
+                               print '%s gl%s(%s)' % (func.return_type, func_name, func.get_parameter_string())
+                               print '{'
+                               print '    __GLXcontext * const gc = __glXGetCurrentContext();'
+                               print ''
+                               print '#ifdef GLX_DIRECT_RENDERING'
+                               print '    if (gc->driContext) {'
+                               print '    %sCALL_%s(GET_DISPATCH(), (%s));' % (ret_string, func.name, func.get_called_parameter_string())
+                               print '    } else'
+                               print '#endif'
+                               print '    {'
+
+                               footer = '}\n}\n'
+                       else:
+                               print '#define %s %d' % (func.opcode_name(), func.opcode_value())
 
-               print '{'
+                               print '%s __indirect_gl%s(%s)' % (func.return_type, name, func.get_parameter_string())
+                               print '{'
 
 
                if func.glx_rop != 0 or func.vectorequiv != None:
@@ -369,14 +394,12 @@ const GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
                        else:
                                self.printRenderFunction(func)
                elif func.glx_sop != 0 or func.glx_vendorpriv != 0:
-                       self.printSingleFunction(func)
+                       self.printSingleFunction(func, name)
                        pass
                else:
-                       print "/* Missing GLX protocol for %s. */" % (func.name)
-
-               print '}'
-               print ''
+                       print "/* Missing GLX protocol for %s. */" % (name)
 
+               print footer
                return
 
 
@@ -403,7 +426,10 @@ generic_%u_byte( GLint rop, const void * ptr )
                else:
                        src_ptr = "&" + p.name
 
-               if not extra_offset:
+               if p.is_padding:
+                       print '(void) memset((void *)(%s + %u), 0, %s);' \
+                           % (pc, p.offset + adjust, p.size_string() )
+               elif not extra_offset:
                        print '(void) memcpy((void *)(%s + %u), (void *)(%s), %s);' \
                            % (pc, p.offset + adjust, src_ptr, p.size_string() )
                else:
@@ -453,6 +479,10 @@ generic_%u_byte( GLint rop, const void * ptr )
                                else:
                                        dim_str = str(dim)
 
+                               if param.is_padding:
+                                       print '(void) memset((void *)(%s + %u), 0, %s);' \
+                                       % (pc, (param.offset - 4) + adjust, param.size_string() )
+
                                if param.img_null_flag:
                                        if large:
                                                print '(void) memcpy((void *)(%s + %u), zero, 4);' % (pc, (param.offset - 4) + adjust)
@@ -492,7 +522,7 @@ generic_%u_byte( GLint rop, const void * ptr )
                return
 
 
-       def common_func_print_just_start(self, f):
+       def common_func_print_just_start(self, f, name):
                print '    __GLXcontext * const gc = __glXGetCurrentContext();'
 
                # The only reason that single and vendor private commands need
@@ -510,7 +540,7 @@ generic_%u_byte( GLint rop, const void * ptr )
 
                if not f.glx_rop:
                        for p in f.parameterIterateOutputs():
-                               if p.is_image():
+                               if p.is_image() and (p.img_format != "GL_COLOR_INDEX" or p.img_type != "GL_BITMAP"):
                                        print '    const __GLXattribute * const state = gc->client_state_private;'
                                        break
 
@@ -526,11 +556,23 @@ generic_%u_byte( GLint rop, const void * ptr )
                        print '    %s retval = (%s) 0;' % (f.return_type, f.return_type)
 
 
+               if name != None and name not in f.glx_vendorpriv_names:
+                       print '#ifndef USE_XCB'
                self.emit_packet_size_calculation(f, 0)
+               if name != None and name not in f.glx_vendorpriv_names:
+                       print '#endif'
 
                condition_list = []
                for p in f.parameterIterateCounters():
                        condition_list.append( "%s >= 0" % (p.name) )
+                       # 'counter' parameters cannot be negative
+                       print "    if (%s < 0) {" % p.name
+                       print "        __glXSetError(gc, GL_INVALID_VALUE);"
+                       if f.return_type != 'void':
+                               print "        return 0;"
+                       else:
+                               print "        return;"
+                       print "    }"
 
                if skip_condition:
                        condition_list.append( skip_condition )
@@ -547,13 +589,13 @@ generic_%u_byte( GLint rop, const void * ptr )
                        return 0
 
 
-       def printSingleFunction(self, f):
-               self.common_func_print_just_start(f)
+       def printSingleFunction(self, f, name):
+               self.common_func_print_just_start(f, name)
 
                if self.debug:
                        print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
 
-               if f.glx_vendorpriv == 0:
+               if name not in f.glx_vendorpriv_names:
 
                        # XCB specific:
                        print '#ifdef USE_XCB'
@@ -561,7 +603,7 @@ generic_%u_byte( GLint rop, const void * ptr )
                                print '        printf("\\tUsing XCB.\\n");'
                        print '        xcb_connection_t *c = XGetXCBConnection(dpy);'
                        print '        (void) __glXFlushRenderBuffer(gc, gc->pc);'
-                       xcb_name = 'xcb_glx%s' % convertStringForXCB(f.name)
+                       xcb_name = 'xcb_glx%s' % convertStringForXCB(name)
 
                        iparams=[]
                        extra_iparams = []
@@ -613,8 +655,8 @@ generic_%u_byte( GLint rop, const void * ptr )
                else:
                        pc_decl = "(void)"
 
-               if f.glx_vendorpriv != 0:
-                       print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_name())
+               if name in f.glx_vendorpriv_names:
+                       print '        %s __glXSetupVendorRequest(gc, %s, %s, cmdlen);' % (pc_decl, f.opcode_real_name(), f.opcode_vendor_name(name))
                else:
                        print '        %s __glXSetupSingleRequest(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
 
@@ -686,12 +728,12 @@ generic_%u_byte( GLint rop, const void * ptr )
                        print '        __indirect_glFinish();'
 
                if self.debug:
-                       print '        printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
+                       print '        printf( "Exit %%s.\\n", "gl%s" );' % (name)
 
 
                print '        UnlockDisplay(dpy); SyncHandle();'
 
-               if f.glx_vendorpriv == 0:
+               if name not in f.glx_vendorpriv_names:
                        print '#endif /* USE_XCB */'
 
                print '    }'
@@ -708,6 +750,9 @@ generic_%u_byte( GLint rop, const void * ptr )
 
                        p_string = ""
                        for param in f.parameterIterateGlxSend():
+                               if param.is_padding:
+                                       continue
+
                                p_string += ", " + param.name
 
                                if param.is_image():
@@ -720,7 +765,7 @@ generic_%u_byte( GLint rop, const void * ptr )
                        return
 
 
-               if self.common_func_print_just_start(f):
+               if self.common_func_print_just_start(f, None):
                        trailer = "    }"
                else:
                        trailer = None
@@ -772,7 +817,7 @@ generic_%u_byte( GLint rop, const void * ptr )
                                        print '    generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
                                        return
 
-               if self.common_func_print_just_start(f):
+               if self.common_func_print_just_start(f, None):
                        trailer = "    }"
                else:
                        trailer = None
@@ -940,7 +985,20 @@ extern HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest(
 
        def printBody(self, api):
                for func in api.functionIterateGlx():
-                       print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, func.get_parameter_string())
+                       params = func.get_parameter_string()
+
+                       print 'extern HIDDEN %s __indirect_gl%s(%s);' % (func.return_type, func.name, params)
+
+                       for n in func.entry_points:
+                               if func.has_different_protocol(n):
+                                       asdf = func.static_glx_name(n)
+                                       if asdf not in func.static_entry_points:
+                                               print 'extern HIDDEN %s gl%s(%s);' % (func.return_type, asdf, params)
+                                       else:
+                                               print 'GLAPI %s GLAPIENTRY gl%s(%s);' % (func.return_type, asdf, params)
+                                               
+                                       break
+
 
 
 def show_usage():