svga: Fix failures caused in fedora 24
authorNeha Bhende <bhenden@vmware.com>
Tue, 28 Jun 2016 19:59:19 +0000 (12:59 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 30 Jun 2016 18:45:09 +0000 (12:45 -0600)
SVGA_3D_CMD_DX_GENRATE_MIPMAP & SVGA_3D_CMD_DX_SET_PREDICATION commands
are not presents in fedora 24 kernel module. Because of this
reason application like supertuxkart are not running.

v2: Add few comments and code modifications suggested by Brian P.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/drivers/svga/svga_pipe_query.c
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/svga/svga_winsys.h
src/gallium/winsys/svga/drm/vmw_screen_ioctl.c

index 4febf9bd51082cde6b5ac1050fa46b7e4fce5b04..65e58fe0e68d76fb68f69bedef4ec4a88171f68a 100644 (file)
@@ -1219,13 +1219,19 @@ svga_render_condition(struct pipe_context *pipe, struct pipe_query *q,
          sws->fence_finish(sws, sq->fence, SVGA_FENCE_FLAG_QUERY);
       }
    }
-
-   ret = SVGA3D_vgpu10_SetPredication(svga->swc, queryId,
-                                      (uint32) condition);
-   if (ret != PIPE_OK) {
-      svga_context_flush(svga, NULL);
+   /*
+    * if the kernel module doesn't support the predication command,
+    * we'll just render unconditionally.
+    * This is probably acceptable for the typical case of occlusion culling.
+    */
+   if (sws->have_set_predication_cmd) {
       ret = SVGA3D_vgpu10_SetPredication(svga->swc, queryId,
                                          (uint32) condition);
+      if (ret != PIPE_OK) {
+         svga_context_flush(svga, NULL);
+         ret = SVGA3D_vgpu10_SetPredication(svga->swc, queryId,
+                                            (uint32) condition);
+      }
    }
 }
 
index 4c2774d3f174f3c9c58aa4a446af2de097057501..b2b34200ff858b1b9701cd70fab8d2aa5e7c2825 100644 (file)
@@ -320,7 +320,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
       return 1; /* may be a sw fallback, depending on restart index */
 
    case PIPE_CAP_GENERATE_MIPMAP:
-      return sws->have_vgpu10;
+      return sws->have_generate_mipmap_cmd;
 
    /* Unsupported features */
    case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
index 7da2c4e77caf1e48a2c91366d4af046aebfa6036..b96a8e46c4db55469c3cd141cf0607abaedce1d3 100644 (file)
@@ -544,6 +544,9 @@ struct svga_winsys_screen
 
    /** To rebind resources at the beginnning of a new command buffer */
    boolean need_to_rebind_resources;
+
+   boolean have_generate_mipmap_cmd;
+   boolean have_set_predication_cmd;
 };
 
 
index 7fc93e74812921519b3a146f7e9e5d33d710c254..1740d1ab062ab0d9446a396c18d03f9898479213 100644 (file)
@@ -1022,6 +1022,17 @@ vmw_ioctl_init(struct vmw_winsys_screen *vws)
                   " (%i, %s).\n", ret, strerror(-ret));
       goto out_no_caps;
    }
+
+   if (((version->version_major == 2 && version->version_minor >= 10)
+       || version->version_major > 2) && vws->base.have_vgpu10) {
+
+     /* support for these commands didn't make it into vmwgfx kernel
+      * modules before 2.10.
+      */
+      vws->base.have_generate_mipmap_cmd = TRUE;
+      vws->base.have_set_predication_cmd = TRUE;
+   }
+
    free(cap_buffer);
    drmFreeVersion(version);
    vmw_printf("%s OK\n", __FUNCTION__);