OSDN Git Service

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 e91a61b..2cb5538 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 c974cc9..0d30957 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 de0560e..ed3440f 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"
 
@@ -195,6 +196,35 @@ nv50_validate_textures(struct nv50_context *nv50, struct nouveau_stateobj *so,
 }
 
 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)
 {
        struct nouveau_stateobj *so;