v3d: Add SSBO/atomic counters support.
[mesa.git] / src / gallium / drivers / virgl / virgl_texture.c
index 80094fb6ee7c45744e88848d075e8dd34da524d4..df419db111a375d539481c69810e766ad5d76c17 100644 (file)
@@ -103,19 +103,19 @@ static void *virgl_texture_transfer_map(struct pipe_context *ctx,
 {
    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;
@@ -128,22 +128,22 @@ static void *virgl_texture_transfer_map(struct pipe_context *ctx,
       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) {
@@ -160,14 +160,14 @@ static void virgl_texture_transfer_unmap(struct pipe_context *ctx,
 {
    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);
@@ -181,77 +181,16 @@ static void virgl_texture_transfer_unmap(struct pipe_context *ctx,
    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;
 }