AIGLX Update
David Reveman
davidr at novell.com
Fri Feb 24 08:48:12 PST 2006
On Fri, 2006-02-24 at 01:07 -0500, Kristian Høgsberg wrote:
> Hi,
>
> Here's an updated accelerated indirect glx patch. At this point I'd say
> it's ready to merge to head, but it's a pretty big patch, so I'll give a
> overview of what changed and why. The patch is just under 200k (6300
> lines), so I've put it it on freedesktop.org instead of attaching it:
>
> http://freedesktop.org/~krh/accel-indirect-glx/aiglx-take-2.patch
>
> plus it's on the accel_indirect_branch branch.
>
> As I mentioned at the xdevconf, the previous patch would access the DRI
> driver directly which doesn't work well with platforms or DDXes without
> DRI. Also, to accomodate the software rasterizer and the Xgl glx
> implementation, we need an abstraction layer between the GLX protocol
> code and the GL implementation.
>
> This abstraction layer used to be the __GLinterface and
> __GLdrawablePrivate structs, but they didn't quite fit the bill--more
> than half the function pointers in these struct were unused by the GLX
> protocol code and yet it was necessary to add function pointers outside
> these structs (e.g. to the __GLXdrawablePrivate struct) to provide the
> necessary hooks.
>
> The patch does away with __GLinterface and __GLdrawablePrivate and moves
> the function pointers that GLX actually used from these structs into the
> GLX objects. The new design is heavily inspired by the DRI driver
> interface: There are three primary objects: __GLXscreen (was
> __GLXscreenInfo), __GLXcontext and __GLXdrawable (was
> __GLXdrawablePrivate). To initialize things we have a stack of GL
> "providers" (GLcore, DRI or Xgl) and at extension init time, the GLX
> module loops through the stack and asks each provider to create a
> __GLXscreen for each screen. The first provider that returns a non-NULL
> __GLXscreen gets to drive that screen.
>
> The GLX layer will use the screen object to create contexts and
> drawables as needed using the createContext and createDrawable function
> pointers in the screen object:
>
> __GLXcontext *(*createContext)(__GLXscreenInfo *screen,
> __GLcontextModes *modes,
> __GLXcontext *shareContext);
>
> __GLXdrawablePrivate *(*createDrawablePrivate)(__GLXcontext *context,
> DrawablePtr pDraw,
> XID drawId);
>
> GL implementations extend these three objects by embedding the base
> object in an implementation specific struct. For example, this is what
> the DRI implementation does:
>
> struct __GLXDRIscreen {
> __GLXscreen base;
>
> __DRIscreen driScreen;
> void *driver;
> };
>
> The DRI screen constructor allocates a __GLXDRIscreen struct, but
> returns a __GLXscreen pointer. Likewise, the context and drawable
> constructors in the screen object will allocate DRI specific context and
> drawable objects, but to the GLX core they will look like __GLXcontext
> and __GLXdrawable objects.
>
> The DRI implementation is entirely contained in glxdri.c and is only 768
> lines. It's a pretty good example of how to implement a __GLXprovider,
> and I think it should be pretty easy to port Xgl's glx implementation
> over to uses this design. Xgl occasionally chains to the software
> implementation to implement off-screen rendering. To achieve this, the
> Xgl implementation of __GLXscreen should probably create a mesa
> __GLXscreen and delegate to that to create software rendering contexts.
>
> There's a --enable-glx-dri ./configure option to enable compilation of
> the GLX DRI loader and a --with-dri-driver-path option to specify the
> path to the DRI driver directory. I've added an "AIGLX" server option
> to control wether the server should use the DRI driver or fall back to
> software for indirect rendering. It defaults to off, and to enable it, add
>
> Option "AIGLX"
>
> to the ServerLayout section.
>
> I've added a new sub module load function:
>
> pointer LoadSubModuleLocal(pointer, const char *, const char **,
> const char **, pointer, const
> XF86ModReqInfo *,
> int *, int *);
>
> which loads a module without adding all symbols to the global namespace
> (i.e. it doesn't pass RTLD_GLOBAL to dlopen()). This is to prevent MESA
> symbols in the DRI driver from resolving against identical symbols in
> GLcore as the DRI driver is loaded. I now use this function for loading
> GLcore. This accounts for all the changes in hw/xfree86/loader but is
> only implemented for the dlloader. As we're heading towards a
> dlopen()-only loader, this shouldn't be a problem, though.
>
> Also, the patch drops glxbuf.c, glxbuf.h, glxfb.c, glxfb.h, glxmem.c,
> glxmem.h, glxpix.c, glxpix.h, which weren't actually used before, and
> glximports.c and glximports.h which are now no longer used.
>
> As I said, I think this work is now committable; it plays well with all
> DDXes and can be disabled at ./configure-time. The remaining work is to
> see how this merges with Xgl, but I think this is a step in the right
> direction.
Sounds great Kristian, I'll try to make Xgl use this new interface asap.
>From the overview you've given here I hardly believe that there's going
to be any problems.
Thanks!
-David
More information about the xorg
mailing list