Mesa (master): drm/st: Return drm_api struct from a function

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Tue Jun 30 10:27:13 UTC 2009


Module: Mesa
Branch: master
Commit: 303cbb45b558a2b94e6922252cf57d115ba60b82
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=303cbb45b558a2b94e6922252cf57d115ba60b82

Author: Jakob Bornecrantz <jakob at vmware.com>
Date:   Tue Jun 30 11:49:43 2009 +0200

drm/st: Return drm_api struct from a function

---

 src/gallium/drivers/i915simple/i915_texture.c      |    3 +-
 src/gallium/drivers/i915simple/i915_winsys.h       |    4 ++-
 src/gallium/drivers/softpipe/sp_texture.c          |    3 +-
 src/gallium/drivers/softpipe/sp_winsys.h           |    5 ++-
 src/gallium/include/state_tracker/drm_api.h        |   38 +++++++++++---------
 src/gallium/state_trackers/dri/dri_context.c       |    2 +-
 src/gallium/state_trackers/dri/dri_drawable.c      |   10 ++++--
 src/gallium/state_trackers/dri/dri_screen.c        |    6 ++-
 src/gallium/state_trackers/dri/dri_screen.h        |    1 +
 src/gallium/state_trackers/egl/egl_context.c       |    2 +-
 src/gallium/state_trackers/egl/egl_surface.c       |    2 +-
 src/gallium/state_trackers/egl/egl_tracker.c       |    5 ++-
 src/gallium/state_trackers/egl/egl_tracker.h       |    1 +
 src/gallium/state_trackers/xorg/xorg_crtc.c        |    8 ++--
 src/gallium/state_trackers/xorg/xorg_dri2.c        |    4 +-
 src/gallium/state_trackers/xorg/xorg_driver.c      |    5 ++-
 src/gallium/state_trackers/xorg/xorg_exa.c         |    6 ++--
 src/gallium/state_trackers/xorg/xorg_tracker.h     |    1 +
 src/gallium/winsys/drm/intel/gem/intel_be_api.c    |   18 ++++++---
 src/gallium/winsys/drm/intel/gem/intel_be_api.h    |    7 +++-
 .../winsys/drm/intel/gem/intel_be_context.c        |    2 +-
 src/gallium/winsys/drm/intel/gem/intel_be_device.c |   17 ++++++---
 src/gallium/winsys/drm/intel/gem/intel_be_device.h |   11 ++++--
 23 files changed, 102 insertions(+), 59 deletions(-)

diff --git a/src/gallium/drivers/i915simple/i915_texture.c b/src/gallium/drivers/i915simple/i915_texture.c
index ca8e87a..211ba09 100644
--- a/src/gallium/drivers/i915simple/i915_texture.c
+++ b/src/gallium/drivers/i915simple/i915_texture.c
@@ -738,7 +738,8 @@ i915_init_screen_texture_functions(struct pipe_screen *screen)
    screen->tex_surface_destroy = i915_tex_surface_destroy;
 }
 
-boolean i915_get_texture_buffer( struct pipe_texture *texture,
+boolean i915_get_texture_buffer( struct drm_api *api,
+                                 struct pipe_texture *texture,
                                  struct pipe_buffer **buf,
                                  unsigned *stride )
 {
diff --git a/src/gallium/drivers/i915simple/i915_winsys.h b/src/gallium/drivers/i915simple/i915_winsys.h
index ff5b34f..58599da 100644
--- a/src/gallium/drivers/i915simple/i915_winsys.h
+++ b/src/gallium/drivers/i915simple/i915_winsys.h
@@ -61,6 +61,7 @@ struct pipe_buffer;
 struct pipe_fence_handle;
 struct pipe_winsys;
 struct pipe_screen;
+struct drm_api;
 
 
 /**
@@ -132,7 +133,8 @@ struct pipe_context *i915_create_context( struct pipe_screen *screen,
  *
  * This is needed for example kms.
  */
-boolean i915_get_texture_buffer( struct pipe_texture *texture,
+boolean i915_get_texture_buffer( struct drm_api *api,
+                                 struct pipe_texture *texture,
                                  struct pipe_buffer **buf,
                                  unsigned *stride );
 
diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c
index 7a533da..41d8a0f 100644
--- a/src/gallium/drivers/softpipe/sp_texture.c
+++ b/src/gallium/drivers/softpipe/sp_texture.c
@@ -403,7 +403,8 @@ softpipe_init_screen_texture_funcs(struct pipe_screen *screen)
 
 
 boolean
-softpipe_get_texture_buffer( struct pipe_texture *texture,
+softpipe_get_texture_buffer( struct drm_api *api,
+                             struct pipe_texture *texture,
                              struct pipe_buffer **buf,
                              unsigned *stride )
 {
diff --git a/src/gallium/drivers/softpipe/sp_winsys.h b/src/gallium/drivers/softpipe/sp_winsys.h
index 9e57186..3edcbeb 100644
--- a/src/gallium/drivers/softpipe/sp_winsys.h
+++ b/src/gallium/drivers/softpipe/sp_winsys.h
@@ -39,7 +39,7 @@
 extern "C" {
 #endif
 
-
+struct drm_api;
 struct pipe_screen;
 struct pipe_winsys;
 struct pipe_context;
@@ -53,7 +53,8 @@ softpipe_create_screen(struct pipe_winsys *);
 
 
 boolean
-softpipe_get_texture_buffer( struct pipe_texture *texture,
+softpipe_get_texture_buffer( struct drm_api *api,
+                             struct pipe_texture *texture,
                              struct pipe_buffer **buf,
                              unsigned *stride );
 
diff --git a/src/gallium/include/state_tracker/drm_api.h b/src/gallium/include/state_tracker/drm_api.h
index 5790b2f..7a38b50 100644
--- a/src/gallium/include/state_tracker/drm_api.h
+++ b/src/gallium/include/state_tracker/drm_api.h
@@ -32,33 +32,37 @@ struct drm_api
 	 * Special buffer functions
 	 */
 	/*@{*/
-	struct pipe_screen*  (*create_screen)(int drm_fd,
-					      struct drm_create_screen_arg *arg);
-	struct pipe_context* (*create_context)(struct pipe_screen *screen);
+	struct pipe_screen*  (*create_screen)(struct drm_api *api, int drm_fd,
+	                                      struct drm_create_screen_arg *arg);
+	struct pipe_context* (*create_context)(struct drm_api *api,
+	                                       struct pipe_screen *screen);
 	/*@}*/
 
 	/**
 	 * Special buffer functions
 	 */
 	/*@{*/
-	boolean (*buffer_from_texture)(struct pipe_texture *texture,
-                                       struct pipe_buffer **buffer,
-                                       unsigned *stride);
-	struct pipe_buffer* (*buffer_from_handle)(struct pipe_screen *screen,
+	boolean (*buffer_from_texture)(struct drm_api *api,
+	                               struct pipe_texture *texture,
+	                               struct pipe_buffer **buffer,
+	                               unsigned *stride);
+	struct pipe_buffer* (*buffer_from_handle)(struct drm_api *api,
+	                                          struct pipe_screen *screen,
                                                   const char *name,
                                                   unsigned handle);
-	boolean (*handle_from_buffer)(struct pipe_screen *screen,
-                                      struct pipe_buffer *buffer,
-                                      unsigned *handle);
-	boolean (*global_handle_from_buffer)(struct pipe_screen *screen,
-                                             struct pipe_buffer *buffer,
-                                             unsigned *handle);
+	boolean (*handle_from_buffer)(struct drm_api *api,
+	                              struct pipe_screen *screen,
+	                              struct pipe_buffer *buffer,
+	                              unsigned *handle);
+	boolean (*global_handle_from_buffer)(struct drm_api *api,
+	                                     struct pipe_screen *screen,
+	                                     struct pipe_buffer *buffer,
+	                                     unsigned *handle);
 	/*@}*/
+
+	void (*destroy)(struct drm_api *api);
 };
 
-/**
- * A driver needs to export this symbol
- */
-extern struct drm_api drm_api_hooks;
+extern struct drm_api * drm_api_create(void);
 
 #endif
diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c
index 45eaec4..6c61719 100644
--- a/src/gallium/state_trackers/dri/dri_context.c
+++ b/src/gallium/state_trackers/dri/dri_context.c
@@ -69,7 +69,7 @@ dri_create_context(const __GLcontextModes * visual,
    driParseConfigFiles(&ctx->optionCache,
 		       &screen->optionCache, sPriv->myNum, "dri");
 
-   ctx->pipe = drm_api_hooks.create_context(screen->pipe_screen);
+   ctx->pipe = screen->api->create_context(screen->api, screen->pipe_screen);
 
    if (ctx->pipe == NULL)
       goto fail;
diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c
index 815055b..1d91fbb 100644
--- a/src/gallium/state_trackers/dri/dri_drawable.c
+++ b/src/gallium/state_trackers/dri/dri_drawable.c
@@ -53,7 +53,8 @@ dri_copy_to_front(__DRIdrawablePrivate * dPriv,
 }
 
 static struct pipe_surface *
-dri_surface_from_handle(struct pipe_screen *screen,
+dri_surface_from_handle(struct drm_api *api,
+			struct pipe_screen *screen,
 			unsigned handle,
 			enum pipe_format format,
 			unsigned width, unsigned height, unsigned pitch)
@@ -63,7 +64,7 @@ dri_surface_from_handle(struct pipe_screen *screen,
    struct pipe_texture templat;
    struct pipe_buffer *buf = NULL;
 
-   buf = drm_api_hooks.buffer_from_handle(screen, "dri2 buffer", handle);
+   buf = api->buffer_from_handle(api, screen, "dri2 buffer", handle);
    if (!buf)
       return NULL;
 
@@ -100,12 +101,14 @@ dri_surface_from_handle(struct pipe_screen *screen,
 void
 dri_get_buffers(__DRIdrawablePrivate * dPriv)
 {
+
    struct dri_drawable *drawable = dri_drawable(dPriv);
    struct pipe_surface *surface = NULL;
    struct pipe_screen *screen = dri_screen(drawable->sPriv)->pipe_screen;
    __DRIbuffer *buffers = NULL;
    __DRIscreen *dri_screen = drawable->sPriv;
    __DRIdrawable *dri_drawable = drawable->dPriv;
+   struct drm_api *api = ((struct dri_screen*)(dri_screen->private))->api;
    boolean have_depth = FALSE;
    int i, count;
 
@@ -187,7 +190,8 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
 	    have_depth = TRUE;
       }
 
-      surface = dri_surface_from_handle(screen,
+      surface = dri_surface_from_handle(api,
+					screen,
 					buffers[i].name,
 					format,
 					dri_drawable->w,
diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c
index 98bf68c..5f78b72 100644
--- a/src/gallium/state_trackers/dri/dri_screen.c
+++ b/src/gallium/state_trackers/dri/dri_screen.c
@@ -199,6 +199,7 @@ dri_init_screen(__DRIscreenPrivate * sPriv)
    if (!screen)
       return NULL;
 
+   screen->api = drm_api_create();
    screen->sPriv = sPriv;
    screen->fd = sPriv->fd;
    screen->drmLock = (drmLock *) & sPriv->pSAREA->lock;
@@ -216,7 +217,7 @@ dri_init_screen(__DRIscreenPrivate * sPriv)
    dri_copy_version(&arg.drm_version, &sPriv->drm_version);
    arg.api = NULL;
 
-   screen->pipe_screen = drm_api_hooks.create_screen(screen->fd, &arg.base);
+   screen->pipe_screen = screen->api->create_screen(screen->api, screen->fd, &arg.base);
 
    if (!screen->pipe_screen || !arg.api) {
       debug_printf("%s: failed to create dri1 screen\n", __FUNCTION__);
@@ -265,13 +266,14 @@ dri_init_screen2(__DRIscreenPrivate * sPriv)
    if (!screen)
       goto fail;
 
+   screen->api = drm_api_create();
    screen->sPriv = sPriv;
    screen->fd = sPriv->fd;
    sPriv->private = (void *)screen;
    sPriv->extensions = dri_screen_extensions;
    arg.mode = DRM_CREATE_NORMAL;
 
-   screen->pipe_screen = drm_api_hooks.create_screen(screen->fd, &arg);
+   screen->pipe_screen = screen->api->create_screen(screen->api, screen->fd, &arg);
    if (!screen->pipe_screen) {
       debug_printf("%s: failed to create pipe_screen\n", __FUNCTION__);
       goto fail;
diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h
index 090f9fe..f3335bb 100644
--- a/src/gallium/state_trackers/dri/dri_screen.h
+++ b/src/gallium/state_trackers/dri/dri_screen.h
@@ -60,6 +60,7 @@ struct dri_screen
    drmLock *drmLock;
 
    /* gallium */
+   struct drm_api *api;
    struct pipe_winsys *pipe_winsys;
    struct pipe_screen *pipe_screen;
    boolean d_depth_bits_last;
diff --git a/src/gallium/state_trackers/egl/egl_context.c b/src/gallium/state_trackers/egl/egl_context.c
index 36548fa..edd4948 100644
--- a/src/gallium/state_trackers/egl/egl_context.c
+++ b/src/gallium/state_trackers/egl/egl_context.c
@@ -115,7 +115,7 @@ drm_create_context(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLContext
 
 	_eglInitContext(drv, dpy, &ctx->base, config, attrib_list);
 
-	ctx->pipe = drm_api_hooks.create_context(dev->screen);
+	ctx->pipe = dev->api->create_context(dev->api, dev->screen);
 	if (!ctx->pipe)
 		goto err_pipe;
 
diff --git a/src/gallium/state_trackers/egl/egl_surface.c b/src/gallium/state_trackers/egl/egl_surface.c
index 489aa8d..de8194a 100644
--- a/src/gallium/state_trackers/egl/egl_surface.c
+++ b/src/gallium/state_trackers/egl/egl_surface.c
@@ -132,7 +132,7 @@ drm_create_texture(_EGLDriver *drv,
 	scrn->front.width = w;
 	scrn->front.height = h;
 	scrn->front.pitch = pitch;
-	drm_api_hooks.handle_from_buffer(screen, scrn->buffer, &scrn->front.handle);
+	dev->api->handle_from_buffer(dev->api, screen, scrn->buffer, &scrn->front.handle);
 	if (0)
 		goto err_handle;
 
diff --git a/src/gallium/state_trackers/egl/egl_tracker.c b/src/gallium/state_trackers/egl/egl_tracker.c
index 8e62008..521c91d 100644
--- a/src/gallium/state_trackers/egl/egl_tracker.c
+++ b/src/gallium/state_trackers/egl/egl_tracker.c
@@ -35,6 +35,8 @@ _eglMain(_EGLDisplay *dpy, const char *args)
 		return NULL;
 	}
 
+	drm->api = drm_api_create();
+
 	/* First fill in the dispatch table with defaults */
 	_eglInitDriverFallbacks(&drm->base);
 	/* then plug in our Drm-specific functions */
@@ -146,7 +148,7 @@ drm_initialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
 	dev->drmFD = fd;
 	drm_get_device_id(dev);
 
-	dev->screen = drm_api_hooks.create_screen(dev->drmFD, NULL);
+	dev->screen = dev->api->create_screen(dev->api, dev->drmFD, NULL);
 	if (!dev->screen)
 		goto err_screen;
 	dev->winsys = dev->screen->winsys;
@@ -234,6 +236,7 @@ drm_terminate(_EGLDriver *drv, EGLDisplay dpy)
 
 	dev->screen->destroy(dev->screen);
 	dev->winsys = NULL;
+	dev->api->destroy(dev->api);
 
 	drmClose(dev->drmFD);
 
diff --git a/src/gallium/state_trackers/egl/egl_tracker.h b/src/gallium/state_trackers/egl/egl_tracker.h
index ce2717d..3b88367 100644
--- a/src/gallium/state_trackers/egl/egl_tracker.h
+++ b/src/gallium/state_trackers/egl/egl_tracker.h
@@ -38,6 +38,7 @@ struct drm_device
 	 * pipe
 	 */
 
+	struct drm_api *api;
 	struct pipe_winsys *winsys;
 	struct pipe_screen *screen;
 
diff --git a/src/gallium/state_trackers/xorg/xorg_crtc.c b/src/gallium/state_trackers/xorg/xorg_crtc.c
index 7304113..2235961 100644
--- a/src/gallium/state_trackers/xorg/xorg_crtc.c
+++ b/src/gallium/state_trackers/xorg/xorg_crtc.c
@@ -171,7 +171,6 @@ crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data)
 static void
 crtc_destroy(xf86CrtcPtr crtc)
 {
-    modesettingPtr ms = modesettingPTR(crtc->scrn);
     struct crtc_private *crtcp = crtc->driver_private;
 
     if (crtcp->cursor_buf)
@@ -194,9 +193,10 @@ crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 * image)
 					       PIPE_BUFFER_USAGE_CPU_WRITE |
 					       PIPE_BUFFER_USAGE_GPU_READ,
 					       64*64*4);
-	drm_api_hooks.handle_from_buffer(ms->screen,
-					 crtcp->cursor_buf,
-					 &crtcp->cursor_handle);
+	ms->api->handle_from_buffer(ms->api,
+				    ms->screen,
+				    crtcp->cursor_buf,
+				    &crtcp->cursor_handle);
     }
 
     ptr = pipe_buffer_map(ms->screen, crtcp->cursor_buf, PIPE_BUFFER_USAGE_CPU_WRITE);
diff --git a/src/gallium/state_trackers/xorg/xorg_dri2.c b/src/gallium/state_trackers/xorg/xorg_dri2.c
index 401bd39..ae3338f 100644
--- a/src/gallium/state_trackers/xorg/xorg_dri2.c
+++ b/src/gallium/state_trackers/xorg/xorg_dri2.c
@@ -108,8 +108,8 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
 	    tex = ms->screen->texture_create(ms->screen, &template);
 	}
 
-	drm_api_hooks.buffer_from_texture(tex, &buf, &stride);
-	drm_api_hooks.global_handle_from_buffer(ms->screen, buf, &handle);
+	ms->api->buffer_from_texture(ms->api, tex, &buf, &stride);
+	ms->api->global_handle_from_buffer(ms->api, ms->screen, buf, &handle);
 
 	buffers[i].name = handle;
 	buffers[i].attachment = attachments[i];
diff --git a/src/gallium/state_trackers/xorg/xorg_driver.c b/src/gallium/state_trackers/xorg/xorg_driver.c
index 45e831f..e01e529 100644
--- a/src/gallium/state_trackers/xorg/xorg_driver.c
+++ b/src/gallium/state_trackers/xorg/xorg_driver.c
@@ -300,6 +300,7 @@ PreInit(ScrnInfoPtr pScrn, int flags)
 	    ms->PciInfo->dev, ms->PciInfo->func
 	);
 
+    ms->api = drm_api_create();
     ms->fd = drmOpen(NULL, BusID);
 
     if (ms->fd < 0)
@@ -476,7 +477,7 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     }
 
     if (!ms->screen) {
-	ms->screen = drm_api_hooks.create_screen(ms->fd, NULL);
+	ms->screen = ms->api->create_screen(ms->api, ms->fd, NULL);
 
 	if (!ms->screen) {
 	    FatalError("Could not init pipe_screen\n");
@@ -678,6 +679,8 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
     if (ms->exa)
 	xorg_exa_close(pScrn);
 
+	ms->api->destroy(ms->api);
+	ms->api = NULL;
     drmClose(ms->fd);
     ms->fd = -1;
 
diff --git a/src/gallium/state_trackers/xorg/xorg_exa.c b/src/gallium/state_trackers/xorg/xorg_exa.c
index 7913174..0fbfed1 100644
--- a/src/gallium/state_trackers/xorg/xorg_exa.c
+++ b/src/gallium/state_trackers/xorg/xorg_exa.c
@@ -380,8 +380,8 @@ xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
 	return 0;
     }
 
-    drm_api_hooks.buffer_from_texture(priv->tex, &buffer, &stride);
-    drm_api_hooks.handle_from_buffer(ms->screen, buffer, &handle);
+    ms->api->buffer_from_texture(ms->api, priv->tex, &buffer, &stride);
+    ms->api->handle_from_buffer(ms->api, ms->screen, buffer, &handle);
     pipe_buffer_reference(&buffer, NULL);
     return handle;
 }
@@ -527,7 +527,7 @@ xorg_exa_init(ScrnInfoPtr pScrn)
     }
 
     exa->scrn = ms->screen;
-    exa->ctx = drm_api_hooks.create_context(exa->scrn);
+    exa->ctx = ms->api->create_context(ms->api, exa->scrn);
     /* Share context with DRI */
     ms->ctx = exa->ctx;
 
diff --git a/src/gallium/state_trackers/xorg/xorg_tracker.h b/src/gallium/state_trackers/xorg/xorg_tracker.h
index 82c3890..95924b7 100644
--- a/src/gallium/state_trackers/xorg/xorg_tracker.h
+++ b/src/gallium/state_trackers/xorg/xorg_tracker.h
@@ -75,6 +75,7 @@ typedef struct _modesettingRec
     CreateScreenResourcesProcPtr createScreenResources;
 
     /* gallium */
+    struct drm_api *api;
     struct pipe_screen *screen;
     struct pipe_context *ctx;
 
diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_api.c b/src/gallium/winsys/drm/intel/gem/intel_be_api.c
index a74be13..4a1768a 100644
--- a/src/gallium/winsys/drm/intel/gem/intel_be_api.c
+++ b/src/gallium/winsys/drm/intel/gem/intel_be_api.c
@@ -2,13 +2,12 @@
 #include "intel_be_api.h"
 #include "i915simple/i915_winsys.h"
 
-#ifdef DEBUG
-#include "trace/trace_drm.h"
+static void destroy(struct drm_api *api)
+{
+
+}
 
-struct drm_api hooks =
-#else
-struct drm_api drm_api_hooks =
-#endif
+struct drm_api intel_be_drm_api =
 {
 	/* intel_be_context.c */
 	.create_context = intel_be_create_context,
@@ -18,4 +17,11 @@ struct drm_api drm_api_hooks =
 	.buffer_from_handle = intel_be_buffer_from_handle,
 	.handle_from_buffer = intel_be_handle_from_buffer,
 	.global_handle_from_buffer = intel_be_global_handle_from_buffer,
+	.destroy = destroy,
 };
+
+struct drm_api *
+drm_api_create()
+{
+	return &intel_be_drm_api;
+}
diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_api.h b/src/gallium/winsys/drm/intel/gem/intel_be_api.h
index 1c622f3..f286b62 100644
--- a/src/gallium/winsys/drm/intel/gem/intel_be_api.h
+++ b/src/gallium/winsys/drm/intel/gem/intel_be_api.h
@@ -8,8 +8,11 @@
 
 #include "intel_be_device.h"
 
-struct pipe_screen *intel_be_create_screen(int drmFD,
+extern struct drm_api intel_be_drm_api;
+
+struct pipe_screen *intel_be_create_screen(struct drm_api *api, int drmFD,
 					   struct drm_create_screen_arg *arg);
-struct pipe_context *intel_be_create_context(struct pipe_screen *screen);
+struct pipe_context *intel_be_create_context(struct drm_api *api,
+					     struct pipe_screen *screen);
 
 #endif
diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_context.c b/src/gallium/winsys/drm/intel/gem/intel_be_context.c
index fe0b138..db84f9a 100644
--- a/src/gallium/winsys/drm/intel/gem/intel_be_context.c
+++ b/src/gallium/winsys/drm/intel/gem/intel_be_context.c
@@ -97,7 +97,7 @@ intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *de
 }
 
 struct pipe_context *
-intel_be_create_context(struct pipe_screen *screen)
+intel_be_create_context(struct drm_api *api, struct pipe_screen *screen)
 {
 	struct intel_be_context *intel;
 	struct pipe_context *pipe;
diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_device.c b/src/gallium/winsys/drm/intel/gem/intel_be_device.c
index 907ac86..2d53127 100644
--- a/src/gallium/winsys/drm/intel/gem/intel_be_device.c
+++ b/src/gallium/winsys/drm/intel/gem/intel_be_device.c
@@ -143,7 +143,8 @@ err:
 }
 
 struct pipe_buffer *
-intel_be_buffer_from_handle(struct pipe_screen *screen,
+intel_be_buffer_from_handle(struct drm_api *api,
+                            struct pipe_screen *screen,
                             const char* name, unsigned handle)
 {
 	struct intel_be_device *dev = intel_be_device(screen->winsys);
@@ -174,7 +175,8 @@ err:
 }
 
 boolean
-intel_be_handle_from_buffer(struct pipe_screen *screen,
+intel_be_handle_from_buffer(struct drm_api *api,
+                            struct pipe_screen *screen,
                             struct pipe_buffer *buffer,
                             unsigned *handle)
 {
@@ -186,7 +188,8 @@ intel_be_handle_from_buffer(struct pipe_screen *screen,
 }
 
 boolean
-intel_be_global_handle_from_buffer(struct pipe_screen *screen,
+intel_be_global_handle_from_buffer(struct drm_api *api,
+                                   struct pipe_screen *screen,
 				   struct pipe_buffer *buffer,
 				   unsigned *handle)
 {
@@ -296,6 +299,7 @@ intel_be_get_device_id(unsigned int *device_id)
 {
    char path[512];
    FILE *file;
+   void *shutup_gcc;
 
    /*
     * FIXME: Fix this up to use a drm ioctl or whatever.
@@ -307,13 +311,14 @@ intel_be_get_device_id(unsigned int *device_id)
       return;
    }
 
-   fgets(path, sizeof(path), file);
+   shutup_gcc = fgets(path, sizeof(path), file);
    sscanf(path, "%x", device_id);
    fclose(file);
 }
 
 struct pipe_screen *
-intel_be_create_screen(int drmFD, struct drm_create_screen_arg *arg)
+intel_be_create_screen(struct drm_api *api, int drmFD,
+		       struct drm_create_screen_arg *arg)
 {
 	struct intel_be_device *dev;
 	struct pipe_screen *screen;
@@ -339,7 +344,7 @@ intel_be_create_screen(int drmFD, struct drm_create_screen_arg *arg)
 
 	if (dev->softpipe) {
 		screen = softpipe_create_screen(&dev->base);
-		drm_api_hooks.buffer_from_texture = softpipe_get_texture_buffer;
+		intel_be_drm_api.buffer_from_texture = softpipe_get_texture_buffer;
 	} else
 		screen = i915_create_screen(&dev->base, deviceID);
 
diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_device.h b/src/gallium/winsys/drm/intel/gem/intel_be_device.h
index b32637e..777161d 100644
--- a/src/gallium/winsys/drm/intel/gem/intel_be_device.h
+++ b/src/gallium/winsys/drm/intel/gem/intel_be_device.h
@@ -8,6 +8,8 @@
 #include "drm.h"
 #include "intel_bufmgr.h"
 
+struct drm_api;
+
 /*
  * Device
  */
@@ -56,7 +58,8 @@ struct intel_be_buffer {
  * Takes a reference.
  */
 struct pipe_buffer *
-intel_be_buffer_from_handle(struct pipe_screen *screen,
+intel_be_buffer_from_handle(struct drm_api *api,
+                            struct pipe_screen *screen,
                             const char* name, unsigned handle);
 
 /**
@@ -65,7 +68,8 @@ intel_be_buffer_from_handle(struct pipe_screen *screen,
  * If buffer is destroyed handle may become invalid.
  */
 boolean
-intel_be_handle_from_buffer(struct pipe_screen *screen,
+intel_be_handle_from_buffer(struct drm_api *api,
+                            struct pipe_screen *screen,
                             struct pipe_buffer *buffer,
                             unsigned *handle);
 
@@ -75,7 +79,8 @@ intel_be_handle_from_buffer(struct pipe_screen *screen,
  * If buffer is destroyed handle may become invalid.
  */
 boolean
-intel_be_global_handle_from_buffer(struct pipe_screen *screen,
+intel_be_global_handle_from_buffer(struct drm_api *api,
+                                   struct pipe_screen *screen,
                                    struct pipe_buffer *buffer,
                                    unsigned *handle);
 




More information about the mesa-commit mailing list