gallium/swr: Cleaned up some context-resource management
authorGeorge Kyriazis <george.kyriazis@intel.com>
Mon, 14 Mar 2016 22:40:14 +0000 (17:40 -0500)
committerTim Rowley <timothy.o.rowley@intel.com>
Fri, 18 Mar 2016 01:57:52 +0000 (20:57 -0500)
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.

Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/swr_context.cpp
src/gallium/drivers/swr/swr_resource.h
src/gallium/drivers/swr/swr_screen.cpp
src/gallium/drivers/swr/swr_screen.h
src/gallium/drivers/swr/swr_state.cpp

index c8cb145d3347d92958456bfdd26d65203ffa87a2..78b8fdf619b369015a1100d41e2dc01e34e73b95 100644 (file)
@@ -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;
index 2fdc7683cb82a9ff2961b12c766b86598a18ee87..59cf02844611d3cc032eda67e9fc0564f1783554 100644 (file)
@@ -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
index e46df47570fd3a59761795c85f141e0dfc5970aa..f9e52be2367f95af4cae7d2a65d07184ad13f590 100644 (file)
@@ -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);
    }
 
index a96dc44cf664849193bee48871310bdb1a8a4450..0c82a2eff7a1c17536f5587d4b33a8c1cd9b6387 100644 (file)
@@ -32,6 +32,7 @@ struct sw_winsys;
 
 struct swr_screen {
    struct pipe_screen base;
+   struct pipe_context *pipe;
 
    struct pipe_fence_handle *flush_fence;
 
index 47ee3cb2664d68895110b6954b78f16a7eb11cb7..e7bf3618a7d8dbd22d4f22c525030a9c99f23e89 100644 (file)
@@ -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);
    }
 }