From: Michel Dänzer <daen...@vmware.com>

Always test for PIPE_TRANSFER_READ/WRITE using the bit-wise and operator, and
add a pipe_transfer_buffer_flags() helper for getting the buffer usage flags
corresponding to them.
---
 src/gallium/auxiliary/util/u_tile.c                |    4 +-
 src/gallium/drivers/cell/ppu/cell_texture.c        |   18 +++----------
 src/gallium/drivers/i915simple/i915_texture.c      |    2 +-
 src/gallium/drivers/llvmpipe/lp_texture.c          |   14 ++--------
 src/gallium/drivers/nv04/nv04_transfer.c           |   26 ++++----------------
 src/gallium/drivers/nv10/nv10_transfer.c           |   26 ++++----------------
 src/gallium/drivers/nv20/nv20_transfer.c           |   26 ++++----------------
 src/gallium/drivers/nv30/nv30_transfer.c           |   26 ++++----------------
 src/gallium/drivers/nv40/nv40_transfer.c           |   26 ++++----------------
 src/gallium/drivers/nv50/nv50_transfer.c           |    4 +-
 src/gallium/drivers/r300/r300_screen.c             |   11 +-------
 src/gallium/drivers/softpipe/sp_texture.c          |   15 ++---------
 src/gallium/drivers/trace/tr_screen.c              |    2 +-
 src/gallium/include/pipe/p_inlines.h               |   16 ++++++++++++
 .../state_trackers/python/retrace/interpreter.py   |    2 +-
 src/gallium/state_trackers/vega/st_inlines.h       |    3 +-
 src/mesa/state_tracker/st_cb_accum.c               |    2 +-
 src/mesa/state_tracker/st_texture.c                |    3 +-
 18 files changed, 63 insertions(+), 163 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_tile.c 
b/src/gallium/auxiliary/util/u_tile.c
index 0d6489c..8a22f58 100644
--- a/src/gallium/auxiliary/util/u_tile.c
+++ b/src/gallium/auxiliary/util/u_tile.c
@@ -1452,7 +1452,7 @@ pipe_put_tile_z(struct pipe_transfer *pt,
    case PIPE_FORMAT_S8Z24_UNORM:
       {
          uint *pDest = (uint *) (map + y * pt->stride + x*4);
-         assert(pt->usage == PIPE_TRANSFER_READ_WRITE);
+         assert((pt->usage & PIPE_TRANSFER_READ_WRITE) == 
PIPE_TRANSFER_READ_WRITE);
          for (i = 0; i < h; i++) {
             for (j = 0; j < w; j++) {
                /* convert 32-bit Z to 24-bit Z, preserve stencil */
@@ -1479,7 +1479,7 @@ pipe_put_tile_z(struct pipe_transfer *pt,
    case PIPE_FORMAT_Z24S8_UNORM:
       {
          uint *pDest = (uint *) (map + y * pt->stride + x*4);
-         assert(pt->usage == PIPE_TRANSFER_READ_WRITE);
+         assert((pt->usage & PIPE_TRANSFER_READ_WRITE) == 
PIPE_TRANSFER_READ_WRITE);
          for (i = 0; i < h; i++) {
             for (j = 0; j < w; j++) {
                /* convert 32-bit Z to 24-bit Z, preserve stencil */
diff --git a/src/gallium/drivers/cell/ppu/cell_texture.c 
b/src/gallium/drivers/cell/ppu/cell_texture.c
index 6a63a0e..ae4c61e 100644
--- a/src/gallium/drivers/cell/ppu/cell_texture.c
+++ b/src/gallium/drivers/cell/ppu/cell_texture.c
@@ -389,22 +389,14 @@ cell_transfer_map(struct pipe_screen *screen, struct 
pipe_transfer *transfer)
    const uint texWidth = pt->width[level];
    const uint texHeight = pt->height[level];
    const uint stride = ct->stride[level];
-   unsigned flags = 0x0;
    unsigned size;
 
    assert(transfer->texture);
 
-   if (transfer->usage != PIPE_TRANSFER_READ) {
-      flags |= PIPE_BUFFER_USAGE_CPU_WRITE;
-   }
-
-   if (transfer->usage != PIPE_TRANSFER_WRITE) {
-      flags |= PIPE_BUFFER_USAGE_CPU_READ;
-   }
-
    if (!ct->mapped) {
       /* map now */
-      ct->mapped = pipe_buffer_map(screen, ct->buffer, flags);
+      ct->mapped = pipe_buffer_map(screen, ct->buffer,
+                                   pipe_transfer_buffer_flags(transfer));
    }
 
    /*
@@ -417,8 +409,7 @@ cell_transfer_map(struct pipe_screen *screen, struct 
pipe_transfer *transfer)
    if (!ctrans->map)
       return NULL; /* out of memory */
 
-   if (transfer->usage == PIPE_TRANSFER_READ ||
-       transfer->usage == PIPE_TRANSFER_READ_WRITE) {
+   if (transfer->usage & PIPE_TRANSFER_READ) {
       /* need to untwiddle the texture to make a linear version */
       const uint bpp = pf_get_size(ct->base.format);
       if (bpp == 4) {
@@ -459,8 +450,7 @@ cell_transfer_unmap(struct pipe_screen *screen,
                                    PIPE_BUFFER_USAGE_CPU_READ);
    }
 
-   if (transfer->usage == PIPE_TRANSFER_WRITE ||
-       transfer->usage == PIPE_TRANSFER_READ_WRITE) {
+   if (transfer->usage & PIPE_TRANSFER_WRITE) {
       /* The user wrote new texture data into the mapped buffer.
        * We need to convert the new linear data into the twiddled/tiled format.
        */
diff --git a/src/gallium/drivers/i915simple/i915_texture.c 
b/src/gallium/drivers/i915simple/i915_texture.c
index 15ccc1f..286c9ac 100644
--- a/src/gallium/drivers/i915simple/i915_texture.c
+++ b/src/gallium/drivers/i915simple/i915_texture.c
@@ -859,7 +859,7 @@ i915_transfer_map(struct pipe_screen *screen,
    char *map;
    boolean write = FALSE;
 
-   if (transfer->usage != PIPE_TRANSFER_READ)
+   if (transfer->usage & PIPE_TRANSFER_WRITE)
       write = TRUE;
 
    map = iws->buffer_map(iws, tex->buffer, write);
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c 
b/src/gallium/drivers/llvmpipe/lp_texture.c
index 724d437..08f0950 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.c
+++ b/src/gallium/drivers/llvmpipe/lp_texture.c
@@ -353,17 +353,9 @@ llvmpipe_transfer_map( struct pipe_screen *_screen,
 
    if(lpt->dt) {
       struct llvmpipe_winsys *winsys = screen->winsys;
-      unsigned flags = 0;
 
-      if (transfer->usage != PIPE_TRANSFER_READ) {
-         flags |= PIPE_BUFFER_USAGE_CPU_WRITE;
-      }
-
-      if (transfer->usage != PIPE_TRANSFER_WRITE) {
-         flags |= PIPE_BUFFER_USAGE_CPU_READ;
-      }
-
-      map = winsys->displaytarget_map(winsys, lpt->dt, flags);
+      map = winsys->displaytarget_map(winsys, lpt->dt,
+                                      pipe_transfer_buffer_flags(transfer));
       if (map == NULL)
          return NULL;
    }
@@ -373,7 +365,7 @@ llvmpipe_transfer_map( struct pipe_screen *_screen,
    /* May want to different things here depending on read/write nature
     * of the map:
     */
-   if (transfer->texture && transfer->usage != PIPE_TRANSFER_READ) 
+   if (transfer->texture && (transfer->usage & PIPE_TRANSFER_WRITE))
    {
       /* Do something to notify sharing contexts of a texture change.
        * In llvmpipe, that would mean flushing the texture cache.
diff --git a/src/gallium/drivers/nv04/nv04_transfer.c 
b/src/gallium/drivers/nv04/nv04_transfer.c
index 854b855..6618660 100644
--- a/src/gallium/drivers/nv04/nv04_transfer.c
+++ b/src/gallium/drivers/nv04/nv04_transfer.c
@@ -13,22 +13,6 @@ struct nv04_transfer {
        bool direct;
 };
 
-static unsigned nv04_usage_tx_to_buf(unsigned tx_usage)
-{
-       switch (tx_usage) {
-               case PIPE_TRANSFER_READ:
-                       return PIPE_BUFFER_USAGE_CPU_READ;
-               case PIPE_TRANSFER_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_WRITE;
-               case PIPE_TRANSFER_READ_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_READ_WRITE;
-               default:
-                       assert(0);
-       }
-
-       return -1;
-}
-
 static void
 nv04_compatible_transfer_tex(struct pipe_texture *pt, unsigned level,
                              struct pipe_texture *template)
@@ -86,7 +70,7 @@ nv04_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                tx->direct = true;
                tx->surface = pscreen->get_tex_surface(pscreen, pt,
                                                       0, 0, 0,
-                                                      
nv04_usage_tx_to_buf(usage));
+                                                      
pipe_transfer_buffer_flags(&tx->base));
                return &tx->base;
        }
 
@@ -103,7 +87,7 @@ nv04_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
 
        tx->surface = pscreen->get_tex_surface(pscreen, tx_tex,
                                               face, level, zslice,
-                                              nv04_usage_tx_to_buf(usage));
+                                              
pipe_transfer_buffer_flags(&tx->base));
 
        pipe_texture_reference(&tx_tex, NULL);
 
@@ -114,7 +98,7 @@ nv04_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                return NULL;
        }
 
-       if (usage != PIPE_TRANSFER_WRITE) {
+       if (usage & PIPE_TRANSFER_READ) {
                struct nv04_screen *nvscreen = nv04_screen(pscreen);
                struct pipe_surface *src;
 
@@ -140,7 +124,7 @@ nv04_transfer_del(struct pipe_transfer *ptx)
 {
        struct nv04_transfer *tx = (struct nv04_transfer *)ptx;
 
-       if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+       if (!tx->direct && (ptx->usage & PIPE_TRANSFER_WRITE)) {
                struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv04_screen *nvscreen = nv04_screen(pscreen);
                struct pipe_surface *dst;
@@ -170,7 +154,7 @@ nv04_transfer_map(struct pipe_screen *pscreen, struct 
pipe_transfer *ptx)
        struct nv04_surface *ns = (struct nv04_surface *)tx->surface;
        struct nv04_miptree *mt = (struct nv04_miptree *)tx->surface->texture;
        void *map = pipe_buffer_map(pscreen, mt->buffer,
-                                   nv04_usage_tx_to_buf(ptx->usage));
+                                   pipe_transfer_buffer_flags(ptx));
 
        return map + ns->base.offset +
               ptx->y * ns->pitch + ptx->x * ptx->block.size;
diff --git a/src/gallium/drivers/nv10/nv10_transfer.c 
b/src/gallium/drivers/nv10/nv10_transfer.c
index c06b8d3..8feb85e 100644
--- a/src/gallium/drivers/nv10/nv10_transfer.c
+++ b/src/gallium/drivers/nv10/nv10_transfer.c
@@ -13,22 +13,6 @@ struct nv10_transfer {
        bool direct;
 };
 
-static unsigned nv10_usage_tx_to_buf(unsigned tx_usage)
-{
-       switch (tx_usage) {
-               case PIPE_TRANSFER_READ:
-                       return PIPE_BUFFER_USAGE_CPU_READ;
-               case PIPE_TRANSFER_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_WRITE;
-               case PIPE_TRANSFER_READ_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_READ_WRITE;
-               default:
-                       assert(0);
-       }
-
-       return -1;
-}
-
 static void
 nv10_compatible_transfer_tex(struct pipe_texture *pt, unsigned level,
                              struct pipe_texture *template)
@@ -86,7 +70,7 @@ nv10_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                tx->direct = true;
                tx->surface = pscreen->get_tex_surface(pscreen, pt,
                                                       0, 0, 0,
-                                                      
nv10_usage_tx_to_buf(usage));
+                                                      
pipe_transfer_buffer_flags(&tx->base));
                return &tx->base;
        }
 
@@ -103,7 +87,7 @@ nv10_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
 
        tx->surface = pscreen->get_tex_surface(pscreen, tx_tex,
                                               face, level, zslice,
-                                              nv10_usage_tx_to_buf(usage));
+                                              
pipe_transfer_buffer_flags(&tx->base));
 
        pipe_texture_reference(&tx_tex, NULL);
 
@@ -114,7 +98,7 @@ nv10_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                return NULL;
        }
 
-       if (usage != PIPE_TRANSFER_WRITE) {
+       if (usage & PIPE_TRANSFER_READ) {
                struct nv10_screen *nvscreen = nv10_screen(pscreen);
                struct pipe_surface *src;
 
@@ -140,7 +124,7 @@ nv10_transfer_del(struct pipe_transfer *ptx)
 {
        struct nv10_transfer *tx = (struct nv10_transfer *)ptx;
 
-       if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+       if (!tx->direct && (ptx->usage & PIPE_TRANSFER_WRITE)) {
                struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv10_screen *nvscreen = nv10_screen(pscreen);
                struct pipe_surface *dst;
@@ -170,7 +154,7 @@ nv10_transfer_map(struct pipe_screen *pscreen, struct 
pipe_transfer *ptx)
        struct nv04_surface *ns = (struct nv04_surface *)tx->surface;
        struct nv10_miptree *mt = (struct nv10_miptree *)tx->surface->texture;
        void *map = pipe_buffer_map(pscreen, mt->buffer,
-                                   nv10_usage_tx_to_buf(ptx->usage));
+                                   pipe_transfer_buffer_flags(ptx));
 
        return map + ns->base.offset +
               ptx->y * ns->pitch + ptx->x * ptx->block.size;
diff --git a/src/gallium/drivers/nv20/nv20_transfer.c 
b/src/gallium/drivers/nv20/nv20_transfer.c
index 5018995..81b4f1a 100644
--- a/src/gallium/drivers/nv20/nv20_transfer.c
+++ b/src/gallium/drivers/nv20/nv20_transfer.c
@@ -13,22 +13,6 @@ struct nv20_transfer {
        bool direct;
 };
 
-static unsigned nv20_usage_tx_to_buf(unsigned tx_usage)
-{
-       switch (tx_usage) {
-               case PIPE_TRANSFER_READ:
-                       return PIPE_BUFFER_USAGE_CPU_READ;
-               case PIPE_TRANSFER_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_WRITE;
-               case PIPE_TRANSFER_READ_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_READ_WRITE;
-               default:
-                       assert(0);
-       }
-
-       return -1;
-}
-
 static void
 nv20_compatible_transfer_tex(struct pipe_texture *pt, unsigned level,
                              struct pipe_texture *template)
@@ -86,7 +70,7 @@ nv20_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                tx->direct = true;
                tx->surface = pscreen->get_tex_surface(pscreen, pt,
                                                       0, 0, 0,
-                                                      
nv20_usage_tx_to_buf(usage));
+                                                      
pipe_transfer_buffer_flags(&tx->base));
                return &tx->base;
        }
 
@@ -103,7 +87,7 @@ nv20_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
 
        tx->surface = pscreen->get_tex_surface(pscreen, tx_tex,
                                               face, level, zslice,
-                                              nv20_usage_tx_to_buf(usage));
+                                              
pipe_transfer_buffer_flags(&tx->base));
 
        pipe_texture_reference(&tx_tex, NULL);
 
@@ -114,7 +98,7 @@ nv20_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                return NULL;
        }
 
-       if (usage != PIPE_TRANSFER_WRITE) {
+       if (usage & PIPE_TRANSFER_READ) {
                struct nv20_screen *nvscreen = nv20_screen(pscreen);
                struct pipe_surface *src;
 
@@ -140,7 +124,7 @@ nv20_transfer_del(struct pipe_transfer *ptx)
 {
        struct nv20_transfer *tx = (struct nv20_transfer *)ptx;
 
-       if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+       if (!tx->direct && (ptx->usage = PIPE_TRANSFER_WRITE)) {
                struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv20_screen *nvscreen = nv20_screen(pscreen);
                struct pipe_surface *dst;
@@ -170,7 +154,7 @@ nv20_transfer_map(struct pipe_screen *pscreen, struct 
pipe_transfer *ptx)
        struct nv04_surface *ns = (struct nv04_surface *)tx->surface;
        struct nv20_miptree *mt = (struct nv20_miptree *)tx->surface->texture;
        void *map = pipe_buffer_map(pscreen, mt->buffer,
-                                   nv20_usage_tx_to_buf(ptx->usage));
+                                   pipe_transfer_buffer_flags(ptx));
 
        return map + ns->base.offset +
               ptx->y * ns->pitch + ptx->x * ptx->block.size;
diff --git a/src/gallium/drivers/nv30/nv30_transfer.c 
b/src/gallium/drivers/nv30/nv30_transfer.c
index 2367571..98011de 100644
--- a/src/gallium/drivers/nv30/nv30_transfer.c
+++ b/src/gallium/drivers/nv30/nv30_transfer.c
@@ -13,22 +13,6 @@ struct nv30_transfer {
        bool direct;
 };
 
-static unsigned nv30_usage_tx_to_buf(unsigned tx_usage)
-{
-       switch (tx_usage) {
-               case PIPE_TRANSFER_READ:
-                       return PIPE_BUFFER_USAGE_CPU_READ;
-               case PIPE_TRANSFER_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_WRITE;
-               case PIPE_TRANSFER_READ_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_READ_WRITE;
-               default:
-                       assert(0);
-       }
-
-       return -1;
-}
-
 static void
 nv30_compatible_transfer_tex(struct pipe_texture *pt, unsigned level,
                              struct pipe_texture *template)
@@ -86,7 +70,7 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                tx->direct = true;
                tx->surface = pscreen->get_tex_surface(pscreen, pt,
                                                       face, level, zslice,
-                                                      
nv30_usage_tx_to_buf(usage));
+                                                      
pipe_transfer_buffer_flags(&tx->base));
                return &tx->base;
        }
 
@@ -103,7 +87,7 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
 
        tx->surface = pscreen->get_tex_surface(pscreen, tx_tex,
                                               0, 0, 0,
-                                              nv30_usage_tx_to_buf(usage));
+                                              
pipe_transfer_buffer_flags(&tx->base));
 
        pipe_texture_reference(&tx_tex, NULL);
 
@@ -114,7 +98,7 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                return NULL;
        }
 
-       if (usage != PIPE_TRANSFER_WRITE) {
+       if (usage & PIPE_TRANSFER_READ) {
                struct nv30_screen *nvscreen = nv30_screen(pscreen);
                struct pipe_surface *src;
 
@@ -140,7 +124,7 @@ nv30_transfer_del(struct pipe_transfer *ptx)
 {
        struct nv30_transfer *tx = (struct nv30_transfer *)ptx;
 
-       if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+       if (!tx->direct && (ptx->usage & PIPE_TRANSFER_WRITE)) {
                struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv30_screen *nvscreen = nv30_screen(pscreen);
                struct pipe_surface *dst;
@@ -170,7 +154,7 @@ nv30_transfer_map(struct pipe_screen *pscreen, struct 
pipe_transfer *ptx)
        struct nv04_surface *ns = (struct nv04_surface *)tx->surface;
        struct nv30_miptree *mt = (struct nv30_miptree *)tx->surface->texture;
        void *map = pipe_buffer_map(pscreen, mt->buffer,
-                                   nv30_usage_tx_to_buf(ptx->usage));
+                                   pipe_transfer_buffer_flags(ptx));
 
        return map + ns->base.offset +
               ptx->y * ns->pitch + ptx->x * ptx->block.size;
diff --git a/src/gallium/drivers/nv40/nv40_transfer.c 
b/src/gallium/drivers/nv40/nv40_transfer.c
index 6d92ac3..92caee6 100644
--- a/src/gallium/drivers/nv40/nv40_transfer.c
+++ b/src/gallium/drivers/nv40/nv40_transfer.c
@@ -13,22 +13,6 @@ struct nv40_transfer {
        bool direct;
 };
 
-static unsigned nv40_usage_tx_to_buf(unsigned tx_usage)
-{
-       switch (tx_usage) {
-               case PIPE_TRANSFER_READ:
-                       return PIPE_BUFFER_USAGE_CPU_READ;
-               case PIPE_TRANSFER_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_WRITE;
-               case PIPE_TRANSFER_READ_WRITE:
-                       return PIPE_BUFFER_USAGE_CPU_READ_WRITE;
-               default:
-                       assert(0);
-       }
-
-       return -1;
-}
-
 static void
 nv40_compatible_transfer_tex(struct pipe_texture *pt, unsigned level,
                              struct pipe_texture *template)
@@ -86,7 +70,7 @@ nv40_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                tx->direct = true;
                tx->surface = pscreen->get_tex_surface(pscreen, pt,
                                                       face, level, zslice,
-                                                      
nv40_usage_tx_to_buf(usage));
+                                                      
pipe_transfer_buffer_flags(&tx->base));
                return &tx->base;
        }
 
@@ -103,7 +87,7 @@ nv40_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
 
        tx->surface = pscreen->get_tex_surface(pscreen, tx_tex,
                                               0, 0, 0,
-                                              nv40_usage_tx_to_buf(usage));
+                                              
pipe_transfer_buffer_flags(&tx->base));
 
        pipe_texture_reference(&tx_tex, NULL);
 
@@ -114,7 +98,7 @@ nv40_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                return NULL;
        }
 
-       if (usage != PIPE_TRANSFER_WRITE) {
+       if (usage & PIPE_TRANSFER_READ) {
                struct nv40_screen *nvscreen = nv40_screen(pscreen);
                struct pipe_surface *src;
 
@@ -140,7 +124,7 @@ nv40_transfer_del(struct pipe_transfer *ptx)
 {
        struct nv40_transfer *tx = (struct nv40_transfer *)ptx;
 
-       if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+       if (!tx->direct && (ptx->usage & PIPE_TRANSFER_WRITE)) {
                struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv40_screen *nvscreen = nv40_screen(pscreen);
                struct pipe_surface *dst;
@@ -170,7 +154,7 @@ nv40_transfer_map(struct pipe_screen *pscreen, struct 
pipe_transfer *ptx)
        struct nv04_surface *ns = (struct nv04_surface *)tx->surface;
        struct nv40_miptree *mt = (struct nv40_miptree *)tx->surface->texture;
        void *map = pipe_buffer_map(pscreen, mt->buffer,
-                                   nv40_usage_tx_to_buf(ptx->usage));
+                                   pipe_transfer_buffer_flags(ptx));
 
        return map + ns->base.offset +
               ptx->y * ns->pitch + ptx->x * ptx->block.size;
diff --git a/src/gallium/drivers/nv50/nv50_transfer.c 
b/src/gallium/drivers/nv50/nv50_transfer.c
index bb77318..9c28902 100644
--- a/src/gallium/drivers/nv50/nv50_transfer.c
+++ b/src/gallium/drivers/nv50/nv50_transfer.c
@@ -161,7 +161,7 @@ nv50_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
                return NULL;
        }
 
-       if (usage != PIPE_TRANSFER_WRITE) {
+       if (usage & PIPE_TRANSFER_READ) {
                nv50_transfer_rect_m2mf(pscreen, mt->base.bo, tx->level_offset,
                                        tx->level_pitch, tx->level_tiling,
                                        x, y,
@@ -183,7 +183,7 @@ nv50_transfer_del(struct pipe_transfer *ptx)
        struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
        struct nv50_miptree *mt = nv50_miptree(ptx->texture);
 
-       if (ptx->usage != PIPE_TRANSFER_READ) {
+       if (ptx->usage & PIPE_TRANSFER_WRITE) {
                struct pipe_screen *pscreen = ptx->texture->screen;
                nv50_transfer_rect_m2mf(pscreen, tx->bo, 0, tx->base.stride,
                                        tx->bo->tile_mode, 0, 0,
diff --git a/src/gallium/drivers/r300/r300_screen.c 
b/src/gallium/drivers/r300/r300_screen.c
index 8296d56..f2659ca 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -345,16 +345,9 @@ static void* r300_transfer_map(struct pipe_screen* screen,
 {
     struct r300_texture* tex = (struct r300_texture*)transfer->texture;
     char* map;
-    unsigned flags = 0;
 
-    if (transfer->usage != PIPE_TRANSFER_WRITE) {
-        flags |= PIPE_BUFFER_USAGE_CPU_READ;
-    }
-    if (transfer->usage != PIPE_TRANSFER_READ) {
-        flags |= PIPE_BUFFER_USAGE_CPU_WRITE;
-    }
-
-    map = pipe_buffer_map(screen, tex->buffer, flags);
+    map = pipe_buffer_map(screen, tex->buffer,
+                          pipe_transfer_buffer_flags(transfer));
 
     if (!map) {
         return NULL;
diff --git a/src/gallium/drivers/softpipe/sp_texture.c 
b/src/gallium/drivers/softpipe/sp_texture.c
index 1c64d58..2e6c43c 100644
--- a/src/gallium/drivers/softpipe/sp_texture.c
+++ b/src/gallium/drivers/softpipe/sp_texture.c
@@ -329,27 +329,18 @@ softpipe_transfer_map( struct pipe_screen *screen,
 {
    ubyte *map, *xfer_map;
    struct softpipe_texture *spt;
-   unsigned flags = 0;
 
    assert(transfer->texture);
    spt = softpipe_texture(transfer->texture);
 
-   if (transfer->usage != PIPE_TRANSFER_READ) {
-      flags |= PIPE_BUFFER_USAGE_CPU_WRITE;
-   }
-
-   if (transfer->usage != PIPE_TRANSFER_WRITE) {
-      flags |= PIPE_BUFFER_USAGE_CPU_READ;
-   }
-
-   map = pipe_buffer_map(screen, spt->buffer, flags);
+   map = pipe_buffer_map(screen, spt->buffer, 
pipe_transfer_buffer_flags(transfer));
    if (map == NULL)
       return NULL;
 
    /* May want to different things here depending on read/write nature
     * of the map:
     */
-   if (transfer->texture && transfer->usage != PIPE_TRANSFER_READ) {
+   if (transfer->texture && (transfer->usage & PIPE_TRANSFER_WRITE)) {
       /* Do something to notify sharing contexts of a texture change.
        * In softpipe, that would mean flushing the texture cache.
        */
@@ -375,7 +366,7 @@ softpipe_transfer_unmap(struct pipe_screen *screen,
 
    pipe_buffer_unmap( screen, spt->buffer );
 
-   if (transfer->usage != PIPE_TRANSFER_READ) {
+   if (transfer->usage & PIPE_TRANSFER_WRITE) {
       /* Mark the texture as dirty to expire the tile caches. */
       spt->timestamp++;
    }
diff --git a/src/gallium/drivers/trace/tr_screen.c 
b/src/gallium/drivers/trace/tr_screen.c
index 26f1c04..ab605c7 100644
--- a/src/gallium/drivers/trace/tr_screen.c
+++ b/src/gallium/drivers/trace/tr_screen.c
@@ -403,7 +403,7 @@ trace_screen_transfer_map(struct pipe_screen *_screen,
 
    map = screen->transfer_map(screen, transfer);
    if(map) {
-      if(transfer->usage != PIPE_TRANSFER_READ) {
+      if(transfer->usage & PIPE_TRANSFER_WRITE) {
          assert(!tr_trans->map);
          tr_trans->map = map;
       }
diff --git a/src/gallium/include/pipe/p_inlines.h 
b/src/gallium/include/pipe/p_inlines.h
index 30a4aaf..5fbd62a 100644
--- a/src/gallium/include/pipe/p_inlines.h
+++ b/src/gallium/include/pipe/p_inlines.h
@@ -176,6 +176,22 @@ pipe_transfer_destroy( struct pipe_transfer *transf )
    screen->tex_transfer_destroy(transf);
 }
 
+static INLINE unsigned
+pipe_transfer_buffer_flags( struct pipe_transfer *transf )
+{
+   switch (transf->usage & PIPE_TRANSFER_READ_WRITE) {
+   case PIPE_TRANSFER_READ_WRITE:
+      return PIPE_BUFFER_USAGE_CPU_READ | PIPE_BUFFER_USAGE_CPU_WRITE;
+   case PIPE_TRANSFER_READ:
+      return PIPE_BUFFER_USAGE_CPU_READ;
+   case PIPE_TRANSFER_WRITE:
+      return PIPE_BUFFER_USAGE_CPU_WRITE;
+   default:
+      debug_assert(0);
+      return 0;
+   }
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/gallium/state_trackers/python/retrace/interpreter.py 
b/src/gallium/state_trackers/python/retrace/interpreter.py
index 6f0bd6a..f4ed2fd 100755
--- a/src/gallium/state_trackers/python/retrace/interpreter.py
+++ b/src/gallium/state_trackers/python/retrace/interpreter.py
@@ -314,7 +314,7 @@ class Screen(Object):
         if texture is None:
             return None
         transfer = Transfer(texture.get_surface(face, level, zslice), x, y, w, 
h)
-        if transfer and usage != gallium.PIPE_TRANSFER_WRITE:
+        if transfer and usage & gallium.PIPE_TRANSFER_READ
             if self.interpreter.options.all:
                 self.interpreter.present(transfer.surface, 'transf_read', x, 
y, w, h)
         return transfer
diff --git a/src/gallium/state_trackers/vega/st_inlines.h 
b/src/gallium/state_trackers/vega/st_inlines.h
index 1f331df..610755e 100644
--- a/src/gallium/state_trackers/vega/st_inlines.h
+++ b/src/gallium/state_trackers/vega/st_inlines.h
@@ -57,8 +57,7 @@ st_cond_flush_get_tex_transfer(struct vg_context *st,
       pipe->is_texture_referenced(pipe, pt, face, level);
 
    if (referenced && ((referenced & PIPE_REFERENCED_FOR_WRITE) ||
-                     usage == PIPE_TRANSFER_WRITE ||
-                     usage == PIPE_TRANSFER_READ_WRITE))
+                     (usage & PIPE_TRANSFER_WRITE)))
       vgFlush();
 
    return screen->get_tex_transfer(screen, pt, face, level, zslice, usage,
diff --git a/src/mesa/state_tracker/st_cb_accum.c 
b/src/mesa/state_tracker/st_cb_accum.c
index 9518157..3d1d0f7 100644
--- a/src/mesa/state_tracker/st_cb_accum.c
+++ b/src/mesa/state_tracker/st_cb_accum.c
@@ -241,7 +241,7 @@ accum_return(GLcontext *ctx, GLfloat value,
                                                xpos, ypos,
                                                width, height);
 
-   if (usage != PIPE_TRANSFER_WRITE)
+   if (usage & PIPE_TRANSFER_READ)
       pipe_get_tile_rgba(color_trans, 0, 0, width, height, buf);
 
    switch (acc_strb->format) {
diff --git a/src/mesa/state_tracker/st_texture.c 
b/src/mesa/state_tracker/st_texture.c
index bbc2830..ba8d1e8 100644
--- a/src/mesa/state_tracker/st_texture.c
+++ b/src/mesa/state_tracker/st_texture.c
@@ -577,7 +577,6 @@ st_teximage_flush_before_map(struct st_context *st,
       pipe->is_texture_referenced(pipe, pt, face, level);
 
    if (referenced && ((referenced & PIPE_REFERENCED_FOR_WRITE) ||
-                     usage == PIPE_TRANSFER_WRITE ||
-                     usage == PIPE_TRANSFER_READ_WRITE))
+                     (usage & PIPE_TRANSFER_WRITE)))
       st_flush(st, PIPE_FLUSH_RENDER_CACHE, NULL);
 }
-- 
1.6.4.3


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to