Remove context dependencies in winsys layer.
authorBrian <brian.paul@tungstengraphics.com>
Wed, 7 Nov 2007 23:07:17 +0000 (16:07 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Wed, 7 Nov 2007 23:08:04 +0000 (16:08 -0700)
The winsys object is now per-screen and shared by multiple contexts.
The regionPool is now part of the i915 winsys layer.
The winsys wait_idle() and flush_frontbuffer() funcs will get more attention...

src/mesa/drivers/dri/intel_winsys/intel_context.c
src/mesa/drivers/dri/intel_winsys/intel_screen.c
src/mesa/drivers/dri/intel_winsys/intel_screen.h
src/mesa/drivers/dri/intel_winsys/intel_winsys.h
src/mesa/drivers/dri/intel_winsys/intel_winsys_pipe.c
src/mesa/pipe/p_context.h
src/mesa/pipe/p_winsys.h
src/mesa/pipe/xlib/xm_winsys.c
src/mesa/state_tracker/st_cb_flush.c

index 88551bc3a3fc7fcb45fe7f4c1ea75a29175b3681..47be72b2330714d3e5ddcc4afdb2e023c0958c3f 100644 (file)
@@ -143,7 +143,6 @@ intelCreateContext(const __GLcontextModes * visual,
    int fthrottle_mode;
    GLboolean havePools;
    struct pipe_context *pipe;
-   struct pipe_winsys *winsys;
    struct st_context *st_share = NULL;
 
    if (sharedContextPrivate) {
@@ -186,13 +185,11 @@ intelCreateContext(const __GLcontextModes * visual,
    __intel_debug = driParseDebugString(getenv("INTEL_DEBUG"), debug_control);
 #endif
 
-   winsys = intel_create_pipe_winsys( intel );
-
    /*
     * Pipe-related setup
     */
    if (!getenv("INTEL_HW")) {
-      pipe = intel_create_softpipe( intel, winsys );
+      pipe = intel_create_softpipe( intel, intelScreen->winsys );
    }
    else {
       switch (intel->intelScreen->deviceID) {
@@ -204,17 +201,19 @@ intelCreateContext(const __GLcontextModes * visual,
       case PCI_CHIP_Q35_G:
       case PCI_CHIP_I915_G:
       case PCI_CHIP_I915_GM:
-        pipe = intel_create_i915simple( intel, winsys );
+        pipe = intel_create_i915simple( intel, intelScreen->winsys );
         break;
       default:
         fprintf(stderr, "Unknown PCIID %x in %s, using software driver\n", 
                  intel->intelScreen->deviceID, __FUNCTION__);
 
-        pipe = intel_create_softpipe( intel, winsys );
+        pipe = intel_create_softpipe( intel, intelScreen->winsys );
         break;
       }
    }
 
+   pipe->private = intel;
+
    intel->st = st_create_context(pipe, visual, st_share);
 
    return GL_TRUE;
index 334803e264e2524be56a127d7ca5cb948aae32f0..01460e5be3c1f0229e548a2aff9b86e657467b75 100644 (file)
@@ -34,6 +34,7 @@
 #include "intel_batchbuffer.h"
 #include "intel_batchpool.h"
 #include "intel_swapbuffers.h"
+#include "intel_winsys.h"
 
 #include "i830_dri.h"
 #include "dri_bufpool.h"
@@ -165,17 +166,11 @@ intelCreatePools(__DRIscreenPrivate * sPriv)
    if (intelScreen->havePools)
       return GL_TRUE;
 
-   batchPoolSize /= BATCH_SZ;
-   intelScreen->regionPool = driDRMPoolInit(sPriv->fd);
-
-   if (!intelScreen->regionPool)
-      return GL_FALSE;
-
    intelScreen->staticPool = driDRMStaticPoolInit(sPriv->fd);
-
    if (!intelScreen->staticPool)
       return GL_FALSE;
 
+   batchPoolSize /= BATCH_SZ;
    intelScreen->batchPool = driBatchPoolInit(sPriv->fd,
                                              DRM_BO_FLAG_EXE |
                                              DRM_BO_FLAG_MEM_TT |
@@ -245,6 +240,8 @@ intelInitDriver(__DRIscreenPrivate * sPriv)
       (*glx_enable_extension) (psc, "GLX_SGI_make_current_read");
    }
 
+   intelScreen->winsys = intel_create_pipe_winsys(sPriv->fd);
+
    return GL_TRUE;
 }
 
@@ -257,7 +254,6 @@ intelDestroyScreen(__DRIscreenPrivate * sPriv)
    /*  intelUnmapScreenRegions(intelScreen); */
 
    if (intelScreen->havePools) {
-      driPoolTakeDown(intelScreen->regionPool);
       driPoolTakeDown(intelScreen->staticPool);
       driPoolTakeDown(intelScreen->batchPool);
    }
index f0446fe7b3f8ab6fb52f150a3a10910ef2c7c02d..3396f9e56430130448ce6221c18790f3fb8d059c 100644 (file)
@@ -65,7 +65,6 @@ struct intel_screen
    driOptionCache optionCache;
 
    struct _DriBufferPool *batchPool;
-   struct _DriBufferPool *regionPool;
    struct _DriBufferPool *staticPool; /** for the X screen/framebuffer */
    boolean havePools;
 
@@ -74,6 +73,8 @@ struct intel_screen
     * which we need a rendering context, but none is currently bound.
     */
    struct intel_context *dummyContext;
+
+   struct pipe_winsys *winsys;
 };
 
 
index d7de57227b49e8f74003f3240b270f8d9f0b310b..89e63e0a797271a913680d7f05d00512d9c68579 100644 (file)
@@ -35,7 +35,10 @@ struct pipe_buffer_handle;
 struct _DriBufferObject;
 
 struct pipe_winsys *
-intel_create_pipe_winsys( struct intel_context *intel );
+intel_create_pipe_winsys( int fd );
+
+void
+intel_destroy_pipe_winsys( struct pipe_winsys *winsys );
 
 struct pipe_context *
 intel_create_softpipe( struct intel_context *intel,
index 02c72e9d7fc4682266bbf778fedd696b00182bc8..16fff77af457adb724b8df225044754935d09c75 100644 (file)
@@ -48,7 +48,7 @@
 
 struct intel_pipe_winsys {
    struct pipe_winsys winsys;
-   struct intel_context *intel;
+   struct _DriBufferPool *regionPool;
 };
 
 
@@ -110,11 +110,7 @@ static void intel_buffer_data(struct pipe_winsys *winsys,
                              unsigned size, const void *data,
                              unsigned usage )
 {
-   struct intel_context *intel = intel_pipe_winsys(winsys)->intel;
-
-   LOCK_HARDWARE( intel );
    driBOData( dri_bo(buf), size, data, 0 );
-   UNLOCK_HARDWARE( intel );
 }
 
 static void intel_buffer_subdata(struct pipe_winsys *winsys, 
@@ -142,14 +138,10 @@ static struct pipe_buffer_handle *
 intel_buffer_create(struct pipe_winsys *winsys, 
                    unsigned alignment)
 {
-   struct intel_context *intel = intel_pipe_winsys(winsys)->intel;
    struct _DriBufferObject *buffer;
-
-   LOCK_HARDWARE( intel );
-   driGenBuffers( intel->intelScreen->regionPool, 
+   struct intel_pipe_winsys *iws = intel_pipe_winsys(winsys);
+   driGenBuffers( iws->regionPool, 
                  "pipe buffer", 1, &buffer, alignment, 0, 0 );
-   UNLOCK_HARDWARE( intel );
-
    return pipe_bo(buffer);
 }
 
@@ -157,21 +149,18 @@ intel_buffer_create(struct pipe_winsys *winsys,
 static struct pipe_buffer_handle *
 intel_user_buffer_create(struct pipe_winsys *winsys, void *ptr, unsigned bytes)
 {
-   struct intel_context *intel = intel_pipe_winsys(winsys)->intel;
    struct _DriBufferObject *buffer;
-
-   LOCK_HARDWARE( intel );
-   driGenUserBuffer( intel->intelScreen->regionPool, 
+   struct intel_pipe_winsys *iws = intel_pipe_winsys(winsys);
+   driGenUserBuffer( iws->regionPool, 
                      "pipe user buffer", &buffer, ptr, bytes);
-   UNLOCK_HARDWARE( intel );
-
    return pipe_bo(buffer);
 }
 
 
-static void intel_wait_idle( struct pipe_winsys *winsys )
+static void
+intel_wait_idle( struct pipe_winsys *winsys, void *context_private )
 {
-   struct intel_context *intel = intel_pipe_winsys(winsys)->intel;
+   struct intel_context *intel = (struct intel_context *) context_private;
 
    if (intel->batch->last_fence) {
       driFenceFinish(intel->batch->last_fence, 
@@ -188,9 +177,10 @@ static void intel_wait_idle( struct pipe_winsys *winsys )
  */
 static void
 intel_flush_frontbuffer( struct pipe_winsys *winsys,
-                         struct pipe_surface *surf )
+                         struct pipe_surface *surf,
+                         void *context_private)
 {
-   struct intel_context *intel = intel_pipe_winsys(winsys)->intel;
+   struct intel_context *intel = (struct intel_context *) context_private;
    __DRIdrawablePrivate *dPriv = intel->driDrawable;
 
    intelDisplaySurface(dPriv, surf, NULL);
@@ -301,7 +291,7 @@ intel_get_name( struct pipe_winsys *winsys )
 
 
 struct pipe_winsys *
-intel_create_pipe_winsys( struct intel_context *intel )
+intel_create_pipe_winsys( int fd )
 {
    struct intel_pipe_winsys *iws = CALLOC_STRUCT( intel_pipe_winsys );
    
@@ -324,13 +314,25 @@ intel_create_pipe_winsys( struct intel_context *intel )
    iws->winsys.wait_idle = intel_wait_idle;
    iws->winsys.printf = intel_printf;
    iws->winsys.get_name = intel_get_name;
-   iws->intel = intel;
-
    iws->winsys.region_alloc = intel_i915_region_alloc;
    iws->winsys.region_release = intel_i915_region_release;
-
    iws->winsys.surface_alloc = intel_i915_surface_alloc;
    iws->winsys.surface_release = intel_i915_surface_release;
 
+   if (fd)
+      iws->regionPool = driDRMPoolInit(fd);
+
    return &iws->winsys;
 }
+
+
+void
+intel_destroy_pipe_winsys( struct pipe_winsys *winsys )
+{
+   struct intel_pipe_winsys *iws = intel_pipe_winsys(winsys);
+   if (iws->regionPool) {
+      driPoolTakeDown(iws->regionPool);
+   }
+   free(iws);
+}
+
index ddc7acc747d30b5bdc8937d5ca215cb41d621f0f..3962c0fa6d8c296310da43bb4b30172e14169d07 100644 (file)
@@ -43,6 +43,8 @@ struct pipe_state_cache;
 struct pipe_context {
    struct pipe_winsys *winsys;
 
+   void *private;  /** context private data (for DRI for example) */
+
    void (*destroy)( struct pipe_context * );
 
    /*
index 9dbac87b4bb2a53413e13025dc3eab8834348ae9..ee10e30559910bdf33028f334767c67e4845c51a 100644 (file)
@@ -64,14 +64,15 @@ struct pipe_winsys
    const char *(*get_name)( struct pipe_winsys *sws );
 
    /** Wait for any buffered rendering to finish */
-   void (*wait_idle)( struct pipe_winsys *sws );
+   void (*wait_idle)( struct pipe_winsys *sws, void *context_private );
 
    /**
     * Do any special operations to ensure frontbuffer contents are
     * displayed, eg copy fake frontbuffer.
     */
    void (*flush_frontbuffer)( struct pipe_winsys *sws,
-                              struct pipe_surface *surf );
+                              struct pipe_surface *surf,
+                              void *context_private );
 
    /** Debug output */
    void (*printf)( struct pipe_winsys *sws,
index cae53c70db030b642d650f83e96656be6c486ef9..ea6b06a93c7bf4ecfd849f6d0b7c6635ca100fad 100644 (file)
@@ -168,7 +168,7 @@ xm_flush_frontbuffer(struct pipe_winsys *pws,
 }
 
 static void
-xm_wait_idle(struct pipe_winsys *pws)
+xm_wait_idle(struct pipe_winsys *pws, void *context_private)
 {
    /* no-op */
 }
index 819957a1ee6fe5f8001bfade2fbee2e45bf469bf..6354306e75242f93b3445560cb1cb8036e1d7aba 100644 (file)
@@ -71,7 +71,8 @@ void st_flush( struct st_context *st )
 
       /* Hook for copying "fake" frontbuffer if necessary:
        */
-      st->pipe->winsys->flush_frontbuffer( st->pipe->winsys, front_surf );
+      st->pipe->winsys->flush_frontbuffer( st->pipe->winsys, front_surf,
+                                           st->pipe->private );
       st->flags.frontbuffer_dirty = 0;
    }
 }
@@ -94,7 +95,7 @@ static void st_Finish(GLcontext *ctx)
    struct st_context *st = ctx->st;
 
    st_flush( st );
-   st->pipe->winsys->wait_idle( st->pipe->winsys );
+   st->pipe->winsys->wait_idle( st->pipe->winsys, st->pipe->private );
 }