nv50: use relocs rather than re-uploading TIC all the time
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user