static void * softpipe_transfer_map( struct pipe_screen *screen, struct pipe_transfer *transfer ) { 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); 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) { /* Do something to notify sharing contexts of a texture change. * In softpipe, that would mean flushing the texture cache. */ softpipe_screen(screen)->timestamp++; } xfer_map = map + softpipe_transfer(transfer)->offset + transfer->y / transfer->block.height * transfer->stride + transfer->x / transfer->block.width * transfer->block.size; /*printf("map = %p xfer map = %p\n", map, xfer_map);*/ return xfer_map; }
/** * Create memory mapping for given pipe_transfer object. */ static void * softpipe_transfer_map(struct pipe_context *pipe, struct pipe_transfer *transfer) { struct softpipe_transfer *spt = softpipe_transfer(transfer); struct softpipe_resource *spr = softpipe_resource(transfer->resource); struct sw_winsys *winsys = softpipe_screen(pipe->screen)->winsys; uint8_t *map; /* resources backed by display target treated specially: */ if (spr->dt) { map = winsys->displaytarget_map(winsys, spr->dt, transfer->usage); } else { map = spr->data; } if (map == NULL) return NULL; else return map + spt->offset; }