#include "util/u_memory.h"
#include "virgl_context.h"
+#include "virgl_encode.h"
#include "virgl_resource.h"
#include "virgl_screen.h"
}
}
-static void *texture_transfer_map_plain(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_winsys *vws = virgl_screen(ctx->screen)->vws;
- struct virgl_resource *vtex = virgl_resource(resource);
- struct virgl_transfer *trans;
- enum virgl_transfer_map_type map_type;
-
- trans = virgl_resource_create_transfer(&vctx->transfer_pool, resource,
- &vtex->metadata, level, usage, box);
- trans->resolve_transfer = NULL;
-
- assert(resource->nr_samples <= 1);
-
- map_type = virgl_resource_transfer_prepare(vctx, trans);
- switch (map_type) {
- case VIRGL_TRANSFER_MAP_HW_RES:
- trans->hw_res_map = vws->resource_map(vws, vtex->hw_res);
- break;
- case VIRGL_TRANSFER_MAP_ERROR:
- default:
- trans->hw_res_map = NULL;
- break;
- }
-
- if (!trans->hw_res_map) {
- virgl_resource_destroy_transfer(&vctx->transfer_pool, trans);
- return NULL;
- }
-
- *transfer = &trans->base;
- return trans->hw_res_map + trans->offset;
-}
-
static void *texture_transfer_map_resolve(struct pipe_context *ctx,
struct pipe_resource *resource,
unsigned level,
struct pipe_resource templ, *resolve_tmp;
struct virgl_transfer *trans;
- trans = virgl_resource_create_transfer(&vctx->transfer_pool, resource,
+ trans = virgl_resource_create_transfer(vctx, resource,
&vtex->metadata, level, usage, box);
if (!trans)
return NULL;
enum pipe_format fmt = resource->format;
- if (!virgl_has_readback_format(ctx->screen, fmt)) {
+ if (!virgl_has_readback_format(ctx->screen, pipe_to_virgl_format(fmt))) {
if (util_format_fits_8unorm(util_format_description(fmt)))
fmt = PIPE_FORMAT_R8G8B8A8_UNORM;
else if (util_format_is_pure_sint(fmt))
fmt = PIPE_FORMAT_R32G32B32A32_UINT;
else
fmt = PIPE_FORMAT_R32G32B32A32_FLOAT;
- assert(virgl_has_readback_format(ctx->screen, fmt));
+ assert(virgl_has_readback_format(ctx->screen, pipe_to_virgl_format(fmt)));
}
struct pipe_box dst_box = *box;
ctx->flush(ctx, NULL, 0);
}
- void *ptr = texture_transfer_map_plain(ctx, resolve_tmp, 0, usage, &dst_box,
- &trans->resolve_transfer);
+ void *ptr = virgl_resource_transfer_map(ctx, resolve_tmp, 0, usage, &dst_box,
+ &trans->resolve_transfer);
if (!ptr)
goto fail;
+ /* trans->resolve_transfer owns resolve_tmp now */
+ pipe_resource_reference(&resolve_tmp, NULL);
+
*transfer = &trans->base;
if (fmt == resource->format) {
trans->base.stride = trans->resolve_transfer->stride;
if (!ptr)
goto fail;
- if (!util_format_translate_3d(resource->format,
- ptr,
+ if (!util_format_translate_3d(resource->format,
+ ptr + vtex->metadata.level_offset[level],
trans->base.stride,
trans->base.layer_stride,
box->x, box->y, box->z,
fail:
pipe_resource_reference(&resolve_tmp, NULL);
- virgl_resource_destroy_transfer(&vctx->transfer_pool, trans);
+ virgl_resource_destroy_transfer(vctx, trans);
return NULL;
}
if (usage & PIPE_TRANSFER_READ)
return !util_format_is_depth_or_stencil(resource->format) &&
- !virgl_has_readback_format(screen, resource->format);
+ !virgl_has_readback_format(screen, pipe_to_virgl_format(resource->format));
return false;
}
return texture_transfer_map_resolve(ctx, resource, level, usage, box,
transfer);
- return texture_transfer_map_plain(ctx, resource, level, usage, box, transfer);
+ return virgl_resource_transfer_map(ctx, resource, level, usage, box, transfer);
}
static void flush_data(struct pipe_context *ctx,
const struct pipe_box *box)
{
struct virgl_winsys *vws = virgl_screen(ctx->screen)->vws;
- vws->transfer_put(vws, virgl_resource(trans->base.resource)->hw_res, box,
+ vws->transfer_put(vws, trans->hw_res, box,
trans->base.stride, trans->l_stride, trans->offset,
trans->base.level);
}
}
if (trans->resolve_transfer) {
- pipe_resource_reference(&trans->resolve_transfer->resource, NULL);
- virgl_resource_destroy_transfer(&vctx->transfer_pool,
+ virgl_resource_destroy_transfer(vctx,
virgl_transfer(trans->resolve_transfer));
}
- if (queue_unmap)
- virgl_transfer_queue_unmap(&vctx->queue, trans);
- else
- virgl_resource_destroy_transfer(&vctx->transfer_pool, trans);
+ if (queue_unmap) {
+ 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 const struct u_resource_vtbl virgl_texture_vtbl =