[Mesa-dev] [PATCH 12/12] virgl: move resource creation / import / destruction to common code

Gurchetan Singh gurchetansingh at chromium.org
Fri Dec 7 01:20:44 UTC 2018


We can remove some duplicated code.
---
 src/gallium/drivers/virgl/virgl_buffer.c   | 33 +--------
 src/gallium/drivers/virgl/virgl_resource.c | 84 +++++++++++++++++++---
 src/gallium/drivers/virgl/virgl_resource.h | 16 ++---
 src/gallium/drivers/virgl/virgl_texture.c  | 70 ++----------------
 4 files changed, 89 insertions(+), 114 deletions(-)

diff --git a/src/gallium/drivers/virgl/virgl_buffer.c b/src/gallium/drivers/virgl/virgl_buffer.c
index 4c545be63a..5d446907c3 100644
--- a/src/gallium/drivers/virgl/virgl_buffer.c
+++ b/src/gallium/drivers/virgl/virgl_buffer.c
@@ -27,16 +27,6 @@
 #include "virgl_resource.h"
 #include "virgl_screen.h"
 
-static void virgl_buffer_destroy(struct pipe_screen *screen,
-                                 struct pipe_resource *buf)
-{
-   struct virgl_screen *vs = virgl_screen(screen);
-   struct virgl_resource *vbuf = virgl_resource(buf);
-
-   vs->vws->resource_unref(vs->vws, vbuf->hw_res);
-   FREE(vbuf);
-}
-
 static void *virgl_buffer_transfer_map(struct pipe_context *ctx,
                                        struct pipe_resource *resource,
                                        unsigned level,
@@ -123,30 +113,13 @@ static void virgl_buffer_transfer_flush_region(struct pipe_context *ctx,
 static const struct u_resource_vtbl virgl_buffer_vtbl =
 {
    u_default_resource_get_handle,            /* get_handle */
-   virgl_buffer_destroy,                     /* resource_destroy */
+   virgl_resource_destroy,                   /* resource_destroy */
    virgl_buffer_transfer_map,                /* transfer_map */
    virgl_buffer_transfer_flush_region,       /* transfer_flush_region */
    virgl_buffer_transfer_unmap,              /* transfer_unmap */
 };
 
-struct pipe_resource *virgl_buffer_create(struct virgl_screen *vs,
-                                          const struct pipe_resource *template)
+void virgl_buffer_init(struct virgl_resource *res)
 {
-   struct virgl_resource *buf;
-   uint32_t vbind;
-   buf = CALLOC_STRUCT(virgl_resource);
-   buf->clean = TRUE;
-   buf->u.b = *template;
-   buf->u.b.screen = &vs->base;
-   buf->u.vtbl = &virgl_buffer_vtbl;
-   pipe_reference_init(&buf->u.b.reference, 1);
-   virgl_resource_layout(&buf->u.b, &buf->metadata);
-
-   vbind = pipe_to_virgl_bind(template->bind);
-
-   buf->hw_res = vs->vws->resource_create(vs->vws, template->target,
-                                          template->format, vbind,
-                                          template->width0, 1, 1, 1, 0, 0,
-                                          buf->metadata.total_size);
-   return &buf->u.b;
+   res->u.vtbl = &virgl_buffer_vtbl;
 }
diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c
index a0b28e1d02..bcfd527abf 100644
--- a/src/gallium/drivers/virgl/virgl_resource.c
+++ b/src/gallium/drivers/virgl/virgl_resource.c
@@ -22,6 +22,7 @@
  */
 #include "util/u_format.h"
 #include "util/u_inlines.h"
+#include "util/u_memory.h"
 #include "virgl_context.h"
 #include "virgl_resource.h"
 #include "virgl_screen.h"
@@ -56,11 +57,37 @@ bool virgl_res_needs_readback(struct virgl_context *vctx,
 static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen,
                                                    const struct pipe_resource *templ)
 {
-    struct virgl_screen *vs = virgl_screen(screen);
-    if (templ->target == PIPE_BUFFER)
-        return virgl_buffer_create(vs, templ);
-    else
-        return virgl_texture_create(vs, templ);
+   unsigned vbind;
+   struct virgl_screen *vs = virgl_screen(screen);
+   struct virgl_resource *res = CALLOC_STRUCT(virgl_resource);
+
+   res->clean = TRUE;
+   res->u.b = *templ;
+   res->u.b.screen = &vs->base;
+   pipe_reference_init(&res->u.b.reference, 1);
+   vbind = pipe_to_virgl_bind(templ->bind);
+   virgl_resource_layout(&res->u.b, &res->metadata);
+   res->hw_res = vs->vws->resource_create(vs->vws, templ->target,
+                                          templ->format, vbind,
+                                          templ->width0,
+                                          templ->height0,
+                                          templ->depth0,
+                                          templ->array_size,
+                                          templ->last_level,
+                                          templ->nr_samples,
+                                          res->metadata.total_size);
+   if (!res->hw_res) {
+      FREE(res);
+      return NULL;
+   }
+
+   if (templ->target == PIPE_BUFFER)
+      virgl_buffer_init(res);
+   else
+      virgl_texture_init(res);
+
+   return &res->u.b;
+
 }
 
 static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *screen,
@@ -68,11 +95,24 @@ static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *scre
                                                         struct winsys_handle *whandle,
                                                         unsigned usage)
 {
-    struct virgl_screen *vs = virgl_screen(screen);
-    if (templ->target == PIPE_BUFFER)
-        return NULL;
-    else
-        return virgl_texture_from_handle(vs, templ, whandle);
+   struct virgl_screen *vs = virgl_screen(screen);
+   if (templ->target == PIPE_BUFFER)
+      return NULL;
+
+   struct virgl_resource *res = CALLOC_STRUCT(virgl_resource);
+   res->u.b = *templ;
+   res->u.b.screen = &vs->base;
+   pipe_reference_init(&res->u.b.reference, 1);
+
+   res->hw_res = vs->vws->resource_create_from_handle(vs->vws, whandle);
+   if (!res->hw_res) {
+      FREE(res);
+      return NULL;
+   }
+
+   virgl_texture_init(res);
+
+   return &res->u.b;
 }
 
 void virgl_init_screen_resource_functions(struct pipe_screen *screen)
@@ -203,3 +243,27 @@ void virgl_resource_destroy_transfer(struct virgl_context *vctx,
    util_range_destroy(&trans->range);
    slab_free(&vctx->transfer_pool, trans);
 }
+
+void virgl_resource_destroy(struct pipe_screen *screen,
+                            struct pipe_resource *resource)
+{
+   struct virgl_screen *vs = virgl_screen(screen);
+   struct virgl_resource *res = virgl_resource(resource);
+   vs->vws->resource_unref(vs->vws, res->hw_res);
+   FREE(res);
+}
+
+boolean virgl_resource_get_handle(struct pipe_screen *screen,
+                                  struct pipe_resource *resource,
+                                  struct winsys_handle *whandle)
+{
+   struct virgl_screen *vs = virgl_screen(screen);
+   struct virgl_resource *res = virgl_resource(resource);
+
+   if (res->u.b.target == PIPE_BUFFER)
+      return FALSE;
+
+   return vs->vws->resource_get_handle(vs->vws, res->hw_res,
+                                       res->metadata.stride[0],
+                                       whandle);
+}
diff --git a/src/gallium/drivers/virgl/virgl_resource.h b/src/gallium/drivers/virgl/virgl_resource.h
index 54d01e7a07..62e5e22ae8 100644
--- a/src/gallium/drivers/virgl/virgl_resource.h
+++ b/src/gallium/drivers/virgl/virgl_resource.h
@@ -65,12 +65,7 @@ void virgl_init_screen_resource_functions(struct pipe_screen *screen);
 
 void virgl_init_context_resource_functions(struct pipe_context *ctx);
 
-struct pipe_resource *virgl_texture_create(struct virgl_screen *vs,
-                                           const struct pipe_resource *templ);
-
-struct pipe_resource *virgl_texture_from_handle(struct virgl_screen *vs,
-                                                const struct pipe_resource *templ,
-                                                struct winsys_handle *whandle);
+void virgl_texture_init(struct virgl_resource *res);
 
 static inline struct virgl_resource *virgl_resource(struct pipe_resource *r)
 {
@@ -82,8 +77,7 @@ static inline struct virgl_transfer *virgl_transfer(struct pipe_transfer *trans)
    return (struct virgl_transfer *)trans;
 }
 
-struct pipe_resource *virgl_buffer_create(struct virgl_screen *vs,
-                                          const struct pipe_resource *templ);
+void virgl_buffer_init(struct virgl_resource *res);
 
 static inline unsigned pipe_to_virgl_bind(unsigned pbind)
 {
@@ -135,4 +129,10 @@ virgl_resource_create_transfer(struct pipe_context *ctx,
 void virgl_resource_destroy_transfer(struct virgl_context *vctx,
                                      struct virgl_transfer *trans);
 
+void virgl_resource_destroy(struct pipe_screen *screen,
+                            struct pipe_resource *resource);
+
+boolean virgl_resource_get_handle(struct pipe_screen *screen,
+                                  struct pipe_resource *resource,
+                                  struct winsys_handle *whandle);
 #endif
diff --git a/src/gallium/drivers/virgl/virgl_texture.c b/src/gallium/drivers/virgl/virgl_texture.c
index a6afeb2293..0c1a1f8197 100644
--- a/src/gallium/drivers/virgl/virgl_texture.c
+++ b/src/gallium/drivers/virgl/virgl_texture.c
@@ -181,78 +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_resource *vtex = virgl_resource(ptex);
-
-   return vs->vws->resource_get_handle(vs->vws, vtex->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_resource *vtex = virgl_resource(res);
-   vs->vws->resource_unref(vs->vws, vtex->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_resource *tex = CALLOC_STRUCT(virgl_resource);
-   tex->u.b = *template;
-   tex->u.b.screen = &vs->base;
-   pipe_reference_init(&tex->u.b.reference, 1);
-   tex->u.vtbl = &virgl_texture_vtbl;
-
-   tex->hw_res = vs->vws->resource_create_from_handle(vs->vws, whandle);
-   return &tex->u.b;
-}
-
-struct pipe_resource *virgl_texture_create(struct virgl_screen *vs,
-                                           const struct pipe_resource *template)
-{
-   struct virgl_resource *tex;
-   unsigned vbind;
-
-   tex = CALLOC_STRUCT(virgl_resource);
-   tex->clean = TRUE;
-   tex->u.b = *template;
-   tex->u.b.screen = &vs->base;
-   pipe_reference_init(&tex->u.b.reference, 1);
-   tex->u.vtbl = &virgl_texture_vtbl;
-   virgl_resource_layout(&tex->u.b, &tex->metadata);
-
-   vbind = pipe_to_virgl_bind(template->bind);
-   tex->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->hw_res) {
-      FREE(tex);
-      return NULL;
-   }
-   return &tex->u.b;
+   res->u.vtbl = &virgl_texture_vtbl;
 }
-- 
2.18.1



More information about the mesa-dev mailing list