nv50: remove horrific abuse of nouveau_channel.flush_notify
authorBen Skeggs <bskeggs@redhat.com>
Wed, 3 Mar 2010 04:59:28 +0000 (14:59 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 10 Mar 2010 06:29:59 +0000 (16:29 +1000)
Really though, using this at all is just not a good idea in the 3D driver.
I'm almost certain the hardware will not like a reloc appearing between
begin()/end().. Anyways, this is still better than before, more fixes
to come..

src/gallium/drivers/nv50/nv50_context.c
src/gallium/drivers/nv50/nv50_vbo.c

index eff012c14d3ff1e557c5afd0d6e36165aa1647cb..0eb42f323ffac218b71d1edd65a27f8f73a24ff7 100644 (file)
@@ -93,7 +93,6 @@ nv50_create(struct pipe_screen *pscreen, void *priv)
        nv50->pipe.is_buffer_referenced = nouveau_is_buffer_referenced;
 
        screen->base.channel->user_private = nv50;
-       screen->base.channel->flush_notify = nv50_state_flush_notify;
 
        nv50_init_surface_functions(nv50);
        nv50_init_state_functions(nv50);
index ce2e479cfda551fa5df8280fa43ffb3f27e4e489..215dfb74fc25d84c99cee4cfe08cadf1594ac84d 100644 (file)
@@ -427,6 +427,7 @@ nv50_draw_arrays_instanced(struct pipe_context *pipe,
 
        if (!nv50_state_validate(nv50, 0))
                return;
+       chan->flush_notify = nv50_state_flush_notify;
 
        nz_divisors = init_per_instance_arrays(nv50, startInstance, pos, step);
 
@@ -464,6 +465,8 @@ nv50_draw_arrays_instanced(struct pipe_context *pipe,
                BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
                OUT_RING  (chan, 0);
        }
+
+       chan->flush_notify = NULL;
        nv50_unmap_vbufs(nv50);
 
        so_ref(NULL, &nv50->state.instbuf);
@@ -480,6 +483,7 @@ nv50_draw_arrays(struct pipe_context *pipe, unsigned mode, unsigned start,
 
        if (!nv50_state_validate(nv50, 11))
                return;
+       chan->flush_notify = nv50_state_flush_notify;
 
        BEGIN_RING(chan, tesla, 0x142c, 1);
        OUT_RING  (chan, 0);
@@ -500,6 +504,7 @@ nv50_draw_arrays(struct pipe_context *pipe, unsigned mode, unsigned start,
        BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
        OUT_RING  (chan, 0);
 
+       chan->flush_notify = NULL;
        nv50_unmap_vbufs(nv50);
 
         /* XXX: not sure what to do if ret != TRUE: flush and retry?
@@ -637,6 +642,7 @@ nv50_draw_elements_instanced(struct pipe_context *pipe,
 
        if (!nv50_state_validate(nv50, 0))
                return;
+       chan->flush_notify = nv50_state_flush_notify;
 
        nz_divisors = init_per_instance_arrays(nv50, startInstance, pos, step);
 
@@ -664,6 +670,8 @@ nv50_draw_elements_instanced(struct pipe_context *pipe,
                BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
                OUT_RING  (chan, 0);
        }
+
+       chan->flush_notify = NULL;
        nv50_unmap_vbufs(nv50);
 
        so_ref(NULL, &nv50->state.instbuf);
@@ -682,6 +690,7 @@ nv50_draw_elements(struct pipe_context *pipe,
        
        if (!nv50_state_validate(nv50, 14))
                return;
+       chan->flush_notify = nv50_state_flush_notify;
 
        BEGIN_RING(chan, tesla, 0x142c, 1);
        OUT_RING  (chan, 0);
@@ -720,6 +729,7 @@ nv50_draw_elements(struct pipe_context *pipe,
 
        BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
        OUT_RING  (chan, 0);
+       chan->flush_notify = NULL;
 }
 
 static INLINE boolean