Merge branch 'gallium-dynamicstencilref'
[mesa.git] / src / gallium / drivers / nv50 / nv50_context.c
index 5997456e4c9911f02374a66e811d9f982045f505..7be12fcdef466a27681a66cda1141522f47299bf 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "draw/draw_context.h"
 #include "pipe/p_defines.h"
-#include "pipe/internal/p_winsys_screen.h"
 
 #include "nv50_context.h"
 #include "nv50_screen.h"
@@ -34,6 +33,11 @@ nv50_flush(struct pipe_context *pipe, unsigned flags,
        struct nv50_context *nv50 = nv50_context(pipe);
        struct nouveau_channel *chan = nv50->screen->base.channel;
 
+       if (flags & PIPE_FLUSH_TEXTURE_CACHE) {
+               BEGIN_RING(chan, nv50->screen->tesla, 0x1338, 1);
+               OUT_RING  (chan, 0x20);
+       }
+
        if (flags & PIPE_FLUSH_FRAME)
                FIRE_RING(chan);
 }
@@ -67,8 +71,12 @@ nv50_destroy(struct pipe_context *pipe)
                so_ref(NULL, &nv50->state.vertprog);
        if (nv50->state.fragprog)
                so_ref(NULL, &nv50->state.fragprog);
-       if (nv50->state.programs)
-               so_ref(NULL, &nv50->state.programs);
+       if (nv50->state.geomprog)
+               so_ref(NULL, &nv50->state.geomprog);
+       if (nv50->state.fp_linkage)
+               so_ref(NULL, &nv50->state.fp_linkage);
+       if (nv50->state.gp_linkage)
+               so_ref(NULL, &nv50->state.gp_linkage);
        if (nv50->state.vtxfmt)
                so_ref(NULL, &nv50->state.vtxfmt);
        if (nv50->state.vtxbuf)
@@ -77,12 +85,16 @@ nv50_destroy(struct pipe_context *pipe)
                so_ref(NULL, &nv50->state.vtxattr);
 
        draw_destroy(nv50->draw);
+
+       if (nv50->screen->cur_ctx == nv50)
+               nv50->screen->cur_ctx = NULL;
+
        FREE(nv50);
 }
 
 
 struct pipe_context *
-nv50_create(struct pipe_screen *pscreen, unsigned pctx_id)
+nv50_create(struct pipe_screen *pscreen, void *priv)
 {
        struct pipe_winsys *pipe_winsys = pscreen->winsys;
        struct nv50_screen *screen = nv50_screen(pscreen);
@@ -92,15 +104,17 @@ nv50_create(struct pipe_screen *pscreen, unsigned pctx_id)
        if (!nv50)
                return NULL;
        nv50->screen = screen;
-       nv50->pctx_id = pctx_id;
 
        nv50->pipe.winsys = pipe_winsys;
        nv50->pipe.screen = pscreen;
+       nv50->pipe.priv = priv;
 
        nv50->pipe.destroy = nv50_destroy;
 
        nv50->pipe.draw_arrays = nv50_draw_arrays;
+       nv50->pipe.draw_arrays_instanced = nv50_draw_arrays_instanced;
        nv50->pipe.draw_elements = nv50_draw_elements;
+       nv50->pipe.draw_elements_instanced = nv50_draw_elements_instanced;
        nv50->pipe.clear = nv50_clear;
 
        nv50->pipe.flush = nv50_flush;