nvfx: stop using flush_notify
authorLuca Barbieri <luca@luca-barbieri.com>
Sun, 14 Mar 2010 02:09:02 +0000 (03:09 +0100)
committerLuca Barbieri <luca@luca-barbieri.com>
Mon, 12 Apr 2010 10:13:16 +0000 (12:13 +0200)
Rather than emitting relocations on flush notifications, emit them
in nvfx_state_start.

src/gallium/drivers/nvfx/nvfx_context.c
src/gallium/drivers/nvfx/nvfx_context.h
src/gallium/drivers/nvfx/nvfx_state_emit.c

index 61f55907e0de282587a471f3d2bec649993ae495..31c3e2bc39b5169052e80bab0b02cb3e7d0b3300 100644 (file)
@@ -67,7 +67,6 @@ nvfx_create(struct pipe_screen *pscreen, void *priv)
        nvfx->pipe.flush = nvfx_flush;
 
        screen->base.channel->user_private = nvfx;
-       screen->base.channel->flush_notify = nvfx_state_flush_notify;
 
        nvfx->is_nv4x = screen->is_nv4x;
 
index 9d988b015c2f10b1f634a8029c52f97a37649773..138f480560ec7eb97928c06417d245babddd8b3b 100644 (file)
@@ -239,7 +239,7 @@ nv40_fragtex_build(struct nvfx_context *nvfx, int unit);
 extern void nvfx_init_state_functions(struct nvfx_context *nvfx);
 
 /* nvfx_state_emit.c */
-extern void nvfx_state_flush_notify(struct nouveau_channel *chan);
+extern void nvfx_state_relocate(struct nvfx_context *nvfx);
 extern boolean nvfx_state_validate(struct nvfx_context *nvfx);
 extern boolean nvfx_state_validate_swtnl(struct nvfx_context *nvfx);
 extern void nvfx_state_emit(struct nvfx_context *nvfx);
index 72537388ea407ada4801d97f4ba9285ee06686e5..d67fb5613f63e628073fa1f4f81890b316381d28 100644 (file)
@@ -81,12 +81,24 @@ nvfx_state_emit(struct nvfx_context *nvfx)
                }
        }
        state->dirty = 0;
+
+       /* we need to ensure there is enough space to output relocations in one go */
+       unsigned max_relocs = 0
+             + 16 /* vertex buffers, incl. dma flag */
+             + 2 /* index buffer plus format+dma flag */
+             + 2 * 5 /* 4 cbufs + zsbuf, plus dma objects */
+             + 2 * 16 /* fragment textures plus format+dma flag */
+             + 2 * 4 /* vertex textures plus format+dma flag */
+             + 1 /* fragprog incl dma flag */
+             ;
+       MARK_RING(chan, max_relocs * 2, max_relocs * 2);
+       nvfx_state_relocate(nvfx);
 }
 
 void
-nvfx_state_flush_notify(struct nouveau_channel *chan)
+nvfx_state_relocate(struct nvfx_context *nvfx)
 {
-       struct nvfx_context *nvfx = chan->user_private;
+       struct nouveau_channel *chan = nvfx->screen->base.channel;
        struct nvfx_state *state = &nvfx->state;
        unsigned i, samplers;