svga: add context pointer to the invalidate surface interface
authorCharmaine Lee <charmainel@vmware.com>
Fri, 27 Jan 2017 02:46:23 +0000 (18:46 -0800)
committerBrian Paul <brianp@vmware.com>
Fri, 7 Apr 2017 19:46:44 +0000 (13:46 -0600)
With this patch, we will specify the current context
when we invalidate the surface before the surface is
put back to the recycled surface pool. This allows the
winsys layer to use the specified context to do the
invalidation rather than using the last context that
referenced the surface. This prevents race condition if
the last referenced context is now made current in another thread.

Tested with MTT glretrace, NobelClinicianViewer.

Reviewed-by: Sinclair Yeh <syeh@vmware.com>
src/gallium/drivers/svga/svga_context.c
src/gallium/drivers/svga/svga_screen_cache.c
src/gallium/drivers/svga/svga_screen_cache.h
src/gallium/drivers/svga/svga_winsys.h
src/gallium/winsys/svga/drm/vmw_context.c
src/gallium/winsys/svga/drm/vmw_screen_svga.c
src/gallium/winsys/svga/drm/vmw_surface.c
src/gallium/winsys/svga/drm/vmw_surface.h

index 04466fb7dee8735223c025935a7bee24c631bbc9..a6f3b34890d5ba734f87df41173b76301f693bda 100644 (file)
@@ -367,7 +367,7 @@ svga_context_flush(struct svga_context *svga,
 
    svga->hud.num_flushes++;
 
-   svga_screen_cache_flush(svgascreen, fence);
+   svga_screen_cache_flush(svgascreen, svga, fence);
 
    SVGA3D_ResetLastCommand(svga->swc);
 
index d26e79a5c4a4f57de3d9e53cdf97a164a2d9d1e4..82d2ebce9768b7be0c7240f9ce45ed6a7c67ed9f 100644 (file)
@@ -32,6 +32,7 @@
 #include "svga_winsys.h"
 #include "svga_screen.h"
 #include "svga_screen_cache.h"
+#include "svga_context.h"
 
 
 #define SVGA_SURFACE_CACHE_ENABLED 1
@@ -310,6 +311,7 @@ svga_screen_cache_add(struct svga_screen *svgascreen,
  */
 void
 svga_screen_cache_flush(struct svga_screen *svgascreen,
+                        struct svga_context *svga,
                         struct pipe_fence_handle *fence)
 {
    struct svga_host_surface_cache *cache = &svgascreen->cache;
@@ -357,8 +359,10 @@ svga_screen_cache_flush(struct svga_screen *svgascreen,
          /* remove entry from the validated list */
          LIST_DEL(&entry->head);
 
-         /* it is now safe to invalidate the surface content. */
-         sws->surface_invalidate(sws, entry->handle);
+         /* It is now safe to invalidate the surface content.
+          * It will be done using the current context.
+          */
+         svga->swc->surface_invalidate(svga->swc, entry->handle);
 
          /* add the entry to the invalidated list */
          LIST_ADD(&entry->head, &cache->invalidated);
index 2ade1025fcac52840c55a4c4ab4eae4a4d8f077a..03b809a41a7f9845f958ff3fbf8f8396d4880bb9 100644 (file)
@@ -53,6 +53,7 @@
 
 struct svga_winsys_surface;
 struct svga_screen;
+struct svga_context;
 
 /**
  * Same as svga_winsys_screen::surface_create.
@@ -136,6 +137,7 @@ svga_screen_cache_cleanup(struct svga_screen *svgascreen);
 
 void
 svga_screen_cache_flush(struct svga_screen *svgascreen,
+                        struct svga_context *svga,
                         struct pipe_fence_handle *fence);
 
 enum pipe_error
index f226581774e0307b1eaed473978c618ad14dc6c9..3bb23ce1438e5e03b93bc8d00c55186791fa21b4 100644 (file)
@@ -391,6 +391,13 @@ struct svga_winsys_context
                     struct svga_winsys_surface *surface,
                     boolean *rebind);
 
+   /**
+    * Invalidate the content of this surface
+    */
+   void
+   (*surface_invalidate)(struct svga_winsys_context *swc,
+                         struct svga_winsys_surface *surface);
+
    /**
     * Create and define a DX GB shader that resides in the device COTable.
     * Caller of this function will issue the DXDefineShader command.
@@ -555,14 +562,6 @@ struct svga_winsys_screen
                          uint32 numLayers,
                          uint32 numMipLevels);
 
-   /**
-    * Invalidate the content of this surface
-    */
-   void
-   (*surface_invalidate)(struct svga_winsys_screen *sws,
-                         struct svga_winsys_surface *surface);
-
-
    /**
     * Buffer management. Buffer attributes are mostly fixed over its lifetime.
     *
index 6e691756d1242a7cf8307b7fa7d01a9ee469d43d..c306d988e0ce6a336ec5020d46662afc23a7d927 100644 (file)
@@ -808,11 +808,12 @@ vmw_svga_winsys_context_create(struct svga_winsys_screen *sws)
    vswc->base.flush = vmw_swc_flush;
    vswc->base.surface_map = vmw_svga_winsys_surface_map;
    vswc->base.surface_unmap = vmw_svga_winsys_surface_unmap;
+   vswc->base.surface_invalidate = vmw_svga_winsys_surface_invalidate;
 
-  vswc->base.shader_create = vmw_svga_winsys_vgpu10_shader_create;
-  vswc->base.shader_destroy = vmw_svga_winsys_vgpu10_shader_destroy;
+   vswc->base.shader_create = vmw_svga_winsys_vgpu10_shader_create;
+   vswc->base.shader_destroy = vmw_svga_winsys_vgpu10_shader_destroy;
 
-  vswc->base.resource_rebind = vmw_svga_winsys_resource_rebind;
+   vswc->base.resource_rebind = vmw_svga_winsys_resource_rebind;
 
    if (sws->have_vgpu10)
       vswc->base.cid = vmw_ioctl_extended_context_create(vws, sws->have_vgpu10);
index 17a1e760dd0fd3b4f6a0640f0dbc6e1c745e6cf6..31cbda9af6f1f4f644a8b875d2cb82747297fa88 100644 (file)
@@ -280,18 +280,6 @@ vmw_svga_winsys_surface_can_create(struct svga_winsys_screen *sws,
 }
 
 
-static void
-vmw_svga_winsys_surface_invalidate(struct svga_winsys_screen *sws,
-                                   struct svga_winsys_surface *surf)
-{
-   /* this is a noop since surface invalidation is not needed for DMA path.
-    * DMA is enabled when guest-backed surface is not enabled or
-    * guest-backed dma is enabled.  Since guest-backed dma is enabled
-    * when guest-backed surface is enabled, that implies DMA is always enabled;
-    * hence, surface invalidation is not needed.
-    */
-}
-
 static boolean
 vmw_svga_winsys_surface_is_flushed(struct svga_winsys_screen *sws,
                                    struct svga_winsys_surface *surface)
@@ -434,7 +422,6 @@ vmw_winsys_screen_init_svga(struct vmw_winsys_screen *vws)
    vws->base.surface_is_flushed = vmw_svga_winsys_surface_is_flushed;
    vws->base.surface_reference = vmw_svga_winsys_surface_ref;
    vws->base.surface_can_create = vmw_svga_winsys_surface_can_create;
-   vws->base.surface_invalidate = vmw_svga_winsys_surface_invalidate;
    vws->base.buffer_create = vmw_svga_winsys_buffer_create;
    vws->base.buffer_map = vmw_svga_winsys_buffer_map;
    vws->base.buffer_unmap = vmw_svga_winsys_buffer_unmap;
index 69408ffe9d914c450d8243f461c150c3d28ede16..80cc0914cc0e6e75498c39000fb447a947aa7925 100644 (file)
@@ -176,6 +176,18 @@ vmw_svga_winsys_surface_unmap(struct svga_winsys_context *swc,
    mtx_unlock(&vsrf->mutex);
 }
 
+void
+vmw_svga_winsys_surface_invalidate(struct svga_winsys_context *swc,
+                                   struct svga_winsys_surface *surf)
+{
+   /* this is a noop since surface invalidation is not needed for DMA path.
+    * DMA is enabled when guest-backed surface is not enabled or
+    * guest-backed dma is enabled.  Since guest-backed dma is enabled
+    * when guest-backed surface is enabled, that implies DMA is always enabled;
+    * hence, surface invalidation is not needed.
+    */
+}
+
 void
 vmw_svga_winsys_surface_reference(struct vmw_svga_winsys_surface **pdst,
                                   struct vmw_svga_winsys_surface *src)
index baeef5056bd4f677a9258e4ded2f53448e60274a..d6f2381220a7ca6a2f9e3f83bf6091f20cadbdef 100644 (file)
@@ -94,5 +94,8 @@ void
 vmw_svga_winsys_surface_unmap(struct svga_winsys_context *swc,
                               struct svga_winsys_surface *srf,
                               boolean *rebind);
+void
+vmw_svga_winsys_surface_invalidate(struct svga_winsys_context *swc,
+                                   struct svga_winsys_surface *srf);
 
 #endif /* VMW_SURFACE_H_ */