summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nvc0/nvc0_transfer.c
diff options
context:
space:
mode:
authorChristoph Bumiller <[email protected]>2011-10-20 22:42:59 +0200
committerChristoph Bumiller <[email protected]>2011-10-21 23:00:40 +0200
commitd988361ead27ce61615669bd428b04d2aac7af4f (patch)
treecf038c67142bf4352489fd0a80bb89df76c58c97 /src/gallium/drivers/nvc0/nvc0_transfer.c
parent28271fd00dc5dd83f95b5cb890e0ab2c0ff6159d (diff)
nouveau,nvc0: fix/improve handling of multiple constant buffers
Diffstat (limited to 'src/gallium/drivers/nvc0/nvc0_transfer.c')
-rw-r--r--src/gallium/drivers/nvc0/nvc0_transfer.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/gallium/drivers/nvc0/nvc0_transfer.c b/src/gallium/drivers/nvc0/nvc0_transfer.c
index 6404c8cc4ae..f16863733b7 100644
--- a/src/gallium/drivers/nvc0/nvc0_transfer.c
+++ b/src/gallium/drivers/nvc0/nvc0_transfer.c
@@ -365,3 +365,39 @@ nvc0_miptree_transfer_unmap(struct pipe_context *pctx,
nouveau_bo_unmap(tx->rect[1].bo);
}
+void
+nvc0_cb_push(struct nouveau_context *nv,
+ struct nouveau_bo *bo, unsigned domain,
+ unsigned base, unsigned size,
+ unsigned offset, unsigned words, const uint32_t *data)
+{
+ struct nouveau_channel *chan = nv->screen->channel;
+
+ assert(!(offset & 3));
+ size = align(size, 0x100);
+
+ MARK_RING (chan, 16, 2);
+ BEGIN_RING(chan, RING_3D(CB_SIZE), 3);
+ OUT_RING (chan, size);
+ OUT_RELOCh(chan, bo, base, domain | NOUVEAU_BO_WR);
+ OUT_RELOCl(chan, bo, base, domain | NOUVEAU_BO_WR);
+
+ while (words) {
+ unsigned nr = AVAIL_RING(chan);
+ nr = MIN2(nr, words);
+ nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN - 1);
+
+ BEGIN_RING_1I(chan, RING_3D(CB_POS), nr + 1);
+ OUT_RING (chan, offset);
+ OUT_RINGp (chan, data, nr);
+
+ words -= nr;
+ data += nr;
+ offset += nr * 4;
+
+ if (words) {
+ MARK_RING(chan, 6, 1);
+ nouveau_bo_validate(chan, bo, domain | NOUVEAU_BO_WR);
+ }
+ }
+}