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.
This commit is contained in:
Christoph Bumiller 2011-07-07 14:58:29 +02:00
parent e54354e885
commit 3069a7eaa5
8 changed files with 26 additions and 30 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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 {

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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 {

View File

@ -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);