Mesa (main): virgl/vtest: implement resource_create_front

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Dec 11 18:09:50 UTC 2021


Module: Mesa
Branch: main
Commit: 0577a142de513a577107f03b230f6554607394e3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0577a142de513a577107f03b230f6554607394e3

Author: Italo Nicola <italonicola at collabora.com>
Date:   Mon Jul  5 06:22:16 2021 -0300

virgl/vtest: implement resource_create_front

This is required for glXCopySubBufferMESA to work.

Signed-off-by: Italo Nicola <italonicola at collabora.com>
Reviewed-by: Gert Wollny <gert.wollny at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11714>

---

 .../drivers/virgl/tests/virgl_staging_mgr_test.cpp |  2 ++
 src/gallium/drivers/virgl/virgl_resource.c         | 14 +++++++++--
 src/gallium/drivers/virgl/virgl_staging_mgr.c      |  1 +
 src/gallium/drivers/virgl/virgl_winsys.h           | 13 ++++++-----
 src/gallium/winsys/virgl/drm/virgl_drm_winsys.c    |  1 +
 .../winsys/virgl/vtest/virgl_vtest_winsys.c        | 27 ++++++++++++++++++----
 6 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp b/src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp
index a475ff408b4..d32fc1643a5 100644
--- a/src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp
+++ b/src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp
@@ -43,6 +43,7 @@ struct virgl_hw_res {
 static struct virgl_hw_res *
 fake_resource_create(struct virgl_winsys *vws,
                      enum pipe_texture_target target,
+                     const void *map_front_private,
                      uint32_t format, uint32_t bind,
                      uint32_t width, uint32_t height,
                      uint32_t depth, uint32_t array_size,
@@ -316,6 +317,7 @@ TEST_F(VirglStagingMgr, releases_resource_on_destruction)
 static struct virgl_hw_res *
 failing_resource_create(struct virgl_winsys *vws,
                         enum pipe_texture_target target,
+                        const void *map_front_private,
                         uint32_t format, uint32_t bind,
                         uint32_t width, uint32_t height,
                         uint32_t depth, uint32_t array_size,
diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c
index c5e8a96de2e..5dc8253bf37 100644
--- a/src/gallium/drivers/virgl/virgl_resource.c
+++ b/src/gallium/drivers/virgl/virgl_resource.c
@@ -402,6 +402,7 @@ virgl_resource_realloc(struct virgl_context *vctx, struct virgl_resource *res)
    vflags = pipe_to_virgl_flags(vs, templ->flags);
    hw_res = vs->vws->resource_create(vs->vws,
                                      templ->target,
+                                     NULL,
                                      templ->format,
                                      vbind,
                                      templ->width0,
@@ -567,8 +568,9 @@ static void virgl_resource_layout(struct pipe_resource *pt,
       metadata->total_size = 0;
 }
 
-static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen,
-                                                   const struct pipe_resource *templ)
+static struct pipe_resource *virgl_resource_create_front(struct pipe_screen *screen,
+                                                         const struct pipe_resource *templ,
+                                                         const void *map_front_private)
 {
    unsigned vbind, vflags;
    struct virgl_screen *vs = virgl_screen(screen);
@@ -600,6 +602,7 @@ static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen,
       alloc_size = res->metadata.total_size;
    
    res->hw_res = vs->vws->resource_create(vs->vws, templ->target,
+                                          map_front_private,
                                           templ->format, vbind,
                                           templ->width0,
                                           templ->height0,
@@ -627,6 +630,12 @@ static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen,
 
 }
 
+static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen,
+                                                   const struct pipe_resource *templ)
+{
+   return virgl_resource_create_front(screen, templ, NULL);
+}
+
 static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *screen,
                                                         const struct pipe_resource *templ,
                                                         struct winsys_handle *whandle,
@@ -715,6 +724,7 @@ static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *scre
 
 void virgl_init_screen_resource_functions(struct pipe_screen *screen)
 {
+    screen->resource_create_front = virgl_resource_create_front;
     screen->resource_create = virgl_resource_create;
     screen->resource_from_handle = virgl_resource_from_handle;
     screen->resource_get_handle = virgl_resource_get_handle;
diff --git a/src/gallium/drivers/virgl/virgl_staging_mgr.c b/src/gallium/drivers/virgl/virgl_staging_mgr.c
index b6f52090310..947f343bd7f 100644
--- a/src/gallium/drivers/virgl/virgl_staging_mgr.c
+++ b/src/gallium/drivers/virgl/virgl_staging_mgr.c
@@ -47,6 +47,7 @@ virgl_staging_alloc_buffer(struct virgl_staging_mgr *staging, unsigned min_size)
 
    staging->hw_res = vws->resource_create(vws,
                                           PIPE_BUFFER,
+                                          NULL,
                                           PIPE_FORMAT_R8_UNORM,
                                           VIRGL_BIND_STAGING,
                                           size,  /* width */
diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h
index dfbd10f4261..615b78cb0c8 100644
--- a/src/gallium/drivers/virgl/virgl_winsys.h
+++ b/src/gallium/drivers/virgl/virgl_winsys.h
@@ -65,12 +65,13 @@ struct virgl_winsys {
                        uint32_t buf_offset, uint32_t level);
 
    struct virgl_hw_res *(*resource_create)(struct virgl_winsys *vws,
-                               enum pipe_texture_target target,
-                               uint32_t format, uint32_t bind,
-                               uint32_t width, uint32_t height,
-                               uint32_t depth, uint32_t array_size,
-                               uint32_t last_level, uint32_t nr_samples,
-                               uint32_t flags, uint32_t size);
+                                           enum pipe_texture_target target,
+                                           const void *map_front_private,
+                                           uint32_t format, uint32_t bind,
+                                           uint32_t width, uint32_t height,
+                                           uint32_t depth, uint32_t array_size,
+                                           uint32_t last_level, uint32_t nr_samples,
+                                           uint32_t flags, uint32_t size);
 
    void (*resource_reference)(struct virgl_winsys *qws,
                               struct virgl_hw_res **dres,
diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
index d762542113a..75bd890f9d0 100644
--- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
+++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
@@ -402,6 +402,7 @@ virgl_bo_transfer_get(struct virgl_winsys *vws,
 static struct virgl_hw_res *
 virgl_drm_winsys_resource_cache_create(struct virgl_winsys *qws,
                                        enum pipe_texture_target target,
+                                       const void *map_front_private,
                                        uint32_t format,
                                        uint32_t bind,
                                        uint32_t width,
diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
index 1d7fb623118..b69b9ceee16 100644
--- a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
+++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
@@ -224,6 +224,7 @@ static void virgl_vtest_resource_reference(struct virgl_winsys *vws,
 static struct virgl_hw_res *
 virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
                                    enum pipe_texture_target target,
+                                   const void *map_front_private,
                                    uint32_t format,
                                    uint32_t bind,
                                    uint32_t width,
@@ -256,7 +257,7 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
 
    if (bind & (VIRGL_BIND_DISPLAY_TARGET | VIRGL_BIND_SCANOUT)) {
       res->dt = vtws->sws->displaytarget_create(vtws->sws, bind, format,
-                                                width, height, 64, NULL,
+                                                width, height, 64, map_front_private,
                                                 &res->stride);
 
    } else if (vtws->protocol_version < 2) {
@@ -279,6 +280,7 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
    if (vtws->protocol_version >= 2) {
       if (res->size == 0) {
          res->ptr = NULL;
+         res->res_handle = handle;
          goto out;
       }
 
@@ -301,9 +303,21 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
       close(fd);
    }
 
+   res->res_handle = handle;
+   if (map_front_private && res->ptr && res->dt) {
+      void *dt_map = vtws->sws->displaytarget_map(vtws->sws, res->dt, PIPE_MAP_READ_WRITE);
+      uint32_t shm_stride = util_format_get_stride(res->format, res->width);
+      util_copy_rect(res->ptr, res->format, shm_stride, 0, 0,
+                     res->width, res->height, dt_map, res->stride, 0, 0);
+
+      struct pipe_box box;
+      u_box_2d(0, 0, res->width, res->height, &box);
+      virgl_vtest_transfer_put(vws, res, &box, res->stride, 0, 0, 0);
+   }
+
 out:
    virgl_resource_cache_entry_init(&res->cache_entry, params);
-   res->res_handle = handle++;
+   handle++;
    pipe_reference_init(&res->reference, 1);
    p_atomic_set(&res->num_cs_references, 0);
    return res;
@@ -350,6 +364,7 @@ static void virgl_vtest_resource_wait(struct virgl_winsys *vws,
 static struct virgl_hw_res *
 virgl_vtest_winsys_resource_cache_create(struct virgl_winsys *vws,
                                          enum pipe_texture_target target,
+                                         const void *map_front_private,
                                          uint32_t format,
                                          uint32_t bind,
                                          uint32_t width,
@@ -392,9 +407,10 @@ virgl_vtest_winsys_resource_cache_create(struct virgl_winsys *vws,
    mtx_unlock(&vtws->mutex);
 
 alloc:
-   res = virgl_vtest_winsys_resource_create(vws, target, format, bind,
-                                            width, height, depth, array_size,
-                                            last_level, nr_samples, size);
+   res = virgl_vtest_winsys_resource_create(vws, target, map_front_private,
+                                            format, bind, width, height, depth,
+                                            array_size, last_level, nr_samples,
+                                            size);
    return res;
 }
 
@@ -508,6 +524,7 @@ virgl_vtest_fence_create(struct virgl_winsys *vws)
     */
    res = virgl_vtest_winsys_resource_create(vws,
                                             PIPE_BUFFER,
+                                            NULL,
                                             PIPE_FORMAT_R8_UNORM,
                                             VIRGL_BIND_CUSTOM,
                                             8, 1, 1, 0, 0, 0, 8);



More information about the mesa-commit mailing list