From 2f19fecd583a4406385708de6362b3bdef23811e Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 13 Jan 2009 18:08:24 +0000 Subject: xlib: allow winsys's to register themselves with glx/xlib state tracker --- src/gallium/state_trackers/glx/dri/dri_drawable.c | 3 +-- src/gallium/state_trackers/glx/xlib/xm_api.c | 21 +++++++++++---- src/gallium/state_trackers/glx/xlib/xm_winsys.h | 31 +++++++++++++---------- 3 files changed, 35 insertions(+), 20 deletions(-) (limited to 'src/gallium/state_trackers/glx') diff --git a/src/gallium/state_trackers/glx/dri/dri_drawable.c b/src/gallium/state_trackers/glx/dri/dri_drawable.c index d5006cc016..b712acda88 100644 --- a/src/gallium/state_trackers/glx/dri/dri_drawable.c +++ b/src/gallium/state_trackers/glx/dri/dri_drawable.c @@ -142,8 +142,7 @@ dri_display_surface(__DRIdrawablePrivate *dPriv, drawable->last_swap_fence = drawable->first_swap_fence; drawable->first_swap_fence = NULL; - /* The lock_hardware is required for the cliprects. Buffer offsets - * should work regardless. + /* Call lock_hardware to update dPriv cliprects. */ dri_lock_hardware(context, drawable); { diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c index 82d125b5f3..4811641559 100644 --- a/src/gallium/state_trackers/glx/xlib/xm_api.c +++ b/src/gallium/state_trackers/glx/xlib/xm_api.c @@ -71,6 +71,18 @@ #include "xm_winsys.h" #include + +/* Driver interface routines, set up by xlib backend on library + * _init(). These are global in the same way that function names are + * global. + */ +static struct xm_driver driver; + +void xmesa_set_driver( const struct xm_driver *templ ) +{ + driver = *templ; +} + /** * Global X driver lock */ @@ -756,17 +768,17 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) /* XXX: create once per Xlib Display. */ - winsys = xmesa_create_pipe_winsys(); + winsys = driver.create_pipe_winsys(); if (winsys == NULL) goto fail; /* XXX: create once per Xlib Display. */ - screen = xmesa_create_pipe_screen( winsys ); + screen = driver.create_pipe_screen( winsys ); if (screen == NULL) goto fail; - pipe = xmesa_create_pipe_context( screen, + pipe = driver.create_pipe_context( screen, (void *)c ); if (pipe == NULL) goto fail; @@ -1118,8 +1130,7 @@ void XMesaSwapBuffers( XMesaBuffer b ) surf = st_get_framebuffer_surface(b->stfb, ST_SURFACE_BACK_LEFT); if (surf) { - xmesa_display_surface(b, surf); -// xmesa_display_surface(b, surf); + driver.display_surface(b, surf); } xmesa_check_and_update_buffer_size(NULL, b); diff --git a/src/gallium/state_trackers/glx/xlib/xm_winsys.h b/src/gallium/state_trackers/glx/xlib/xm_winsys.h index b22d65a569..8b6d1644e8 100644 --- a/src/gallium/state_trackers/glx/xlib/xm_winsys.h +++ b/src/gallium/state_trackers/glx/xlib/xm_winsys.h @@ -36,22 +36,27 @@ struct pipe_surface; struct xmesa_buffer; -/* Will turn this into a callback-style interface. For now, these - * have fixed names, and are implemented in the winsys/xlib directory. - */ -struct pipe_winsys *xmesa_create_pipe_winsys( void ); - -struct pipe_screen *xmesa_create_pipe_screen( struct pipe_winsys * ); - -/* The context_private argument needs to go away. Is currently used - * in a round-about way to associate a display-target surface with its - * Xlib window. - */ -struct pipe_context *xmesa_create_pipe_context( struct pipe_screen *, +struct xm_driver { + + struct pipe_winsys *(*create_pipe_winsys)( void ); + + struct pipe_screen *(*create_pipe_screen)( struct pipe_winsys * ); + + /* The context_private argument needs to go away. Is currently used + * in a round-about way to associate a display-target surface with its + * Xlib window. + */ + struct pipe_context *(*create_pipe_context)( struct pipe_screen *, void *context_private ); -void xmesa_display_surface( struct xmesa_buffer *, + void (*display_surface)( struct xmesa_buffer *, struct pipe_surface * ); +}; + + +extern void +xmesa_set_driver( const struct xm_driver *driver ); + #endif -- cgit v1.2.3