nv50: use relocs rather than re-uploading TIC all the time
authorBen Skeggs <bskeggs@redhat.com>
Wed, 3 Mar 2010 01:45:08 +0000 (11:45 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 10 Mar 2010 06:29:58 +0000 (16:29 +1000)
src/gallium/drivers/nv50/nv50_context.h
src/gallium/drivers/nv50/nv50_state_validate.c
src/gallium/drivers/nv50/nv50_tex.c

index e91a61b27dd340b57b6b4ba3ad7b3faf67ffa7fc..2cb5538c54aee3059feee9a0dae4a1e1de9133a5 100644 (file)
@@ -249,6 +249,7 @@ extern void nv50_so_init_sifc(struct nv50_context *nv50,
                              unsigned offset, unsigned size);
 
 /* nv50_tex.c */
+extern void nv50_tex_relocs(struct nv50_context *);
 extern void nv50_tex_validate(struct nv50_context *);
 
 /* nv50_transfer.c */
index c974cc92dcc7d875f857b3f2775694a2ac4ea438..0d30957ee3cd4eb3da85976af296ef8692ac4f5e 100644 (file)
@@ -290,8 +290,7 @@ nv50_state_flush_notify(struct nouveau_channel *chan)
 {
        struct nv50_context *nv50 = chan->user_private;
 
-       if (nv50->state.tic_upload && !(nv50->dirty & NV50_NEW_TEXTURE))
-               so_emit(chan, nv50->state.tic_upload);
+       nv50_tex_relocs(nv50);
 
        so_emit_reloc_markers(chan, nv50->state.fb);
        so_emit_reloc_markers(chan, nv50->state.vertprog);
index de0560e20cd07b4f44cf2716e958d0c7da37b296..ed3440fcc1949166c154d9d56e2bf618db4aa8a0 100644 (file)
@@ -24,6 +24,7 @@
 #include "nv50_texture.h"
 
 #include "nouveau/nouveau_stateobj.h"
+#include "nouveau/nouveau_reloc.h"
 
 #include "util/u_format.h"
 
@@ -194,6 +195,35 @@ nv50_validate_textures(struct nv50_context *nv50, struct nouveau_stateobj *so,
        return TRUE;
 }
 
+void
+nv50_tex_relocs(struct nv50_context *nv50)
+{
+       struct nouveau_channel *chan = nv50->screen->tesla->channel;
+       int p, unit;
+
+       p = PIPE_SHADER_FRAGMENT;
+       for (unit = 0; unit < nv50->miptree_nr[p]; unit++) {
+               if (!nv50->miptree[p][unit])
+                       continue;
+               nouveau_reloc_emit(chan, nv50->screen->tic,
+                                  ((p * 32) + unit) * 32, NULL,
+                                  nv50->miptree[p][unit]->base.bo, 0, 0,
+                                  NOUVEAU_BO_VRAM | NOUVEAU_BO_LOW |
+                                  NOUVEAU_BO_RD, 0, 0);
+       }
+
+       p = PIPE_SHADER_VERTEX;
+       for (unit = 0; unit < nv50->miptree_nr[p]; unit++) {
+               if (!nv50->miptree[p][unit])
+                       continue;
+               nouveau_reloc_emit(chan, nv50->screen->tic,
+                                  ((p * 32) + unit) * 32, NULL,
+                                  nv50->miptree[p][unit]->base.bo, 0, 0,
+                                  NOUVEAU_BO_VRAM | NOUVEAU_BO_LOW |
+                                  NOUVEAU_BO_RD, 0, 0);
+       }
+}
+
 void
 nv50_tex_validate(struct nv50_context *nv50)
 {