svga: move surface propagation code into new function
authorBrian Paul <brianp@vmware.com>
Fri, 26 Aug 2016 15:53:47 +0000 (09:53 -0600)
committerBrian Paul <brianp@vmware.com>
Mon, 29 Aug 2016 23:46:50 +0000 (17:46 -0600)
Put new svga_propagate_rendertargets() function where all the other
surface propagation code lives.

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/drivers/svga/svga_context.c
src/gallium/drivers/svga/svga_surface.c
src/gallium/drivers/svga/svga_surface.h

index ffecef59eb9e1525f8503af463d6432ab5b3cc6f..b3b2728305d890b3460ac316f91858051305a4ff 100644 (file)
@@ -408,24 +408,15 @@ void svga_hwtnl_flush_buffer( struct svga_context *svga,
  */ 
 void svga_surfaces_flush(struct svga_context *svga)
 {
-   struct svga_screen *svgascreen = svga_screen(svga->pipe.screen);
-   unsigned i;
-
    SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_SURFACEFLUSH);
 
    /* Emit buffered drawing commands.
     */
    svga_hwtnl_flush_retry( svga );
 
-   /* Emit back-copy from render target view to texture.
+   /* Emit back-copy from render target views to textures.
     */
-   for (i = 0; i < svgascreen->max_color_buffers; i++) {
-      if (svga->curr.framebuffer.cbufs[i])
-         svga_propagate_surface(svga, svga->curr.framebuffer.cbufs[i]);
-   }
-
-   if (svga->curr.framebuffer.zsbuf)
-      svga_propagate_surface(svga, svga->curr.framebuffer.zsbuf);
+   svga_propagate_rendertargets(svga);
 
    SVGA_STATS_TIME_POP(svga_sws(svga));
 }
index a11ce4e44485e750aab678dd8a8f664a4123f55f..75e76fb297e141c8b980de3c0a5e2451d4acd499 100644 (file)
@@ -657,6 +657,28 @@ svga_propagate_surface(struct svga_context *svga, struct pipe_surface *surf)
 }
 
 
+/**
+ * If any of the render targets are in backing texture views, propagate any
+ * changes to them back to the original texture.
+ */
+void
+svga_propagate_rendertargets(struct svga_context *svga)
+{
+   const unsigned num_cbufs = svga_screen(svga->pipe.screen)->max_color_buffers;
+   unsigned i;
+
+   for (i = 0; i < num_cbufs; i++) {
+      if (svga->curr.framebuffer.cbufs[i]) {
+         svga_propagate_surface(svga, svga->curr.framebuffer.cbufs[i]);
+      }
+   }
+
+   if (svga->curr.framebuffer.zsbuf) {
+      svga_propagate_surface(svga, svga->curr.framebuffer.zsbuf);
+   }
+}
+
+
 /**
  * Check if we should call svga_propagate_surface on the surface.
  */
index 2f003b22cc60a255d2b90aaf624630dbfb02ebdd..ed9f37a74a68541c19a7b24f79ecf432e6c68790 100644 (file)
@@ -78,6 +78,9 @@ struct svga_surface
 extern void
 svga_propagate_surface(struct svga_context *svga, struct pipe_surface *surf);
 
+void
+svga_propagate_rendertargets(struct svga_context *svga);
+
 extern boolean
 svga_surface_needs_propagation(const struct pipe_surface *surf);