X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fvirgl%2Fvirgl_buffer.c;h=9f999fec1fbbda732a52e333056a9f39b95ce3ac;hb=c0521ecffbf7aafd7adb2e76bf9b7ed2ff75ef58;hp=e46c9f504fd378984154c9bec6cf59b03690178a;hpb=168c3ffce34e8c0f81d6bf32da82c0b5427f5c89;p=mesa.git diff --git a/src/gallium/drivers/virgl/virgl_buffer.c b/src/gallium/drivers/virgl/virgl_buffer.c index e46c9f504fd..9f999fec1fb 100644 --- a/src/gallium/drivers/virgl/virgl_buffer.c +++ b/src/gallium/drivers/virgl/virgl_buffer.c @@ -24,91 +24,42 @@ #include "util/u_inlines.h" #include "util/u_memory.h" #include "virgl_context.h" +#include "virgl_encode.h" #include "virgl_resource.h" #include "virgl_screen.h" -static void *virgl_buffer_transfer_map(struct pipe_context *ctx, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - struct pipe_transfer **transfer) -{ - struct virgl_context *vctx = virgl_context(ctx); - struct virgl_screen *vs = virgl_screen(ctx->screen); - struct virgl_resource *vbuf = virgl_resource(resource); - struct virgl_transfer *trans; - void *ptr; - bool readback; - bool doflushwait = false; - - if (usage & PIPE_TRANSFER_READ) - doflushwait = true; - else - doflushwait = virgl_res_needs_flush_wait(vctx, vbuf, usage); - - if (doflushwait) - ctx->flush(ctx, NULL, 0); - - trans = virgl_resource_create_transfer(&vctx->transfer_pool, resource, - &vbuf->metadata, level, usage, box); - - readback = virgl_res_needs_readback(vctx, vbuf, usage, 0); - if (readback) - vs->vws->transfer_get(vs->vws, vbuf->hw_res, box, trans->base.stride, - trans->l_stride, trans->offset, level); - - if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) - doflushwait = true; - - if (doflushwait || readback) - vs->vws->resource_wait(vs->vws, vbuf->hw_res); - - ptr = vs->vws->resource_map(vs->vws, vbuf->hw_res); - if (!ptr) { - virgl_resource_destroy_transfer(&vctx->transfer_pool, trans); - return NULL; - } - - *transfer = &trans->base; - return ptr + trans->offset; -} - static void virgl_buffer_transfer_unmap(struct pipe_context *ctx, struct pipe_transfer *transfer) { struct virgl_context *vctx = virgl_context(ctx); struct virgl_transfer *trans = virgl_transfer(transfer); - struct virgl_resource *vbuf = virgl_resource(transfer->resource); if (trans->base.usage & PIPE_TRANSFER_WRITE) { - struct virgl_screen *vs = virgl_screen(ctx->screen); if (transfer->usage & PIPE_TRANSFER_FLUSH_EXPLICIT) { - if (trans->range.end <= trans->range.start) - goto out; + if (trans->range.end <= trans->range.start) { + virgl_resource_destroy_transfer(vctx, trans); + return; + } transfer->box.x += trans->range.start; transfer->box.width = trans->range.end - trans->range.start; trans->offset = transfer->box.x; } - vctx->num_transfers++; - vs->vws->transfer_put(vs->vws, vbuf->hw_res, - &transfer->box, trans->base.stride, - trans->l_stride, trans->offset, - transfer->level); - - } - -out: - virgl_resource_destroy_transfer(&vctx->transfer_pool, trans); + if (trans->copy_src_hw_res) { + virgl_encode_copy_transfer(vctx, trans); + virgl_resource_destroy_transfer(vctx, trans); + } else { + virgl_transfer_queue_unmap(&vctx->queue, trans); + } + } else + virgl_resource_destroy_transfer(vctx, trans); } static void virgl_buffer_transfer_flush_region(struct pipe_context *ctx, struct pipe_transfer *transfer, const struct pipe_box *box) { - struct virgl_resource *vbuf = virgl_resource(transfer->resource); struct virgl_transfer *trans = virgl_transfer(transfer); /* @@ -127,7 +78,7 @@ static const struct u_resource_vtbl virgl_buffer_vtbl = { u_default_resource_get_handle, /* get_handle */ virgl_resource_destroy, /* resource_destroy */ - virgl_buffer_transfer_map, /* transfer_map */ + virgl_resource_transfer_map, /* transfer_map */ virgl_buffer_transfer_flush_region, /* transfer_flush_region */ virgl_buffer_transfer_unmap, /* transfer_unmap */ };