gallium: Preparations for adding more PIPE_TRANSFER_* usage flags.
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.
This commit is contained in:
parent
7d4b348c67
commit
47e41b024e
|
@ -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 */
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue