nv50: emit constbuf relocs before uploading constants

This commit is contained in:
Christoph Bumiller 2010-09-18 15:19:34 +02:00
parent 275a81af13
commit 4c1e7d931d
3 changed files with 56 additions and 21 deletions

View File

@ -221,6 +221,36 @@ nv50_screen_destroy(struct pipe_screen *pscreen)
#define BGN_RELOC(ch, bo, gr, m, n, fl) \
OUT_RELOC(ch, bo, (n << 18) | (gr->subc << 13) | m, fl, 0, 0)
void
nv50_screen_reloc_constbuf(struct nv50_screen *screen, unsigned cbi)
{
struct nouveau_bo *bo;
struct nouveau_channel *chan = screen->base.channel;
struct nouveau_grobj *tesla = screen->tesla;
unsigned size;
const unsigned rl = NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | NOUVEAU_BO_DUMMY;
switch (cbi) {
case NV50_CB_PMISC:
bo = screen->constbuf_misc[0];
size = 0x200;
break;
case NV50_CB_PVP:
case NV50_CB_PFP:
case NV50_CB_PGP:
bo = screen->constbuf_parm[cbi - NV50_CB_PVP];
size = 0;
break;
default:
return;
}
BGN_RELOC (chan, bo, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3, rl);
OUT_RELOCh(chan, bo, 0, rl);
OUT_RELOCl(chan, bo, 0, rl);
OUT_RELOC (chan, bo, (cbi << 16) | size, rl, 0, 0);
}
void
nv50_screen_relocs(struct nv50_screen *screen)
{
@ -243,12 +273,7 @@ nv50_screen_relocs(struct nv50_screen *screen)
OUT_RELOCh(chan, screen->tsc, 0, rl);
OUT_RELOCl(chan, screen->tsc, 0, rl);
BGN_RELOC (chan, screen->constbuf_misc[0],
tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3, rl);
OUT_RELOCh(chan, screen->constbuf_misc[0], 0, rl);
OUT_RELOCl(chan, screen->constbuf_misc[0], 0, rl);
OUT_RELOC (chan, screen->constbuf_misc[0],
(NV50_CB_PMISC << 16) | 0x0200, rl, 0, 0);
nv50_screen_reloc_constbuf(screen, NV50_CB_PMISC);
BGN_RELOC (chan, screen->constbuf_misc[0],
tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3, rl);
@ -257,14 +282,8 @@ nv50_screen_relocs(struct nv50_screen *screen)
OUT_RELOC (chan, screen->constbuf_misc[0],
(NV50_CB_AUX << 16) | 0x0200, rl, 0, 0);
for (i = 0; i < 3; ++i) {
BGN_RELOC (chan, screen->constbuf_parm[i],
tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3, rl);
OUT_RELOCh(chan, screen->constbuf_parm[i], 0, rl);
OUT_RELOCl(chan, screen->constbuf_parm[i], 0, rl);
OUT_RELOC (chan, screen->constbuf_parm[i],
((NV50_CB_PVP + i) << 16) | 0x0000, rl, 0, 0);
}
for (i = 0; i < 3; ++i)
nv50_screen_reloc_constbuf(screen, NV50_CB_PVP + i);
BGN_RELOC (chan, screen->stack_bo,
tesla, NV50TCL_STACK_ADDRESS_HIGH, 2, rl);

View File

@ -39,6 +39,8 @@ nv50_screen(struct pipe_screen *screen)
extern void nv50_screen_relocs(struct nv50_screen *);
extern void nv50_screen_reloc_constbuf(struct nv50_screen *, unsigned cbi);
struct nv50_format {
uint32_t rt;
uint32_t tic;

View File

@ -47,10 +47,17 @@ nv50_transfer_constbuf(struct nv50_context *nv50,
start = 0;
while (count) {
unsigned nr = count;
nr = MIN2(nr, 2047);
unsigned nr = AVAIL_RING(chan);
if (nr < 8) {
FIRE_RING(chan);
continue;
}
nr = MIN2(count, nr - 7);
nr = MIN2(nr, 2074);
nv50_screen_reloc_constbuf(nv50->screen, cbi);
/* FIXME: emit relocs for unsuiTed MM */
BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
OUT_RING (chan, (start << 8) | cbi);
BEGIN_RING_NI(chan, tesla, NV50TCL_CB_DATA(0), nr);
@ -77,8 +84,16 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
unsigned start = 0;
while (count) {
unsigned nr = count;
nr = MIN2(nr, 2047);
unsigned nr = AVAIL_RING(chan);
if (nr < 8) {
FIRE_RING(chan);
continue;
}
nr = MIN2(count, nr - 7);
nr = MIN2(nr, 2074);
nv50_screen_reloc_constbuf(nv50->screen, NV50_CB_PMISC);
BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
OUT_RING (chan, (start << 8) | NV50_CB_PMISC);
@ -111,8 +126,7 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
break;
default:
assert(0);
cbi = 0;
break;
return;
}
nv50_transfer_constbuf(nv50, nv50->constbuf[p->type], p->parm_size, cbi);