swr: Update screen->context pointer with multiple contexts.
authorBruce Cherniak <bruce.cherniak@intel.com>
Fri, 17 Jun 2016 17:14:54 +0000 (12:14 -0500)
committerTim Rowley <timothy.o.rowley@intel.com>
Fri, 17 Jun 2016 18:56:03 +0000 (13:56 -0500)
A pipe pointer in the screen allows for access to current device context
 in flush_frontbuffer and resource_destroy.  This wasn't tracking current
context in multi-context situations.

v2: More caffeine.  Corrected compare, removed unnecessary set of
screen-pipe in create_context, and added a few comments.

src/gallium/drivers/swr/swr_context.cpp
src/gallium/drivers/swr/swr_state.cpp

index 3a5d9e07ab3aa2d847b6b9a504bbb1f8a507b5eb..1f3a14cb9c8a2dd83578e4e8caf6670fac2c5509 100644 (file)
@@ -322,8 +322,10 @@ swr_destroy(struct pipe_context *pipe)
 
    swr_destroy_scratch_buffers(ctx);
 
+   /* Only update screen->pipe if current context is being destroyed */
    assert(screen);
-   screen->pipe = NULL;
+   if (screen->pipe == pipe)
+      screen->pipe = NULL;
 
    FREE(ctx);
 }
@@ -346,7 +348,6 @@ struct pipe_context *
 swr_create_context(struct pipe_screen *p_screen, void *priv, unsigned flags)
 {
    struct swr_context *ctx = CALLOC_STRUCT(swr_context);
-   struct swr_screen *screen = swr_screen(p_screen);
    ctx->blendJIT =
       new std::unordered_map<BLEND_COMPILE_STATE, PFN_BLEND_JIT_FUNC>;
 
@@ -366,7 +367,6 @@ swr_create_context(struct pipe_screen *p_screen, void *priv, unsigned flags)
    if (ctx->swrContext == NULL)
       goto fail;
 
-   screen->pipe = &ctx->pipe;
    ctx->pipe.screen = p_screen;
    ctx->pipe.destroy = swr_destroy;
    ctx->pipe.priv = priv;
index 3eeb98d0261b52b45349d8eb9aedf9e3345f818c..1f34365d30e12229d1d4bae99d776aa4173c41d7 100644 (file)
@@ -776,6 +776,10 @@ swr_update_derived(struct pipe_context *pipe,
    struct swr_context *ctx = swr_context(pipe);
    struct swr_screen *screen = swr_screen(ctx->pipe.screen);
 
+   /* Update screen->pipe to current pipe context. */
+   if (screen->pipe != pipe)
+      screen->pipe = pipe;
+
    /* Any state that requires dirty flags to be re-triggered sets this mask */
    /* For example, user_buffer vertex and index buffers. */
    unsigned post_update_dirty_flags = 0;