[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

mesa: Changes to 'ubuntu-oneiric'



 debian/changelog                                                 |    8 
 debian/patches/125_nv50_nvc0_use_screen_for_flush_notifier.patch |  221 ++++++++++
 2 files changed, 229 insertions(+)

New commits:
commit 30a4a84a8f8a8ff0c30df08add104fe6e443fcf1
Author: Bryce Harrington <bryce@canonical.com>
Date:   Thu Jul 19 15:01:40 2012 -0700

    Add 125_nv50_nvc0_use_screen_for_flush_notifier.patch

diff --git a/debian/changelog b/debian/changelog
index ed508bb..c9361a9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+mesa (7.11-0ubuntu3.3) oneiric-proposed; urgency=low
+
+  * Add 125_nv50_nvc0_use_screen_for_flush_notifier.patch to fix es2_info
+    crash.  Backport from mesa 8.0.
+    (LP: #926918)
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Thu, 19 Jul 2012 13:37:06 -0700
+
 mesa (7.11-0ubuntu3.2) oneiric-proposed; urgency=low
 
   * Add patch series from upstream stable release to fix various issues:
diff --git a/debian/patches/125_nv50_nvc0_use_screen_for_flush_notifier.patch b/debian/patches/125_nv50_nvc0_use_screen_for_flush_notifier.patch
new file mode 100644
index 0000000..f02e75d
--- /dev/null
+++ b/debian/patches/125_nv50_nvc0_use_screen_for_flush_notifier.patch
@@ -0,0 +1,221 @@
+commit 3069a7eaa5d83e7f41616347ba244c0dc0d944ae
+Author: Christoph Bumiller <e0425955@student.tuwien.ac.at>
+Date:   Thu Jul 7 14:58:29 2011 +0200
+
+    nv50,nvc0: use screen instead of context for flush notifier
+    
+    Context may become NULL and we still have to be able to flush
+    pending fences.
+
+diff --git a/src/gallium/drivers/nv50/nv50_context.c b/src/gallium/drivers/nv50/nv50_context.c
+index ceb83f6..ac3e361 100644
+--- a/src/gallium/drivers/nv50/nv50_context.c
++++ b/src/gallium/drivers/nv50/nv50_context.c
+@@ -60,13 +60,13 @@ nv50_texture_barrier(struct pipe_context *pipe)
+ void
+ nv50_default_flush_notify(struct nouveau_channel *chan)
+ {
+-   struct nv50_context *nv50 = chan->user_private;
++   struct nv50_screen *screen = chan->user_private;
+ 
+-   if (!nv50)
++   if (!screen)
+       return;
+ 
+-   nouveau_fence_update(&nv50->screen->base, TRUE);
+-   nouveau_fence_next(&nv50->screen->base);
++   nouveau_fence_update(&screen->base, TRUE);
++   nouveau_fence_next(&screen->base);
+ }
+ 
+ static void
+@@ -100,10 +100,8 @@ nv50_destroy(struct pipe_context *pipe)
+ 
+    draw_destroy(nv50->draw);
+ 
+-   if (nv50->screen->cur_ctx == nv50) {
+-      nv50->screen->base.channel->user_private = NULL;
++   if (nv50->screen->cur_ctx == nv50)
+       nv50->screen->cur_ctx = NULL;
+-   }
+ 
+    FREE(nv50);
+ }
+@@ -140,7 +138,6 @@ nv50_create(struct pipe_screen *pscreen, void *priv)
+ 
+    if (!screen->cur_ctx)
+       screen->cur_ctx = nv50;
+-   screen->base.channel->user_private = nv50;
+    screen->base.channel->flush_notify = nv50_default_flush_notify;
+ 
+    nv50_init_query_functions(nv50);
+diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c
+index cc921d0..4cda303 100644
+--- a/src/gallium/drivers/nv50/nv50_screen.c
++++ b/src/gallium/drivers/nv50/nv50_screen.c
+@@ -215,6 +215,7 @@ nv50_screen_destroy(struct pipe_screen *pscreen)
+       nouveau_fence_wait(screen->base.fence.current);
+       nouveau_fence_ref (NULL, &screen->base.fence.current);
+    }
++   screen->base.channel->user_private = NULL;
+ 
+    nouveau_bo_ref(NULL, &screen->code);
+    nouveau_bo_ref(NULL, &screen->tls_bo);
+@@ -300,6 +301,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
+       FAIL_SCREEN_INIT("nouveau_screen_init failed: %d\n", ret);
+ 
+    chan = screen->base.channel;
++   chan->user_private = screen;
+ 
+    pscreen->winsys = ws;
+    pscreen->destroy = nv50_screen_destroy;
+diff --git a/src/gallium/drivers/nv50/nv50_state_validate.c b/src/gallium/drivers/nv50/nv50_state_validate.c
+index 11561f5..d29c1e9 100644
+--- a/src/gallium/drivers/nv50/nv50_state_validate.c
++++ b/src/gallium/drivers/nv50/nv50_state_validate.c
+@@ -282,8 +282,7 @@ nv50_switch_pipe_context(struct nv50_context *ctx_to)
+    if (!ctx_to->zsa)
+       ctx_to->dirty &= ~NV50_NEW_ZSA;
+ 
+-   ctx_to->screen->base.channel->user_private = ctx_to->screen->cur_ctx =
+-      ctx_to;
++   ctx_to->screen->cur_ctx = ctx_to;
+ }
+ 
+ static struct state_validate {
+diff --git a/src/gallium/drivers/nv50/nv50_vbo.c b/src/gallium/drivers/nv50/nv50_vbo.c
+index bb08941..f23008a 100644
+--- a/src/gallium/drivers/nv50/nv50_vbo.c
++++ b/src/gallium/drivers/nv50/nv50_vbo.c
+@@ -389,11 +389,11 @@ nv50_prim_gl(unsigned prim)
+ static void
+ nv50_draw_vbo_flush_notify(struct nouveau_channel *chan)
+ {
+-   struct nv50_context *nv50 = chan->user_private;
++   struct nv50_screen *screen = chan->user_private;
+ 
+-   nouveau_fence_update(&nv50->screen->base, TRUE);
++   nouveau_fence_update(&screen->base, TRUE);
+ 
+-   nv50_bufctx_emit_relocs(nv50);
++   nv50_bufctx_emit_relocs(screen->cur_ctx);
+ }
+ 
+ static void
+@@ -650,7 +650,6 @@ nv50_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
+    nv50_state_validate(nv50);
+ 
+    chan->flush_notify = nv50_draw_vbo_flush_notify;
+-   chan->user_private = nv50;
+ 
+    if (nv50->vbo_fifo) {
+       nv50_push_vbo(nv50, info);
+diff --git a/src/gallium/drivers/nvc0/nvc0_context.c b/src/gallium/drivers/nvc0/nvc0_context.c
+index 2679b7f..983db23 100644
+--- a/src/gallium/drivers/nvc0/nvc0_context.c
++++ b/src/gallium/drivers/nvc0/nvc0_context.c
+@@ -89,10 +89,8 @@ nvc0_destroy(struct pipe_context *pipe)
+ 
+    draw_destroy(nvc0->draw);
+ 
+-   if (nvc0->screen->cur_ctx == nvc0) {
+-      nvc0->screen->base.channel->user_private = NULL;
++   if (nvc0->screen->cur_ctx == nvc0)
+       nvc0->screen->cur_ctx = NULL;
+-   }
+ 
+    FREE(nvc0);
+ }
+@@ -100,13 +98,13 @@ nvc0_destroy(struct pipe_context *pipe)
+ void
+ nvc0_default_flush_notify(struct nouveau_channel *chan)
+ {
+-   struct nvc0_context *nvc0 = chan->user_private;
++   struct nvc0_screen *screen = chan->user_private;
+ 
+-   if (!nvc0)
++   if (!screen)
+       return;
+ 
+-   nouveau_fence_update(&nvc0->screen->base, TRUE);
+-   nouveau_fence_next(&nvc0->screen->base);
++   nouveau_fence_update(&screen->base, TRUE);
++   nouveau_fence_next(&screen->base);
+ }
+ 
+ struct pipe_context *
+@@ -141,7 +139,6 @@ nvc0_create(struct pipe_screen *pscreen, void *priv)
+ 
+    if (!screen->cur_ctx)
+       screen->cur_ctx = nvc0;
+-   screen->base.channel->user_private = nvc0;
+    screen->base.channel->flush_notify = nvc0_default_flush_notify;
+ 
+    nvc0_init_query_functions(nvc0);
+diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c
+index 34bf0f0..1bd7fa9 100644
+--- a/src/gallium/drivers/nvc0/nvc0_screen.c
++++ b/src/gallium/drivers/nvc0/nvc0_screen.c
+@@ -198,8 +198,11 @@ nvc0_screen_destroy(struct pipe_screen *pscreen)
+ {
+    struct nvc0_screen *screen = nvc0_screen(pscreen);
+ 
+-   nouveau_fence_wait(screen->base.fence.current);
+-   nouveau_fence_ref(NULL, &screen->base.fence.current);
++   if (screen->base.fence.current) {
++      nouveau_fence_wait(screen->base.fence.current);
++      nouveau_fence_ref(NULL, &screen->base.fence.current);
++   }
++   screen->base.channel->user_private = NULL;
+ 
+    nouveau_bo_ref(NULL, &screen->text);
+    nouveau_bo_ref(NULL, &screen->tls);
+@@ -358,6 +361,7 @@ nvc0_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
+       return NULL;
+    }
+    chan = screen->base.channel;
++   chan->user_private = screen;
+ 
+    pscreen->winsys = ws;
+    pscreen->destroy = nvc0_screen_destroy;
+diff --git a/src/gallium/drivers/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nvc0/nvc0_state_validate.c
+index 9b2a281..f300f37 100644
+--- a/src/gallium/drivers/nvc0/nvc0_state_validate.c
++++ b/src/gallium/drivers/nvc0/nvc0_state_validate.c
+@@ -428,8 +428,7 @@ nvc0_switch_pipe_context(struct nvc0_context *ctx_to)
+    if (!ctx_to->zsa)
+       ctx_to->dirty &= ~NVC0_NEW_ZSA;
+ 
+-   ctx_to->screen->base.channel->user_private = ctx_to->screen->cur_ctx =
+-      ctx_to;
++   ctx_to->screen->cur_ctx = ctx_to;
+ }
+ 
+ static struct state_validate {
+diff --git a/src/gallium/drivers/nvc0/nvc0_vbo.c b/src/gallium/drivers/nvc0/nvc0_vbo.c
+index 4107910..8a5bf8d 100644
+--- a/src/gallium/drivers/nvc0/nvc0_vbo.c
++++ b/src/gallium/drivers/nvc0/nvc0_vbo.c
+@@ -367,11 +367,11 @@ nvc0_prim_gl(unsigned prim)
+ static void
+ nvc0_draw_vbo_flush_notify(struct nouveau_channel *chan)
+ {
+-   struct nvc0_context *nvc0 = chan->user_private;
++   struct nvc0_screen *screen = chan->user_private;
+ 
+-   nouveau_fence_update(&nvc0->screen->base, TRUE);
++   nouveau_fence_update(&screen->base, TRUE);
+ 
+-   nvc0_bufctx_emit_relocs(nvc0);
++   nvc0_bufctx_emit_relocs(screen->cur_ctx);
+ }
+ 
+ static void
+@@ -587,7 +587,6 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
+    nvc0_state_validate(nvc0);
+ 
+    chan->flush_notify = nvc0_draw_vbo_flush_notify;
+-   chan->user_private = nvc0;
+ 
+    if (nvc0->vbo_fifo) {
+       nvc0_push_vbo(nvc0, info);


Reply to: