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 <br...@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 <br...@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 <e0425...@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); -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1srynx-0008po...@vasks.debian.org