summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nvc0/nvc0_context.c
diff options
context:
space:
mode:
authorChristian König <[email protected]>2011-03-04 17:15:43 +0100
committerChristian König <[email protected]>2011-03-04 17:15:43 +0100
commit54f11a27a1ec28fcf9734f4454dee870bc0113f8 (patch)
tree2dc71d95b1ad5d2ca966bbb6726fba45b4cfbac1 /src/gallium/drivers/nvc0/nvc0_context.c
parent0eccb1038a620bc76ba45ac00c293b3e88427510 (diff)
parent6838c9ce74f16c765474c0d2b4ae1469dd4a64d5 (diff)
Merge remote branch 'origin/master' into pipe-video
Diffstat (limited to 'src/gallium/drivers/nvc0/nvc0_context.c')
-rw-r--r--src/gallium/drivers/nvc0/nvc0_context.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/src/gallium/drivers/nvc0/nvc0_context.c b/src/gallium/drivers/nvc0/nvc0_context.c
index f02de4d044a..d6de979b132 100644
--- a/src/gallium/drivers/nvc0/nvc0_context.c
+++ b/src/gallium/drivers/nvc0/nvc0_context.c
@@ -48,8 +48,8 @@ nvc0_flush(struct pipe_context *pipe, unsigned flags,
}
if (fence)
- nvc0_fence_reference((struct nvc0_fence **)fence,
- nvc0->screen->fence.current);
+ nouveau_fence_ref(nvc0->screen->base.fence.current,
+ (struct nouveau_fence **)fence);
if (flags & (PIPE_FLUSH_SWAPBUFFERS | PIPE_FLUSH_FRAME))
FIRE_RING(chan);
@@ -62,8 +62,10 @@ nvc0_destroy(struct pipe_context *pipe)
draw_destroy(nvc0->draw);
- if (nvc0->screen->cur_ctx == nvc0)
+ if (nvc0->screen->cur_ctx == nvc0) {
+ nvc0->screen->base.channel->user_private = NULL;
nvc0->screen->cur_ctx = NULL;
+ }
FREE(nvc0);
}
@@ -73,9 +75,11 @@ nvc0_default_flush_notify(struct nouveau_channel *chan)
{
struct nvc0_context *nvc0 = chan->user_private;
- nvc0_screen_fence_update(nvc0->screen, TRUE);
+ if (!nvc0)
+ return;
- nvc0_screen_fence_next(nvc0->screen);
+ nouveau_fence_update(&nvc0->screen->base, TRUE);
+ nouveau_fence_next(&nvc0->screen->base);
}
struct pipe_context *
@@ -84,46 +88,54 @@ nvc0_create(struct pipe_screen *pscreen, void *priv)
struct pipe_winsys *pipe_winsys = pscreen->winsys;
struct nvc0_screen *screen = nvc0_screen(pscreen);
struct nvc0_context *nvc0;
+ struct pipe_context *pipe;
nvc0 = CALLOC_STRUCT(nvc0_context);
if (!nvc0)
return NULL;
+ pipe = &nvc0->base.pipe;
+
nvc0->screen = screen;
+ nvc0->base.screen = &screen->base;
+ nvc0->base.copy_data = nvc0_m2mf_copy_linear;
+ nvc0->base.push_data = nvc0_m2mf_push_linear;
- nvc0->pipe.winsys = pipe_winsys;
- nvc0->pipe.screen = pscreen;
- nvc0->pipe.priv = priv;
+ pipe->winsys = pipe_winsys;
+ pipe->screen = pscreen;
+ pipe->priv = priv;
- nvc0->pipe.destroy = nvc0_destroy;
+ pipe->destroy = nvc0_destroy;
- nvc0->pipe.draw_vbo = nvc0_draw_vbo;
- nvc0->pipe.clear = nvc0_clear;
+ pipe->draw_vbo = nvc0_draw_vbo;
+ pipe->clear = nvc0_clear;
- nvc0->pipe.flush = nvc0_flush;
+ pipe->flush = nvc0_flush;
+ 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);
nvc0_init_surface_functions(nvc0);
nvc0_init_state_functions(nvc0);
- nvc0_init_resource_functions(&nvc0->pipe);
+ nvc0_init_resource_functions(pipe);
- nvc0->draw = draw_create(&nvc0->pipe);
+ nvc0->draw = draw_create(pipe);
assert(nvc0->draw);
draw_set_rasterize_stage(nvc0->draw, nvc0_draw_render_stage(nvc0));
- return &nvc0->pipe;
+ return pipe;
}
struct resident {
- struct nvc0_resource *res;
+ struct nv04_resource *res;
uint32_t flags;
};
void
nvc0_bufctx_add_resident(struct nvc0_context *nvc0, int ctx,
- struct nvc0_resource *resource, uint32_t flags)
+ struct nv04_resource *resource, uint32_t flags)
{
struct resident rsd = { resource, flags };
@@ -138,7 +150,7 @@ nvc0_bufctx_add_resident(struct nvc0_context *nvc0, int ctx,
void
nvc0_bufctx_del_resident(struct nvc0_context *nvc0, int ctx,
- struct nvc0_resource *resource)
+ struct nv04_resource *resource)
{
struct resident *rsd, *top;
unsigned i;