nv50/nvc0: make transfers aware of PIPE_TRANSFER_MAP_DIRECTLY
authorMarcin Slusarz <marcin.slusarz@gmail.com>
Mon, 9 May 2011 18:12:38 +0000 (20:12 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Mon, 9 May 2011 18:19:19 +0000 (20:19 +0200)
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
src/gallium/drivers/nvc0/nvc0_transfer.c

index 74869774595fefe0135b695c91caf35397cf06a7..d9fb22aa673a0c9601de1ba5ddd1059997084acb 100644 (file)
@@ -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);
index 7bbfe057e58b6c798265614383fd509be2346848..0509113e005d612e912227f946967f55bc36bf89 100644 (file)
@@ -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;