void nv30_resource_resolve(struct pipe_context *pipe, const struct pipe_resolve_info *info) { struct nv30_context *nv30 = nv30_context(pipe); struct nv30_rect src, dst; define_rect(info->src.res, 0, 0, info->src.x0, info->src.y0, info->src.x1 - info->src.x0, info->src.y1 - info->src.y0, &src); define_rect(info->dst.res, info->dst.level, 0, info->dst.x0, info->dst.y0, info->dst.x1 - info->dst.x0, info->dst.y1 - info->dst.y0, &dst); nv30_transfer_rect(nv30, BILINEAR, &src, &dst); }
static struct pipe_transfer * nv30_miptree_transfer_new(struct pipe_context *pipe, struct pipe_resource *pt, unsigned level, unsigned usage, const struct pipe_box *box) { struct nv30_context *nv30 = nv30_context(pipe); struct nouveau_device *dev = nv30->screen->base.device; struct nv30_transfer *tx; int ret; tx = CALLOC_STRUCT(nv30_transfer); if (!tx) return NULL; pipe_resource_reference(&tx->base.resource, pt); tx->base.level = level; tx->base.usage = usage; tx->base.box = *box; tx->base.stride = util_format_get_nblocksx(pt->format, box->width) * util_format_get_blocksize(pt->format); tx->base.layer_stride = util_format_get_nblocksy(pt->format, box->height) * tx->base.stride; tx->nblocksx = util_format_get_nblocksx(pt->format, box->width); tx->nblocksy = util_format_get_nblocksy(pt->format, box->height); define_rect(pt, level, box->z, box->x, box->y, tx->nblocksx, tx->nblocksy, &tx->img); ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, tx->base.layer_stride, NULL, &tx->tmp.bo); if (ret) { pipe_resource_reference(&tx->base.resource, NULL); FREE(tx); return NULL; } tx->tmp.domain = NOUVEAU_BO_GART; tx->tmp.offset = 0; tx->tmp.pitch = tx->base.stride; tx->tmp.cpp = tx->img.cpp; tx->tmp.w = tx->nblocksx; tx->tmp.h = tx->nblocksy; tx->tmp.d = 1; tx->tmp.x0 = 0; tx->tmp.y0 = 0; tx->tmp.x1 = tx->tmp.w; tx->tmp.y1 = tx->tmp.h; tx->tmp.z = 0; if (usage & PIPE_TRANSFER_READ) nv30_transfer_rect(nv30, NEAREST, &tx->img, &tx->tmp); return &tx->base; }
void nv30_resource_copy_region(struct pipe_context *pipe, struct pipe_resource *dstres, unsigned dst_level, unsigned dstx, unsigned dsty, unsigned dstz, struct pipe_resource *srcres, unsigned src_level, const struct pipe_box *src_box) { struct nv30_context *nv30 = nv30_context(pipe); struct nv30_rect src, dst; if (dstres->target == PIPE_BUFFER && srcres->target == PIPE_BUFFER) { util_resource_copy_region(pipe, dstres, dst_level, dstx, dsty, dstz, srcres, src_level, src_box); return; } define_rect(srcres, src_level, src_box->z, src_box->x, src_box->y, src_box->width, src_box->height, &src); define_rect(dstres, dst_level, dstz, dstx, dsty, src_box->width, src_box->height, &dst); nv30_transfer_rect(nv30, NEAREST, &src, &dst); }