{
struct virgl_context *vctx = virgl_context(ctx);
struct virgl_screen *vs = virgl_screen(ctx->screen);
- struct virgl_texture *vtex = virgl_texture(resource);
+ struct virgl_resource *vtex = virgl_resource(resource);
struct virgl_transfer *trans;
void *ptr;
boolean readback = TRUE;
struct virgl_hw_res *hw_res;
bool doflushwait;
- doflushwait = virgl_res_needs_flush_wait(vctx, &vtex->base, usage);
+ doflushwait = virgl_res_needs_flush_wait(vctx, vtex, usage);
if (doflushwait)
ctx->flush(ctx, NULL, 0);
- trans = virgl_resource_create_transfer(ctx, resource, &vtex->metadata, level,
- usage, box);
+ trans = virgl_resource_create_transfer(ctx, resource, &vtex->metadata,
+ level, usage, box);
if (resource->nr_samples > 1) {
struct pipe_resource tmp_resource;
ctx->flush(ctx, NULL, 0);
/* we want to do a resolve blit into the temporary */
hw_res = trans->resolve_tmp->hw_res;
- struct virgl_resource_metadata *data = &((struct virgl_texture*)trans->resolve_tmp)->metadata;
+ struct virgl_resource_metadata *data = &trans->resolve_tmp->metadata;
trans->base.stride = data->stride[level];
trans->base.layer_stride = data->layer_stride[level];
trans->offset = 0;
} else {
- hw_res = vtex->base.hw_res;
+ hw_res = vtex->hw_res;
trans->resolve_tmp = NULL;
}
- readback = virgl_res_needs_readback(vctx, &vtex->base, usage);
+ readback = virgl_res_needs_readback(vctx, vtex, usage);
if (readback)
vs->vws->transfer_get(vs->vws, hw_res, box, trans->base.stride,
trans->l_stride, trans->offset, level);
if (doflushwait || readback)
- vs->vws->resource_wait(vs->vws, vtex->base.hw_res);
+ vs->vws->resource_wait(vs->vws, vtex->hw_res);
ptr = vs->vws->resource_map(vs->vws, hw_res);
if (!ptr) {
{
struct virgl_context *vctx = virgl_context(ctx);
struct virgl_transfer *trans = virgl_transfer(transfer);
- struct virgl_texture *vtex = virgl_texture(transfer->resource);
+ struct virgl_resource *vtex = virgl_resource(transfer->resource);
if (trans->base.usage & PIPE_TRANSFER_WRITE) {
if (!(transfer->usage & PIPE_TRANSFER_FLUSH_EXPLICIT)) {
struct virgl_screen *vs = virgl_screen(ctx->screen);
- vtex->base.clean = FALSE;
+ vtex->clean = FALSE;
vctx->num_transfers++;
- vs->vws->transfer_put(vs->vws, vtex->base.hw_res,
+ vs->vws->transfer_put(vs->vws, vtex->hw_res,
&transfer->box, trans->base.stride,
trans->l_stride, trans->offset,
transfer->level);
virgl_resource_destroy_transfer(vctx, trans);
}
-static boolean virgl_texture_get_handle(struct pipe_screen *screen,
- struct pipe_resource *ptex,
- struct winsys_handle *whandle)
-{
- struct virgl_screen *vs = virgl_screen(screen);
- struct virgl_texture *vtex = virgl_texture(ptex);
-
- return vs->vws->resource_get_handle(vs->vws, vtex->base.hw_res,
- vtex->metadata.stride[0], whandle);
-}
-
-static void virgl_texture_destroy(struct pipe_screen *screen,
- struct pipe_resource *res)
-{
- struct virgl_screen *vs = virgl_screen(screen);
- struct virgl_texture *vtex = virgl_texture(res);
- vs->vws->resource_unref(vs->vws, vtex->base.hw_res);
- FREE(vtex);
-}
-
static const struct u_resource_vtbl virgl_texture_vtbl =
{
- virgl_texture_get_handle, /* get_handle */
- virgl_texture_destroy, /* resource_destroy */
+ virgl_resource_get_handle, /* get_handle */
+ virgl_resource_destroy, /* resource_destroy */
virgl_texture_transfer_map, /* transfer_map */
NULL, /* transfer_flush_region */
virgl_texture_transfer_unmap, /* transfer_unmap */
};
-struct pipe_resource *
-virgl_texture_from_handle(struct virgl_screen *vs,
- const struct pipe_resource *template,
- struct winsys_handle *whandle)
+void virgl_texture_init(struct virgl_resource *res)
{
- struct virgl_texture *tex = CALLOC_STRUCT(virgl_texture);
- tex->base.u.b = *template;
- tex->base.u.b.screen = &vs->base;
- pipe_reference_init(&tex->base.u.b.reference, 1);
- tex->base.u.vtbl = &virgl_texture_vtbl;
-
- tex->base.hw_res = vs->vws->resource_create_from_handle(vs->vws, whandle);
- return &tex->base.u.b;
-}
-
-struct pipe_resource *virgl_texture_create(struct virgl_screen *vs,
- const struct pipe_resource *template)
-{
- struct virgl_texture *tex;
- unsigned vbind;
-
- tex = CALLOC_STRUCT(virgl_texture);
- tex->base.clean = TRUE;
- tex->base.u.b = *template;
- tex->base.u.b.screen = &vs->base;
- pipe_reference_init(&tex->base.u.b.reference, 1);
- tex->base.u.vtbl = &virgl_texture_vtbl;
- virgl_resource_layout(&tex->base.u.b, &tex->metadata);
-
- vbind = pipe_to_virgl_bind(template->bind);
- tex->base.hw_res = vs->vws->resource_create(vs->vws, template->target,
- template->format, vbind,
- template->width0,
- template->height0,
- template->depth0,
- template->array_size,
- template->last_level,
- template->nr_samples,
- tex->metadata.total_size);
- if (!tex->base.hw_res) {
- FREE(tex);
- return NULL;
- }
- return &tex->base.u.b;
+ res->u.vtbl = &virgl_texture_vtbl;
}