gallium: plumb winsys-drawable-handle through to state tracker
authorKeith Whitwell <keithw@vmware.com>
Wed, 10 Mar 2010 09:22:02 +0000 (09:22 +0000)
committerKeith Whitwell <keithw@vmware.com>
Wed, 10 Mar 2010 09:22:02 +0000 (09:22 +0000)
The state trackers need this value so that they can supply it
as the "void *" argument to flush_frontbuffer.

Fixes single-buffer rendering.

src/gallium/state_trackers/dri/dri_context.c
src/gallium/state_trackers/egl/common/egl_g3d.c
src/gallium/state_trackers/egl/common/st_public_tmp.h
src/gallium/state_trackers/glx/xlib/xm_api.c
src/gallium/state_trackers/vega/vg_tracker.c
src/gallium/state_trackers/vega/vg_tracker.h
src/gallium/state_trackers/wgl/stw_context.c
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_public.h

index 908cef454e9b70424872496464eaff24373bf738..2f991c39e33b82478eb7e9a6430ad803378ba168 100644 (file)
@@ -128,7 +128,7 @@ dri_unbind_context(__DRIcontext * cPriv)
       if (--ctx->bind_count == 0) {
         if (ctx->st && ctx->st == st_get_current()) {
            st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
-           st_make_current(NULL, NULL, NULL);
+           st_make_current(NULL, NULL, NULL, NULL);
         }
       }
    }
@@ -161,7 +161,13 @@ dri_make_current(__DRIcontext * cPriv,
         ctx->r_stamp = driReadPriv->lastStamp - 1;
       }
 
-      st_make_current(ctx->st, draw->stfb, read->stfb);
+      /* DRI co-state tracker currently overrides flush_frontbuffer.
+       * When this is fixed, will need to pass the drawable in the
+       * fourth parameter here so that when Mesa calls
+       * flush_frontbuffer directly (in front-buffer rendering), it
+       * will have access to the drawable argument:
+       */
+      st_make_current(ctx->st, draw->stfb, read->stfb, NULL);
 
       if (__dri1_api_hooks) {
         dri1_update_drawables(ctx, draw, read);
@@ -170,7 +176,7 @@ dri_make_current(__DRIcontext * cPriv,
                           ctx->pipe->priv);
       }
    } else {
-      st_make_current(NULL, NULL, NULL);
+      st_make_current(NULL, NULL, NULL, NULL);
    }
 
    return GL_TRUE;
index f54c51a66817101aaccaefb8f6a4a62261bf3229..e4972d493d6cf43d085c87f22011f478c672916f 100644 (file)
@@ -892,8 +892,13 @@ egl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy,
    if (gctx) {
       ok = egl_g3d_realloc_context(dpy, &gctx->base);
       if (ok) {
+         /* XXX: need to pass the winsys argument for
+          * flush_frontbuffer in the fourth parameter here:
+          */
          ok = gctx->stapi->st_make_current(gctx->st_ctx,
-               gctx->draw.st_fb, gctx->read.st_fb);
+                                           gctx->draw.st_fb,
+                                           gctx->read.st_fb,
+                                           NULL);
          if (ok) {
             egl_g3d_validate_context(dpy, &gctx->base);
             if (gdraw->base.Type == EGL_WINDOW_BIT) {
@@ -905,7 +910,7 @@ egl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy,
       }
    }
    else if (old_gctx) {
-      ok = old_gctx->stapi->st_make_current(NULL, NULL, NULL);
+      ok = old_gctx->stapi->st_make_current(NULL, NULL, NULL, NULL);
       old_gctx->base.WindowRenderBuffer = EGL_NONE;
    }
 
index 507a0ec402753652b13909cf4dd0731a2adbb7d4..562dd68c150dec730ad587e299f07a9c516c2529 100644 (file)
@@ -9,7 +9,7 @@ ST_PUBLIC(st_get_framebuffer_surface,     int,                       struct st_f
 ST_PUBLIC(st_get_framebuffer_texture,     int,                       struct st_framebuffer *stfb, uint surfIndex, struct pipe_texture **texture)
 ST_PUBLIC(st_framebuffer_private,         void *,                    struct st_framebuffer *stfb)
 ST_PUBLIC(st_unreference_framebuffer,     void,                      struct st_framebuffer *stfb)
-ST_PUBLIC(st_make_current,                GLboolean,                 struct st_context *st, struct st_framebuffer *draw, struct st_framebuffer *read)
+ST_PUBLIC(st_make_current,                GLboolean,                 struct st_context *st, struct st_framebuffer *draw, struct st_framebuffer *read, void *winsys_drawable_handle)
 ST_PUBLIC(st_get_current,                 struct st_context *,       void)
 ST_PUBLIC(st_flush,                       void,                      struct st_context *st, uint pipeFlushFlags, struct pipe_fence_handle **fence)
 ST_PUBLIC(st_finish,                      void,                      struct st_context *st)
index 568bc6e96221b5bbcfe5bc01c7ebe00362094779..f4d7133d2ff1ed5ada9efeb4ef8ebb0fc7019124 100644 (file)
@@ -1020,7 +1020,8 @@ GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
       c->xm_buffer = drawBuffer;
       c->xm_read_buffer = readBuffer;
 
-      st_make_current(c->st, drawBuffer->stfb, readBuffer->stfb);
+      st_make_current(c->st, drawBuffer->stfb, readBuffer->stfb, 
+                      &drawBuffer->ws);
 
       xmesa_check_and_update_buffer_size(c, drawBuffer);
       if (readBuffer != drawBuffer)
@@ -1031,7 +1032,7 @@ GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
    }
    else {
       /* Detach */
-      st_make_current( NULL, NULL, NULL );
+      st_make_current( NULL, NULL, NULL, NULL );
 
    }
    return GL_TRUE;
index 57d3baad7fba47606164f521cd29d83cf52e834d..a002e50faf7ed11b3e3ec68d269d80fd17916329 100644 (file)
@@ -376,11 +376,19 @@ void st_unreference_framebuffer(struct st_framebuffer *stfb)
 
 boolean st_make_current(struct vg_context *st,
                         struct st_framebuffer *draw,
-                        struct st_framebuffer *read)
+                        struct st_framebuffer *read,
+                        void *winsys_drawable_handle)
 {
    vg_set_current_context(st);
    if (st) {
       st->draw_buffer = draw;
+
+      /* VG state tracker doesn't seem to do front-buffer rendering
+       * (no calls to flush_frontbuffer).  If it ever did start doing
+       * that, it would need to pass this value down in the
+       * flush_frontbuffer call:
+       */
+      st->pipe->priv = winsys_drawable_handle;
    }
    return VG_TRUE;
 }
index c1196954a76c08516ca41051cebb568e2b4b726f..165a6b7a332da73dd744d22ff8cf3939b96ff0af 100644 (file)
@@ -101,7 +101,8 @@ void st_unreference_framebuffer(struct st_framebuffer *stfb);
 PUBLIC
 boolean st_make_current(struct vg_context *st,
                         struct st_framebuffer *draw,
-                        struct st_framebuffer *read);
+                        struct st_framebuffer *read,
+                        void *winsys_drawable_handle);
 
 PUBLIC
 struct vg_context *st_get_current(void);
index 05ccd5febcf5b9a5615a2ba9d0958e6cb6f7a9e0..866f485a408a37b5b59a9a130ff23c878ed7c039 100644 (file)
@@ -226,7 +226,7 @@ DrvDeleteContext(
       
       /* Unbind current if deleting current context. */
       if (curctx == ctx)
-         st_make_current( NULL, NULL, NULL );
+         st_make_current( NULL, NULL, NULL, NULL );
 
       st_destroy_context(ctx->st);
       FREE(ctx);
@@ -317,7 +317,7 @@ stw_make_current(
    }
 
    if (hdc == NULL || dhglrc == 0) {
-      return st_make_current( NULL, NULL, NULL );
+      return st_make_current( NULL, NULL, NULL, NULL );
    }
 
    pipe_mutex_lock( stw_dev->ctx_mutex ); 
@@ -352,7 +352,7 @@ stw_make_current(
    /* pass to stw_flush_frontbuffer as context_private */
    ctx->st->pipe->priv = hdc;
    
-   if(!st_make_current( ctx->st, fb->stfb, fb->stfb ))
+   if(!st_make_current( ctx->st, fb->stfb, fb->stfb, hdc ))
       goto fail;
 
 success:
index 0358a70726123082e7d4b3f48622daff910443f5..09f891d691a1b297664726135f4be903e1a6e3a8 100644 (file)
@@ -272,7 +272,8 @@ void st_destroy_context( struct st_context *st )
 GLboolean
 st_make_current(struct st_context *st,
                 struct st_framebuffer *draw,
-                struct st_framebuffer *read)
+                struct st_framebuffer *read,
+                void *winsys_drawable_handle )
 {
    /* Call this periodically to detect when the user has begun using
     * GL rendering from multiple threads.
@@ -280,10 +281,13 @@ st_make_current(struct st_context *st,
    _glapi_check_multithread();
 
    if (st) {
-      if (!_mesa_make_current(st->ctx, &draw->Base, &read->Base))
+      if (!_mesa_make_current(st->ctx, &draw->Base, &read->Base)) {
+         st->pipe->priv = NULL;
          return GL_FALSE;
+      }
 
       _mesa_check_init_viewport(st->ctx, draw->InitWidth, draw->InitHeight);
+      st->pipe->priv = winsys_drawable_handle;
 
       return GL_TRUE;
    }
index 0824356cecc5c6eec1d59a89fd9a843eb5e69b78..4b40d6d04484ec25b2aedd9cce888465dca6478d 100644 (file)
@@ -105,7 +105,8 @@ void st_unreference_framebuffer( struct st_framebuffer *stfb );
 PUBLIC
 GLboolean st_make_current(struct st_context *st,
                           struct st_framebuffer *draw,
-                          struct st_framebuffer *read);
+                          struct st_framebuffer *read,
+                          void *winsys_drawable_handle);
 
 PUBLIC
 struct st_context *st_get_current(void);