virgl: query blob mem

Resource blob also modifies resource info.  Let's use this
functionality.

Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4821>
diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c
index be87e6b..bae7f31 100644
--- a/src/gallium/drivers/virgl/virgl_resource.c
+++ b/src/gallium/drivers/virgl/virgl_resource.c
@@ -572,7 +572,8 @@
                                                       &plane,
                                                       &winsys_stride,
                                                       &plane_offset,
-                                                      &modifier);
+                                                      &modifier,
+                                                      &res->blob_mem);
 
    virgl_resource_layout(&res->u.b, &res->metadata, plane, winsys_stride,
                          plane_offset, modifier);
diff --git a/src/gallium/drivers/virgl/virgl_resource.h b/src/gallium/drivers/virgl/virgl_resource.h
index 2e0a078..1107643 100644
--- a/src/gallium/drivers/virgl/virgl_resource.h
+++ b/src/gallium/drivers/virgl/virgl_resource.h
@@ -33,6 +33,10 @@
 #include "virgl_screen.h"
 #define VR_MAX_TEXTURE_2D_LEVELS 15
 
+#define VIRGL_BLOB_MEM_GUEST 1
+#define VIRGL_BLOB_MEM_HOST3D 2
+#define VIRGL_BLOB_MEM_HOST3D_GUEST 3
+
 struct winsys_handle;
 struct virgl_screen;
 struct virgl_context;
@@ -63,6 +67,7 @@
     * usable.
     */
    unsigned bind_history;
+   uint32_t blob_mem;
 };
 
 struct virgl_transfer {
diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h
index 30d2afb..29f2ed8d 100644
--- a/src/gallium/drivers/virgl/virgl_winsys.h
+++ b/src/gallium/drivers/virgl/virgl_winsys.h
@@ -85,7 +85,8 @@
                                                        uint32_t *plane,
                                                        uint32_t *stride,
                                                        uint32_t *plane_offset,
-                                                       uint64_t *modifier);
+                                                       uint64_t *modifier,
+                                                       uint32_t *blob_mem);
    boolean (*resource_get_handle)(struct virgl_winsys *vws,
                                   struct virgl_hw_res *res,
                                   uint32_t stride,
diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
index 2722534..a5a672e 100644
--- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
+++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
@@ -389,7 +389,8 @@
                                         uint32_t *plane,
                                         uint32_t *stride,
                                         uint32_t *plane_offset,
-                                        uint64_t *modifier)
+                                        uint64_t *modifier,
+                                        uint32_t *blob_mem)
 {
    struct virgl_drm_winsys *qdws = virgl_drm_winsys(qws);
    struct drm_gem_open open_arg = {};
@@ -464,6 +465,8 @@
    }
 
    res->res_handle = info_arg.res_handle;
+   res->blob_mem = info_arg.blob_mem;
+   *blob_mem = info_arg.blob_mem;
 
    res->size = info_arg.size;
    pipe_reference_init(&res->reference, 1);
diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.h b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.h
index 2d35f42..0f8ecab 100644
--- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.h
+++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.h
@@ -52,6 +52,7 @@
 
    /* false when the resource is known to be idle */
    int maybe_busy;
+   uint32_t blob_mem;
 };