Mesa (master): winsys/drm: Add GL4.1 support in drm winsys

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 5 06:56:08 UTC 2020


Module: Mesa
Branch: master
Commit: dc3505f87ed69ac843cd4ce7d269b2ab01a32ff7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc3505f87ed69ac843cd4ce7d269b2ab01a32ff7

Author: Neha Bhende <bhenden at vmware.com>
Date:   Tue May 26 21:33:23 2020 +0530

winsys/drm: Add GL4.1 support in drm winsys

This is to check whether virtual hardware has SM5 support

Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Charmaine Lee <charmainel at vmware.com>
Signed-off-by: Neha Bhende <bhenden at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5317>

---

 src/gallium/drivers/svga/svga_winsys.h         |  3 +++
 src/gallium/winsys/svga/drm/vmw_screen.h       |  1 +
 src/gallium/winsys/svga/drm/vmw_screen_ioctl.c | 25 +++++++++++++++++++++++--
 src/gallium/winsys/svga/drm/vmwgfx_drm.h       | 11 +++++++----
 4 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/svga/svga_winsys.h b/src/gallium/drivers/svga/svga_winsys.h
index e489acd078b..88c1c6c7983 100644
--- a/src/gallium/drivers/svga/svga_winsys.h
+++ b/src/gallium/drivers/svga/svga_winsys.h
@@ -767,6 +767,9 @@ struct svga_winsys_screen
    /** Have SM4_1 hardware? */
    boolean have_sm4_1;
 
+   /** Have SM5 hardware? */
+   boolean have_sm5;
+
    /** To rebind resources at the beginnning of a new command buffer */
    boolean need_to_rebind_resources;
 
diff --git a/src/gallium/winsys/svga/drm/vmw_screen.h b/src/gallium/winsys/svga/drm/vmw_screen.h
index 4cf6b3fd895..73f04435a7e 100644
--- a/src/gallium/winsys/svga/drm/vmw_screen.h
+++ b/src/gallium/winsys/svga/drm/vmw_screen.h
@@ -80,6 +80,7 @@ struct vmw_winsys_screen
       boolean have_drm_2_15;
       boolean have_drm_2_16;
       boolean have_drm_2_17;
+      boolean have_drm_2_18;
    } ioctl;
 
    struct {
diff --git a/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c b/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c
index ed267e9ad68..a44c22c7595 100644
--- a/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c
+++ b/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c
@@ -52,7 +52,7 @@
 #include <unistd.h>
 
 #define VMW_MAX_DEFAULT_TEXTURE_SIZE   (128 * 1024 * 1024)
-#define VMW_FENCE_TIMEOUT_SECONDS 60
+#define VMW_FENCE_TIMEOUT_SECONDS 3600UL
 
 #define SVGA3D_FLAGS_64(upper32, lower32) (((uint64_t)upper32 << 32) | lower32)
 #define SVGA3D_FLAGS_UPPER_32(svga3d_flags) (svga3d_flags >> 32)
@@ -64,6 +64,7 @@ struct vmw_region
    uint32_t handle;
    uint64_t map_handle;
    void *data;
+   uint32_t map_count;
    int drm_fd;
    uint32_t size;
 };
@@ -234,6 +235,7 @@ vmw_ioctl_gb_surface_create(struct vmw_winsys_screen *vws,
       req->version = drm_vmw_gb_surface_v1;
       req->multisample_pattern = multisamplePattern;
       req->quality_level = qualityLevel;
+      req->buffer_byte_stride = 0;
       req->must_be_zero = 0;
       req->base.svga3d_flags = SVGA3D_FLAGS_LOWER_32(flags);
       req->svga3d_flags_upper_32_bits = SVGA3D_FLAGS_UPPER_32(flags);
@@ -636,6 +638,7 @@ vmw_ioctl_region_create(struct vmw_winsys_screen *vws, uint32_t size)
    region->data = NULL;
    region->handle = rep->handle;
    region->map_handle = rep->map_handle;
+   region->map_count = 0;
    region->size = size;
    region->drm_fd = vws->ioctl.drm_fd;
 
@@ -657,7 +660,10 @@ vmw_ioctl_region_destroy(struct vmw_region *region)
    vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
               region->ptr.gmrId, region->ptr.offset);
 
-   assert(region->data == NULL);
+   if (region->data) {
+      os_munmap(region->data, region->size);
+      region->data = NULL;
+   }
 
    memset(&arg, 0, sizeof(arg));
    arg.handle = region->handle;
@@ -696,6 +702,8 @@ vmw_ioctl_region_map(struct vmw_region *region)
       region->data = map;
    }
 
+   ++region->map_count;
+
    return region->data;
 }
 
@@ -705,6 +713,7 @@ vmw_ioctl_region_unmap(struct vmw_region *region)
    vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
               region->ptr.gmrId, region->ptr.offset);
 
+   --region->map_count;
    os_munmap(region->data, region->size);
    region->data = NULL;
 }
@@ -992,6 +1001,8 @@ vmw_ioctl_init(struct vmw_winsys_screen *vws)
       (version->version_major == 2 && version->version_minor > 15);
    vws->ioctl.have_drm_2_17 = version->version_major > 2 ||
       (version->version_major == 2 && version->version_minor > 16);
+   vws->ioctl.have_drm_2_18 = version->version_major > 2 ||
+      (version->version_major == 2 && version->version_minor > 17);
 
    vws->ioctl.drm_execbuf_version = vws->ioctl.have_drm_2_9 ? 2 : 1;
 
@@ -1102,6 +1113,16 @@ vmw_ioctl_init(struct vmw_winsys_screen *vws)
          }
       }
 
+      if (vws->ioctl.have_drm_2_18 && vws->base.have_sm4_1) {
+         memset(&gp_arg, 0, sizeof(gp_arg));
+         gp_arg.param = DRM_VMW_PARAM_SM5;
+         ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
+                                   &gp_arg, sizeof(gp_arg));
+         if (ret == 0 && gp_arg.value != 0) {
+            vws->base.have_sm5 = TRUE;
+         }
+      }
+
       memset(&gp_arg, 0, sizeof(gp_arg));
       gp_arg.param = DRM_VMW_PARAM_3D_CAPS_SIZE;
       ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
diff --git a/src/gallium/winsys/svga/drm/vmwgfx_drm.h b/src/gallium/winsys/svga/drm/vmwgfx_drm.h
index fcb741e3068..9b422e5515b 100644
--- a/src/gallium/winsys/svga/drm/vmwgfx_drm.h
+++ b/src/gallium/winsys/svga/drm/vmwgfx_drm.h
@@ -103,6 +103,7 @@ extern "C" {
 #define DRM_VMW_PARAM_DX               12
 #define DRM_VMW_PARAM_HW_CAPS2         13
 #define DRM_VMW_PARAM_SM4_1            14
+#define DRM_VMW_PARAM_SM5              15
 
 /**
  * enum drm_vmw_handle_type - handle type for ref ioctls
@@ -1144,6 +1145,7 @@ enum drm_vmw_surface_version {
  * @svga3d_flags_upper_32_bits: Upper 32 bits of svga3d flags.
  * @multisample_pattern: Multisampling pattern when msaa is supported.
  * @quality_level: Precision settings for each sample.
+ * @buffer_byte_stride: Buffer byte stride.
  * @must_be_zero: Reserved for future usage.
  *
  * Input argument to the  DRM_VMW_GB_SURFACE_CREATE_EXT Ioctl.
@@ -1152,10 +1154,11 @@ enum drm_vmw_surface_version {
 struct drm_vmw_gb_surface_create_ext_req {
 	struct drm_vmw_gb_surface_create_req base;
 	enum drm_vmw_surface_version version;
-	uint32_t svga3d_flags_upper_32_bits;
-	SVGA3dMSPattern multisample_pattern;
-	SVGA3dMSQualityLevel quality_level;
-	uint64_t must_be_zero;
+	__u32 svga3d_flags_upper_32_bits;
+	__u32 multisample_pattern;
+	__u32 quality_level;
+	__u32 buffer_byte_stride;
+	__u32 must_be_zero;
 };
 
 /**



More information about the mesa-commit mailing list