Ian Romanick wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Ian Romanick wrote:
> 
>> Normally when an application calls glXGetProcAddress a dummy stub is
>> created.  In the current implementation, a dispatch offset is not
>> assigned at this time.  The existing code expects that the driver will
>> later ask for the function to be added and will provide a dispatch
>> offset.  This is actually a bug, and it prevents drivers that support,
>> for example, APPLE_vertex_array_object from working with versions of
>> libGL that don't.  Once I commit a fix for that, libGL could assign a
>> dispatch offset when glXGetProcAddress is called.
>>
>> This would allow libGL to create a fully functional dispatch stub on
>> x86.  In fact, libGL could create an entire page of dispatch stubs the
>> first time glXGetProcAddress is called.  This can be done on x86 because
>> the dispatch function is independent of the parameter signature of the
>> function being dispatched.
>>
>> x86-64 and PowerPC do not share this feature.  Since these platforms
>> pass all parameters in registers, the dispatch function for glBegin is
>> different from the dispatch function for glTexImage2D.  When
>> glXGetProcAddress is called it is impossible to know what the parameter
>> signature, and thus the contents of the dispatch stub, should be.  This
>> prevents those platforms from being able to create a page of dispatch
>> stubs at a time.
>>
>> I guess we could do a single dispatch function per page, but since the
>> dispatch functions are on the order of 128 bytes, that seems awfully
>> wasteful.
> 
> I've done some work on this over the past couple days.  I should be able
> to post a patch for review that covers at least x86 and x86-64 in the
> next couple days.
> 
> I've created a mechanism where a set of bins for dispatch functions are
> created.  There is one bin for each possible dispatch function
> configuration.  On platforms that do not require register saves in
> dispatch functions, there is one bin.  For platforms that require
> register saves (e.g., x86-64 with pthreads), there is one bin per
> register save configuration.  On x86-64 with pthreads, this means there
> are (6 + 1) * (8 + 1) = 63 bins.  I arrived at this number because
> between 0 and 6 integer registers and between 0 and 8 floating point
> registers must be saved.
> 
> There are two cases when a dispatch function is created.  A driver can
> ask for a dispatch function (it actually asks for the offset, but both
> are generated at the same time).  When requesting a dispatch function,
> the driver supplies a parameter signature, and an optimal bin selection
> can be made.  libGL can also ask for a dispatch function when an
> application calls glXGetProcAddress.  When libGL requests a function,
> the parameter signature is not available, and a pessimistic bin is selected.
> 
> Each bin tracks a page of dispatch functions with pre-assigned dispatch
> offsets.  When a function is requested, the next available function in
> the page and its associated dispatch offset is returned.  When the last
> function from a page is returned, a new page is allocated and filled
> with functions.  This enables all the right mprotect-fu to be done at
> the right times.
> 
> There is one catch, and I'm not sure how to resolve it.  When a driver
> requests a function, it can request a set of identical functions with
> different names.  For example, the driver can request that
> glWindowPos3f, glWindowPos3fARB, and glWindowPos3fMESA be created as
> aliases for each other.  All three will share the same dispatch offset
> (very important) and the same dispatch function (not as important).
> 
> However, if the application calls glXGetProcAddress("glWindowPos3f")
> *and* glXGetProcAddress("glWindowPos3fARB") before the driver is loaded,
> those functions will have different dispatch offsets.  That would be
> bad.  This is a silly, but perfectly valid thing for an application to
> do.  The app will segfault when it tries to call one of the two
> functions but function correctly when it calls the other.  This will
> result in difficult to diagnose bug reports being filed on Mesa.
> 
> Any suggestions?  If possible, I'd like for this to be resolved for Mesa
> 6.5.1.

Can the two extra/redundant entrypoints be detected and then hardwired 
to double-dispatch back to the single, correct entrypoint?

Or set up the redundant dispatch entries to dispatch to a seperate 
routine that then bounces back through the dispatch table to the correct 
entrypoint?

Keith

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to