Reviewed-by: Bruce Cherniak <[email protected]>
On 3/14/16, 5:40 PM, "mesa-dev on behalf of George Kyriazis" <[email protected] on behalf of [email protected]> wrote: >Removed bound_to_context. We now pick up the context from the screen >instead of the resource itself. The resource could be out-of-date >and point to a pipe that is already freed. > >Fixes manywin mesa xdemo. >--- > src/gallium/drivers/swr/swr_context.cpp | 16 +++++++++++----- > src/gallium/drivers/swr/swr_resource.h | 18 ++++++------------ > src/gallium/drivers/swr/swr_screen.cpp | 8 ++++---- > src/gallium/drivers/swr/swr_screen.h | 1 + > src/gallium/drivers/swr/swr_state.cpp | 10 +++++----- > 5 files changed, 27 insertions(+), 26 deletions(-) > >diff --git a/src/gallium/drivers/swr/swr_context.cpp >b/src/gallium/drivers/swr/swr_context.cpp >index c8cb145..78b8fdf 100644 >--- a/src/gallium/drivers/swr/swr_context.cpp >+++ b/src/gallium/drivers/swr/swr_context.cpp >@@ -129,7 +129,7 @@ swr_transfer_map(struct pipe_context *pipe, > swr_fence_submit(swr_context(pipe), screen->flush_fence); > > swr_fence_finish(pipe->screen, screen->flush_fence, 0); >- swr_resource_unused(pipe, spr); >+ swr_resource_unused(resource); > } > } > } >@@ -206,8 +206,8 @@ swr_resource_copy(struct pipe_context *pipe, > swr_store_dirty_resource(pipe, dst, SWR_TILE_RESOLVED); > > swr_fence_finish(pipe->screen, screen->flush_fence, 0); >- swr_resource_unused(pipe, swr_resource(src)); >- swr_resource_unused(pipe, swr_resource(dst)); >+ swr_resource_unused(src); >+ swr_resource_unused(dst); > > if ((dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) > || (dst->target != PIPE_BUFFER && src->target != PIPE_BUFFER)) { >@@ -293,6 +293,7 @@ static void > swr_destroy(struct pipe_context *pipe) > { > struct swr_context *ctx = swr_context(pipe); >+ struct swr_screen *screen = swr_screen(pipe->screen); > > if (ctx->blitter) > util_blitter_destroy(ctx->blitter); >@@ -306,6 +307,9 @@ swr_destroy(struct pipe_context *pipe) > > swr_destroy_scratch_buffers(ctx); > >+ assert(screen); >+ screen->pipe = NULL; >+ > FREE(ctx); > } > >@@ -324,9 +328,10 @@ swr_render_condition(struct pipe_context *pipe, > } > > struct pipe_context * >-swr_create_context(struct pipe_screen *screen, void *priv, unsigned flags) >+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>; > >@@ -347,7 +352,8 @@ swr_create_context(struct pipe_screen *screen, void *priv, >unsigned flags) > if (ctx->swrContext == NULL) > goto fail; > >- ctx->pipe.screen = screen; >+ screen->pipe = &ctx->pipe; >+ ctx->pipe.screen = p_screen; > ctx->pipe.destroy = swr_destroy; > ctx->pipe.priv = priv; > ctx->pipe.create_surface = swr_create_surface; >diff --git a/src/gallium/drivers/swr/swr_resource.h >b/src/gallium/drivers/swr/swr_resource.h >index 2fdc768..59cf028 100644 >--- a/src/gallium/drivers/swr/swr_resource.h >+++ b/src/gallium/drivers/swr/swr_resource.h >@@ -54,9 +54,6 @@ struct swr_resource { > unsigned mip_offsets[PIPE_MAX_TEXTURE_LEVELS]; > > enum swr_resource_status status; >- >- /* pipe_context to which resource is currently bound. */ >- struct pipe_context *bound_to_context; > }; > > >@@ -120,24 +117,21 @@ swr_resource_status & operator|=(enum >swr_resource_status & a, > } > > static INLINE void >-swr_resource_read(struct pipe_context *pipe, struct swr_resource *resource) >+swr_resource_read(struct pipe_resource *resource) > { >- resource->status |= SWR_RESOURCE_READ; >- resource->bound_to_context = pipe; >+ swr_resource(resource)->status |= SWR_RESOURCE_READ; > } > > static INLINE void >-swr_resource_write(struct pipe_context *pipe, struct swr_resource *resource) >+swr_resource_write(struct pipe_resource *resource) > { >- resource->status |= SWR_RESOURCE_WRITE; >- resource->bound_to_context = pipe; >+ swr_resource(resource)->status |= SWR_RESOURCE_WRITE; > } > > static INLINE void >-swr_resource_unused(struct pipe_context *pipe, struct swr_resource *resource) >+swr_resource_unused(struct pipe_resource *resource) > { >- resource->status = SWR_RESOURCE_UNUSED; >- resource->bound_to_context = nullptr; >+ swr_resource(resource)->status = SWR_RESOURCE_UNUSED; > } > > #endif >diff --git a/src/gallium/drivers/swr/swr_screen.cpp >b/src/gallium/drivers/swr/swr_screen.cpp >index e46df47..f9e52be 100644 >--- a/src/gallium/drivers/swr/swr_screen.cpp >+++ b/src/gallium/drivers/swr/swr_screen.cpp >@@ -620,7 +620,7 @@ swr_resource_destroy(struct pipe_screen *p_screen, struct >pipe_resource *pt) > { > struct swr_screen *screen = swr_screen(p_screen); > struct swr_resource *spr = swr_resource(pt); >- struct pipe_context *pipe = spr->bound_to_context; >+ struct pipe_context *pipe = screen->pipe; > > /* Only wait on fence if the resource is being used */ > if (pipe && spr->status) { >@@ -630,7 +630,7 @@ swr_resource_destroy(struct pipe_screen *p_screen, struct >pipe_resource *pt) > swr_fence_submit(swr_context(pipe), screen->flush_fence); > > swr_fence_finish(p_screen, screen->flush_fence, 0); >- swr_resource_unused(pipe, spr); >+ swr_resource_unused(pt); > } > > /* >@@ -661,11 +661,11 @@ swr_flush_frontbuffer(struct pipe_screen *p_screen, > struct swr_screen *screen = swr_screen(p_screen); > struct sw_winsys *winsys = screen->winsys; > struct swr_resource *spr = swr_resource(resource); >- struct pipe_context *pipe = spr->bound_to_context; >+ struct pipe_context *pipe = screen->pipe; > > if (pipe) { > swr_fence_finish(p_screen, screen->flush_fence, 0); >- swr_resource_unused(pipe, spr); >+ swr_resource_unused(resource); > SwrEndFrame(swr_context(pipe)->swrContext); > } > >diff --git a/src/gallium/drivers/swr/swr_screen.h >b/src/gallium/drivers/swr/swr_screen.h >index a96dc44..0c82a2e 100644 >--- a/src/gallium/drivers/swr/swr_screen.h >+++ b/src/gallium/drivers/swr/swr_screen.h >@@ -32,6 +32,7 @@ struct sw_winsys; > > struct swr_screen { > struct pipe_screen base; >+ struct pipe_context *pipe; > > struct pipe_fence_handle *flush_fence; > >diff --git a/src/gallium/drivers/swr/swr_state.cpp >b/src/gallium/drivers/swr/swr_state.cpp >index 47ee3cb..e7bf361 100644 >--- a/src/gallium/drivers/swr/swr_state.cpp >+++ b/src/gallium/drivers/swr/swr_state.cpp >@@ -646,24 +646,24 @@ swr_update_resource_status(struct pipe_context *pipe, > if (fb->nr_cbufs) > for (uint32_t i = 0; i < fb->nr_cbufs; ++i) > if (fb->cbufs[i]) >- swr_resource_write(pipe, swr_resource(fb->cbufs[i]->texture)); >+ swr_resource_write(fb->cbufs[i]->texture); > > /* depth/stencil target */ > if (fb->zsbuf) >- swr_resource_write(pipe, swr_resource(fb->zsbuf->texture)); >+ swr_resource_write(fb->zsbuf->texture); > > /* VBO vertex buffers */ > for (uint32_t i = 0; i < ctx->num_vertex_buffers; i++) { > struct pipe_vertex_buffer *vb = &ctx->vertex_buffer[i]; > if (!vb->user_buffer) >- swr_resource_read(pipe, swr_resource(vb->buffer)); >+ swr_resource_read(vb->buffer); > } > > /* VBO index buffer */ > if (p_draw_info && p_draw_info->indexed) { > struct pipe_index_buffer *ib = &ctx->index_buffer; > if (!ib->user_buffer) >- swr_resource_read(pipe, swr_resource(ib->buffer)); >+ swr_resource_read(ib->buffer); > } > > /* texture sampler views */ >@@ -671,7 +671,7 @@ swr_update_resource_status(struct pipe_context *pipe, > struct pipe_sampler_view *view = > ctx->sampler_views[PIPE_SHADER_FRAGMENT][i]; > if (view) >- swr_resource_read(pipe, swr_resource(view->texture)); >+ swr_resource_read(view->texture); > } > } > >-- >2.5.0 > >_______________________________________________ >mesa-dev mailing list >[email protected] >https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
