svga/winsys: Add cap2 support in winsys
authorNeha Bhende <bhenden@vmware.com>
Mon, 6 Mar 2017 23:50:20 +0000 (15:50 -0800)
committerBrian Paul <brianp@vmware.com>
Wed, 5 Sep 2018 17:22:42 +0000 (11:22 -0600)
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/drivers/svga/include/svga_reg.h
src/gallium/drivers/svga/svga_winsys.h
src/gallium/winsys/svga/drm/vmw_screen_ioctl.c
src/gallium/winsys/svga/drm/vmwgfx_drm.h

index 2661eef034f8b5ade34c410f03f45759a0033654..bd1c6bea0b222761eee410bf443cef4c8fe2fc08 100644 (file)
@@ -190,7 +190,9 @@ enum {
    SVGA_REG_SCREENTARGET_MAX_WIDTH = 55,
    SVGA_REG_SCREENTARGET_MAX_HEIGHT = 56,
    SVGA_REG_MOB_MAX_SIZE = 57,
-   SVGA_REG_TOP = 58,               /* Must be 1 more than the last register */
+   SVGA_REG_BLANK_SCREEN_TARGETS = 58,
+   SVGA_REG_CAP2 = 59,
+   SVGA_REG_TOP = 60,               /* Must be 1 more than the last register */
 
    SVGA_PALETTE_BASE = 1024,        /* Base of SVGA color map */
    /* Next 768 (== 256*3) registers exist for colormap */
@@ -646,9 +648,27 @@ struct {
 #define SVGA_CAP_GBOBJECTS          0x08000000
 #define SVGA_CAP_CMD_BUFFERS_3      0x10000000
 
-#define SVGA_CAP_CMD_RESERVED       0x80000000
+#define SVGA_CAP_CAP2_REGISTER      0x80000000
 
 
+/*
+ * The SVGA_REG_CAP2 register is an additional set of SVGA capability bits.
+ *
+ * SVGA_CAP2_GROW_OTABLE --
+ *      Allow the GrowOTable/DXGrowCOTable commands.
+ *
+ * SVGA_CAP2_INTRA_SURFACE_COPY --
+ *      Allow the IntraSurfaceCopy command.
+ *
+ * SVGA_CAP2_RESERVED --
+ *      Reserve the last bit for extending the SVGA capabilities to some
+ *      future mechanisms.
+ */
+#define SVGA_CAP2_NONE               0x00000000
+#define SVGA_CAP2_GROW_OTABLE        0x00000001
+#define SVGA_CAP2_INTRA_SURFACE_COPY 0x00000002
+#define SVGA_CAP2_RESERVED           0x80000000
+
 /*
  * The Guest can optionally read some SVGA device capabilities through
  * the backdoor with command BDOOR_CMD_GET_SVGA_CAPABILITIES before
index afa8f5657aefb0d0401a16c7866b8584fba40b3b..a4c4d6a885891fb3b3c2ec2601671f37e0980b18 100644 (file)
@@ -763,6 +763,7 @@ struct svga_winsys_screen
    boolean have_set_predication_cmd;
    boolean have_transfer_from_buffer_cmd;
    boolean have_fence_fd;
+   boolean have_intra_surface_copy;
 };
 
 
index 16dd5c8593a8a20076f96001337e438710a3a14d..f759f765e8b9ce707936d19df9045e3f410ec9fa 100644 (file)
@@ -928,6 +928,20 @@ vmw_ioctl_init(struct vmw_winsys_screen *vws)
    if (vws->base.have_gb_objects && !drm_gb_capable)
       goto out_no_3d;
 
+   memset(&gp_arg, 0, sizeof(gp_arg));
+   gp_arg.param = DRM_VMW_PARAM_HW_CAPS2;
+   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
+                             &gp_arg, sizeof(gp_arg));
+   if (ret)
+      vws->base.have_intra_surface_copy = FALSE;
+   else {
+      if (gp_arg.value & (uint64_t) SVGA_CAP2_INTRA_SURFACE_COPY)
+         vws->base.have_intra_surface_copy = TRUE;
+      else
+         vws->base.have_intra_surface_copy = FALSE;
+   }
+
+
    vws->base.have_vgpu10 = FALSE;
    if (vws->base.have_gb_objects) {
       memset(&gp_arg, 0, sizeof(gp_arg));
index 13d779494fb3578177a9b6f51bbc78854291a7a8..21696d02f2f922279c07437f213b0b0a70dfbf5e 100644 (file)
@@ -91,6 +91,7 @@
 #define DRM_VMW_PARAM_MAX_MOB_SIZE     10
 #define DRM_VMW_PARAM_SCREEN_TARGET    11
 #define DRM_VMW_PARAM_VGPU10           12
+#define DRM_VMW_PARAM_HW_CAPS2         13
 
 /**
  * enum drm_vmw_handle_type - handle type for ref ioctls