nv50: use relocs rather than re-uploading TIC all the time

This commit is contained in:
Ben Skeggs
2010-03-03 11:45:08 +10:00
parent 007f25b3bd
commit ac2b35fd2d
3 changed files with 32 additions and 2 deletions
+1
View 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 */
@@ -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);
+30
View 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)
{