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: