Reviewed-by: Tim Rowley <timothy.o.row...@intel.com> > On Jun 17, 2016, at 12:14 PM, Bruce Cherniak <bruce.chern...@intel.com> wrote: > > 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 | 6 +++--- > src/gallium/drivers/swr/swr_state.cpp | 4 ++++ > 2 files changed, 7 insertions(+), 3 deletions(-) > > diff --git a/src/gallium/drivers/swr/swr_context.cpp > b/src/gallium/drivers/swr/swr_context.cpp > index 3a5d9e0..1f3a14c 100644 > --- a/src/gallium/drivers/swr/swr_context.cpp > +++ b/src/gallium/drivers/swr/swr_context.cpp > @@ -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; > diff --git a/src/gallium/drivers/swr/swr_state.cpp > b/src/gallium/drivers/swr/swr_state.cpp > index 3eeb98d..1f34365 100644 > --- a/src/gallium/drivers/swr/swr_state.cpp > +++ b/src/gallium/drivers/swr/swr_state.cpp > @@ -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; > -- > 1.7.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev