Mesa (gallium-sw-api): gallium: wip on software api

Keith Whitwell keithw at kemper.freedesktop.org
Thu Feb 11 15:16:33 UTC 2010


Module: Mesa
Branch: gallium-sw-api
Commit: 76f8074b54ebd4ae68e2ed31c6ade301603cbda5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=76f8074b54ebd4ae68e2ed31c6ade301603cbda5

Author: Keith Whitwell <keithw at vmware.com>
Date:   Mon Feb  8 17:17:43 2010 +0000

gallium: wip on software api

Will eventually provide an equivalent to the drm_api struct for the
software rasterizers.

Currently still reliant on the "xmesa_buffer" struct from the glx/x11
state tracker, but that will be removed from the interface by the time
this is complete.

---

 src/gallium/drivers/trace/Makefile                 |    1 +
 src/gallium/drivers/trace/SConscript               |    1 +
 .../glx/xlib => include/state_tracker}/xm_winsys.h |   17 +++++-
 src/gallium/state_trackers/glx/xlib/xm_api.c       |   51 ++++++++++---------
 src/gallium/winsys/xlib/xlib.c                     |   52 +++++---------------
 src/gallium/winsys/xlib/xlib.h                     |    2 +-
 src/gallium/winsys/xlib/xlib_cell.c                |   25 +++-------
 src/gallium/winsys/xlib/xlib_llvmpipe.c            |    7 ++-
 src/gallium/winsys/xlib/xlib_softpipe.c            |   24 ++-------
 9 files changed, 71 insertions(+), 109 deletions(-)

diff --git a/src/gallium/drivers/trace/Makefile b/src/gallium/drivers/trace/Makefile
index dd6831c..ab421f0 100644
--- a/src/gallium/drivers/trace/Makefile
+++ b/src/gallium/drivers/trace/Makefile
@@ -12,6 +12,7 @@ C_SOURCES = \
 	tr_state.c \
 	tr_rbug.c \
 	tr_drm.c \
+	tr_x11.c \
 	tr_texture.c
 
 include ../../Makefile.template
diff --git a/src/gallium/drivers/trace/SConscript b/src/gallium/drivers/trace/SConscript
index c1675d1..f208ae6 100644
--- a/src/gallium/drivers/trace/SConscript
+++ b/src/gallium/drivers/trace/SConscript
@@ -8,6 +8,7 @@ trace = env.ConvenienceLibrary(
         'tr_buffer.c',
         'tr_context.c',
         'tr_drm.c',
+        'tr_x11.c',
         'tr_dump.c',
         'tr_dump_state.c',
         'tr_screen.c',
diff --git a/src/gallium/state_trackers/glx/xlib/xm_winsys.h b/src/gallium/include/state_tracker/xm_winsys.h
similarity index 74%
rename from src/gallium/state_trackers/glx/xlib/xm_winsys.h
rename to src/gallium/include/state_tracker/xm_winsys.h
index 4bd5b5c..29969f1 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_winsys.h
+++ b/src/gallium/include/state_tracker/xm_winsys.h
@@ -32,21 +32,32 @@
 struct pipe_context;
 struct pipe_screen;
 struct pipe_surface;
+
+
+/* XXX: remove the xmesa_buffer concept from this interface
+ */
 struct xmesa_buffer;
 
 
 struct xm_driver {
 
-   struct pipe_screen *(*create_pipe_screen)( void );
+   struct pipe_screen *(*create_screen)( struct xm_driver *driver );
 
-   void (*display_surface)( struct xmesa_buffer *, 
+   void (*display_surface)( struct xm_driver *driver,
+                            struct xmesa_buffer *, /* XXX: remove me! */
                             struct pipe_surface * );
 
+   void (*destroy)( struct xm_driver *driver );
+
 };
 
 
+/* Currently called by the driver/winsys to register an xm_driver.
+ * Note that this is the opposite usage to drm_api.h/drm_api_create(),
+ * which is called by the state tracker.
+ */
 extern void
-xmesa_set_driver( const struct xm_driver *driver );
+xmesa_set_driver( struct xm_driver *driver );
 
 
 #endif
diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c
index fb314f3..38d4ba5 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_api.c
+++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
@@ -67,11 +67,7 @@
 #include "pipe/p_screen.h"
 #include "pipe/p_context.h"
 
-#include "trace/tr_screen.h"
-#include "trace/tr_context.h"
-#include "trace/tr_texture.h"
-
-#include "xm_winsys.h"
+#include "state_tracker/xm_winsys.h"
 #include <GL/glx.h>
 
 
@@ -79,11 +75,11 @@
  * _init().  These are global in the same way that function names are
  * global.
  */
-static struct xm_driver driver;
+static struct xm_driver *driver = NULL;
 
-void xmesa_set_driver( const struct xm_driver *templ )
+void xmesa_set_driver( struct xm_driver *_driver )
 {
-   driver = *templ;
+   driver = _driver;
 }
 
 /**
@@ -91,7 +87,6 @@ void xmesa_set_driver( const struct xm_driver *templ )
  */
 pipe_mutex _xmesa_lock;
 
-static struct pipe_screen *_screen = NULL;
 static struct pipe_screen *screen = NULL;
 
 
@@ -748,6 +743,21 @@ void XMesaDestroyVisual( XMesaVisual v )
 }
 
 
+static void
+xm_flush_frontbuffer(struct pipe_screen *screen,
+                     struct pipe_surface *surf,
+                     void *context_private)
+{
+   /*
+    * The front color buffer is actually just another XImage buffer.
+    * This function copies that XImage to the actual X Window.
+    */
+   XMesaContext xmctx = (XMesaContext) context_private;
+   xlib_softpipe_display_surface(driver, xmctx->xm_buffer, surf);
+   xmesa_check_and_update_buffer_size(xmctx, xmctx->xm_buffer);
+}
+
+
 
 /**
  * Create a new XMesaContext.
@@ -767,8 +777,12 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
 
    if (firstTime) {
       pipe_mutex_init(_xmesa_lock);
-      _screen = driver.create_pipe_screen();
-      screen = trace_screen_create( _screen );
+      screen = driver->create_screen( driver );
+
+      /* Provide our own flush_frontbuffer:
+       */
+      screen->flush_frontbuffer = xm_flush_frontbuffer;
+
       firstTime = GL_FALSE;
    }
 
@@ -821,13 +835,6 @@ PUBLIC
 void XMesaDestroyContext( XMesaContext c )
 {
    st_destroy_context(c->st);
-
-   /* FIXME: We should destroy the screen here, but if we do so, surfaces may 
-    * outlive it, causing segfaults
-   struct pipe_screen *screen = c->st->pipe->screen; 
-   screen->destroy(screen);
-   */
-
    _mesa_free(c);
 }
 
@@ -1119,13 +1126,7 @@ void XMesaSwapBuffers( XMesaBuffer b )
    st_swapbuffers(b->stfb, &frontLeftSurf, NULL);
 
    if (frontLeftSurf) {
-      if (_screen != screen) {
-         struct trace_surface *tr_surf = trace_surface( frontLeftSurf );
-         struct pipe_surface *surf = tr_surf->surface;
-         frontLeftSurf = surf;
-      }
-
-      driver.display_surface(b, frontLeftSurf);
+      driver->display_surface(driver, b, frontLeftSurf);
    }
 
    xmesa_check_and_update_buffer_size(NULL, b);
diff --git a/src/gallium/winsys/xlib/xlib.c b/src/gallium/winsys/xlib/xlib.c
index 67617a4..db42212 100644
--- a/src/gallium/winsys/xlib/xlib.c
+++ b/src/gallium/winsys/xlib/xlib.c
@@ -32,64 +32,36 @@
  */
 
 #include "xlib.h"
-#include "xm_winsys.h"
+#include "trace/tr_x11.h"
 
 #include <stdlib.h>
 #include <assert.h>
 
-/* Todo, replace all this with callback-structs provided by the
- * individual implementations.
- */
-
-enum mode {
-   MODE_CELL,
-   MODE_LLVMPIPE,
-   MODE_SOFTPIPE
-};
 
 /* advertise OpenGL support */
 PUBLIC const int st_api_OpenGL = 1;
 
-static enum mode get_mode()
-{
-#ifdef GALLIUM_CELL
-   if (!getenv("GALLIUM_NOCELL")) 
-      return MODE_CELL;
-#endif
-
-#if defined(GALLIUM_LLVMPIPE)
-   return MODE_LLVMPIPE;
-#else
-   return MODE_SOFTPIPE;
-#endif
-}
-
 static void _init( void ) __attribute__((constructor));
-
 static void _init( void )
 {
-   enum mode xlib_mode = get_mode();
+   struct xm_driver *driver = NULL;
 
-   switch (xlib_mode) {
-   case MODE_CELL:
 #if defined(GALLIUM_CELL)
-      xmesa_set_driver( &xlib_cell_driver );
+   if (driver == NULL && !getenv("GALLIUM_NOCELL")) 
+      driver = &xlib_cell_driver;
 #endif
-      break;
-   case MODE_LLVMPIPE:
+
 #if defined(GALLIUM_LLVMPIPE)
-      xmesa_set_driver( &xlib_llvmpipe_driver );
+   if (driver == NULL)
+      driver = &xlib_llvmpipe_driver;
 #endif
-      break;
-   case MODE_SOFTPIPE:
+
 #if defined(GALLIUM_SOFTPIPE)
-      xmesa_set_driver( &xlib_softpipe_driver );
+   if (driver == NULL)
+      driver = &xlib_softpipe_driver;
 #endif
-      break;
-   default:
-      assert(0);
-      break;
-   }
+
+   xmesa_set_driver( trace_xm_create( driver ) );
 }
 
 
diff --git a/src/gallium/winsys/xlib/xlib.h b/src/gallium/winsys/xlib/xlib.h
index 8e091d0..a66874e 100644
--- a/src/gallium/winsys/xlib/xlib.h
+++ b/src/gallium/winsys/xlib/xlib.h
@@ -3,7 +3,7 @@
 #define XLIB_H
 
 #include "pipe/p_compiler.h"
-#include "xm_winsys.h"
+#include "state_tracker/xm_winsys.h"
 
 extern struct xm_driver xlib_softpipe_driver;
 extern struct xm_driver xlib_llvmpipe_driver;
diff --git a/src/gallium/winsys/xlib/xlib_cell.c b/src/gallium/winsys/xlib/xlib_cell.c
index 1dc9e8f..701bdfb 100644
--- a/src/gallium/winsys/xlib/xlib_cell.c
+++ b/src/gallium/winsys/xlib/xlib_cell.c
@@ -162,7 +162,9 @@ twiddle_tile(const uint *tileIn, uint *tileOut)
  * pixels for a TILE_SIZExTILE_SIZE block are contiguous in memory.
  */
 static void
-xlib_cell_display_surface(struct xmesa_buffer *b, struct pipe_surface *surf)
+xlib_cell_display_surface(struct xm_driver *driver,
+                          struct xmesa_buffer *b,
+                          struct pipe_surface *surf)
 {
    XImage *ximage;
    struct xm_buffer *xm_buf = xm_buffer(
@@ -212,19 +214,6 @@ xlib_cell_display_surface(struct xmesa_buffer *b, struct pipe_surface *surf)
 
 
 
-static void
-xm_flush_frontbuffer(struct pipe_winsys *pws,
-                     struct pipe_surface *surf,
-                     void *context_private)
-{
-   /*
-    * The front color buffer is actually just another XImage buffer.
-    * This function copies that XImage to the actual X Window.
-    */
-   XMesaContext xmctx = (XMesaContext) context_private;
-   if (xmctx)
-      xlib_cell_display_surface(xmctx->xm_buffer, surf);
-}
 
 
 
@@ -351,7 +340,7 @@ xlib_create_cell_winsys( void )
       ws->base.fence_signalled = xm_fence_signalled;
       ws->base.fence_finish = xm_fence_finish;
 
-      ws->base.flush_frontbuffer = xm_flush_frontbuffer;
+      ws->base.flush_frontbuffer = NULL;
       ws->base.get_name = xm_get_name;
    }
 
@@ -360,7 +349,7 @@ xlib_create_cell_winsys( void )
 
 
 static struct pipe_screen *
-xlib_create_cell_screen( void )
+xlib_create_cell_screen( struct xm_driver *driver )
 {
    struct pipe_winsys *winsys;
    struct pipe_screen *screen;
@@ -386,7 +375,7 @@ fail:
 
 struct xm_driver xlib_cell_driver = 
 {
-   .create_pipe_screen = xlib_create_cell_screen,
+   .create_screen = xlib_create_cell_screen,
    .display_surface = xlib_cell_display_surface,
 };
 
@@ -394,7 +383,7 @@ struct xm_driver xlib_cell_driver =
 
 struct xm_driver xlib_cell_driver = 
 {
-   .create_pipe_screen = NULL,
+   .create_screen = NULL,
    .display_surface = NULL,
 };
 
diff --git a/src/gallium/winsys/xlib/xlib_llvmpipe.c b/src/gallium/winsys/xlib/xlib_llvmpipe.c
index 6cebd4c..45d397b 100644
--- a/src/gallium/winsys/xlib/xlib_llvmpipe.c
+++ b/src/gallium/winsys/xlib/xlib_llvmpipe.c
@@ -396,7 +396,7 @@ xlib_create_llvmpipe_winsys( void )
 
 
 static struct pipe_screen *
-xlib_create_llvmpipe_screen( void )
+xlib_create_llvmpipe_screen( struct xm_driver *driver )
 {
    struct llvmpipe_winsys *winsys;
    struct pipe_screen *screen;
@@ -420,7 +420,8 @@ fail:
 
 
 static void
-xlib_llvmpipe_display_surface(struct xmesa_buffer *xm_buffer,
+xlib_llvmpipe_display_surface(struct xm_driver *driver,
+                              struct xmesa_buffer *xm_buffer,
                               struct pipe_surface *surf)
 {
    struct llvmpipe_texture *texture = llvmpipe_texture(surf->texture);
@@ -433,7 +434,7 @@ xlib_llvmpipe_display_surface(struct xmesa_buffer *xm_buffer,
 
 struct xm_driver xlib_llvmpipe_driver = 
 {
-   .create_pipe_screen = xlib_create_llvmpipe_screen,
+   .create_screen = xlib_create_llvmpipe_screen,
    .display_surface = xlib_llvmpipe_display_surface
 };
 
diff --git a/src/gallium/winsys/xlib/xlib_softpipe.c b/src/gallium/winsys/xlib/xlib_softpipe.c
index 716338a..dd667da 100644
--- a/src/gallium/winsys/xlib/xlib_softpipe.c
+++ b/src/gallium/winsys/xlib/xlib_softpipe.c
@@ -249,7 +249,8 @@ xm_buffer_destroy(struct pipe_buffer *buf)
  * by the XMesaBuffer.
  */
 static void
-xlib_softpipe_display_surface(struct xmesa_buffer *b,
+xlib_softpipe_display_surface(struct xm_driver *driver,
+                              struct xmesa_buffer *b,
                               struct pipe_surface *surf)
 {
    XImage *ximage;
@@ -307,21 +308,6 @@ xlib_softpipe_display_surface(struct xmesa_buffer *b,
 }
 
 
-static void
-xm_flush_frontbuffer(struct pipe_winsys *pws,
-                     struct pipe_surface *surf,
-                     void *context_private)
-{
-   /*
-    * The front color buffer is actually just another XImage buffer.
-    * This function copies that XImage to the actual X Window.
-    */
-   XMesaContext xmctx = (XMesaContext) context_private;
-   xlib_softpipe_display_surface(xmctx->xm_buffer, surf);
-   xmesa_check_and_update_buffer_size(xmctx, xmctx->xm_buffer);
-}
-
-
 
 static const char *
 xm_get_name(struct pipe_winsys *pws)
@@ -466,7 +452,7 @@ xlib_create_softpipe_winsys( void )
       ws->base.fence_signalled = xm_fence_signalled;
       ws->base.fence_finish = xm_fence_finish;
 
-      ws->base.flush_frontbuffer = xm_flush_frontbuffer;
+      ws->base.flush_frontbuffer = NULL;
       ws->base.get_name = xm_get_name;
    }
 
@@ -475,7 +461,7 @@ xlib_create_softpipe_winsys( void )
 
 
 static struct pipe_screen *
-xlib_create_softpipe_screen( void )
+xlib_create_softpipe_screen( struct xm_driver *driver )
 {
    struct pipe_winsys *winsys;
    struct pipe_screen *screen;
@@ -500,7 +486,7 @@ fail:
 
 struct xm_driver xlib_softpipe_driver = 
 {
-   .create_pipe_screen = xlib_create_softpipe_screen,
+   .create_screen = xlib_create_softpipe_screen,
    .display_surface = xlib_softpipe_display_surface
 };
 




More information about the mesa-commit mailing list