Mesa (master): nouveau: allow multiple simultaneous maps of a pipe_transfer

Ben Skeggs darktama at kemper.freedesktop.org
Wed Apr 7 06:08:44 UTC 2010


Module: Mesa
Branch: master
Commit: 2d606c13ff68286b201f8d574d9cc645b8b8f2e2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2d606c13ff68286b201f8d574d9cc645b8b8f2e2

Author: Ben Skeggs <bskeggs at redhat.com>
Date:   Wed Apr  7 15:41:17 2010 +1000

nouveau: allow multiple simultaneous maps of a pipe_transfer

I'm not entirely convinced we want this behaviour (the underlying nouveau_bo
doesn't support it either), but since certain parts of the mesa state
tracker appear to require it lets make it work for now.

---

 src/gallium/drivers/nv50/nv50_transfer.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_transfer.c b/src/gallium/drivers/nv50/nv50_transfer.c
index 9eb223e..6d16c13 100644
--- a/src/gallium/drivers/nv50/nv50_transfer.c
+++ b/src/gallium/drivers/nv50/nv50_transfer.c
@@ -9,6 +9,7 @@
 struct nv50_transfer {
 	struct pipe_transfer base;
 	struct nouveau_bo *bo;
+	int map_refcnt;
 	unsigned level_offset;
 	unsigned level_tiling;
 	int level_pitch;
@@ -225,14 +226,19 @@ nv50_transfer_map(struct pipe_context *pcontext, struct pipe_transfer *ptx)
 	unsigned flags = 0;
 	int ret;
 
+	if (tx->map_refcnt++)
+		return tx->bo->map;
+
 	if (ptx->usage & PIPE_TRANSFER_WRITE)
 		flags |= NOUVEAU_BO_WR;
 	if (ptx->usage & PIPE_TRANSFER_READ)
 		flags |= NOUVEAU_BO_RD;
 
 	ret = nouveau_bo_map(tx->bo, flags);
-	if (ret)
+	if (ret) {
+		tx->map_refcnt = 0;
 		return NULL;
+	}
 	return tx->bo->map;
 }
 
@@ -241,6 +247,8 @@ nv50_transfer_unmap(struct pipe_context *pcontext, struct pipe_transfer *ptx)
 {
 	struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
 
+	if (--tx->map_refcnt)
+		return;
 	nouveau_bo_unmap(tx->bo);
 }
 




More information about the mesa-commit mailing list