If state tracker asked us to map resource directly and we can't do it (because of tiling), return NULL instead of doing full transfer - state tracker should handle it and fallback to some other method or repeat transfer without PIPE_TRANSFER_MAP_DIRECTLY.
It greatly improves performance of xorg state tracker on nv50+, because its fallback (DFS/UTS) is much faster than full transfer. --- src/gallium/drivers/nv50/nv50_transfer.c | 3 +++ src/gallium/drivers/nvc0/nvc0_transfer.c | 3 +++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/src/gallium/drivers/nv50/nv50_transfer.c b/src/gallium/drivers/nv50/nv50_transfer.c index 7486977..d9fb22aa 100644 --- a/src/gallium/drivers/nv50/nv50_transfer.c +++ b/src/gallium/drivers/nv50/nv50_transfer.c @@ -209,6 +209,9 @@ nv50_miptree_transfer_new(struct pipe_context *pctx, uint32_t w, h, d, z, layer; int ret; + if (usage & PIPE_TRANSFER_MAP_DIRECTLY) + return NULL; + if (mt->layout_3d) { z = box->z; d = u_minify(res->depth0, level); diff --git a/src/gallium/drivers/nvc0/nvc0_transfer.c b/src/gallium/drivers/nvc0/nvc0_transfer.c index 7bbfe05..0509113 100644 --- a/src/gallium/drivers/nvc0/nvc0_transfer.c +++ b/src/gallium/drivers/nvc0/nvc0_transfer.c @@ -246,6 +246,9 @@ nvc0_miptree_transfer_new(struct pipe_context *pctx, uint32_t w, h, d, z, layer; int ret; + if (usage & PIPE_TRANSFER_MAP_DIRECTLY) + return NULL; + tx = CALLOC_STRUCT(nvc0_transfer); if (!tx) return NULL; -- 1.7.4.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev