struct virgl_winsys *vws = virgl_screen(ctx->screen)->vws;
struct virgl_resource *vtex = virgl_resource(resource);
struct virgl_transfer *trans;
+ bool flush, readback;
trans = virgl_resource_create_transfer(&vctx->transfer_pool, resource,
&vtex->metadata, level, usage, box);
assert(resource->nr_samples <= 1);
- if (virgl_res_needs_flush(vctx, trans))
+ flush = virgl_res_needs_flush(vctx, trans);
+ if (flush)
ctx->flush(ctx, NULL, 0);
- if (virgl_res_needs_readback(vctx, vtex, usage, level)) {
+ readback = virgl_res_needs_readback(vctx, vtex, usage, level);
+ if (readback)
vws->transfer_get(vws, vtex->hw_res, box, trans->base.stride,
trans->l_stride, trans->offset, level);
+ if (readback || flush)
vws->resource_wait(vws, vtex->hw_res);
- }
- void *ptr = vws->resource_map(vws, vtex->hw_res);
- if (!ptr) {
+ trans->hw_res_map = vws->resource_map(vws, vtex->hw_res);
+ if (!trans->hw_res_map) {
virgl_resource_destroy_transfer(&vctx->transfer_pool, trans);
return NULL;
}
*transfer = &trans->base;
- return ptr + trans->offset;
+ return trans->hw_res_map + trans->offset;
}
static void *texture_transfer_map_resolve(struct pipe_context *ctx,