svga: add the has_backed_views flag
authorCharmaine Lee <charmainel@vmware.com>
Wed, 22 Mar 2017 17:46:54 +0000 (10:46 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 7 Apr 2017 19:46:43 +0000 (13:46 -0600)
The new has_backed_views flag specifies if any of the render target
views or depth stencil view is a backing surface view.
The flag is used in svga_propagate_rendertargets() so it can return early
if there is no surface to propagate.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/drivers/svga/svga_context.h
src/gallium/drivers/svga/svga_state_framebuffer.c
src/gallium/drivers/svga/svga_surface.c

index 2b95a7878702ea289be93fb95ae4d7bc8dc942e0..3789a46bf503e6ee174c2641291e65f23eb8b303 100644 (file)
@@ -401,6 +401,7 @@ struct svga_hw_draw_state
    unsigned default_constbuf_size[PIPE_SHADER_TYPES];
 
    boolean rasterizer_discard; /* set if rasterization is disabled */
+   boolean has_backed_views;   /* set if any of the rtv/dsv is a backed surface view */
 };
 
 
index b2b037ddd7faf342e44016e50f2bb206d05bb9ce..e76b1da6aa50a2bdaf9db922833af06018c304fd 100644 (file)
@@ -174,6 +174,12 @@ emit_fb_vgpu10(struct svga_context *svga)
 
    assert(svga_have_vgpu10(svga));
 
+   /* Reset the has_backed_views flag.
+    * The flag is set in svga_validate_surface_view() if
+    * a backed surface view is used.
+    */
+   svga->state.hw_draw.has_backed_views = FALSE;
+
    /* Setup render targets array.  Note that we loop over the max of the
     * number of previously bound buffers and the new buffers to unbind
     * any previously bound buffers when the new number of buffers is less
index ef566c4e2553164c52a3ab26dcb0261a1a70ec6b..d9c1e2502fb45002a5d5dd918036e8212a765dd3 100644 (file)
@@ -428,6 +428,10 @@ svga_validate_surface_view(struct svga_context *svga, struct svga_surface *s)
                   "same resource used in shaderResource and renderTarget 0x%x\n",
                   s->handle);
          s = create_backed_surface_view(svga, s);
+
+         if (s)
+            svga->state.hw_draw.has_backed_views = TRUE;
+
          /* s may be null here if the function failed */
          break;
       }
@@ -678,6 +682,10 @@ svga_propagate_rendertargets(struct svga_context *svga)
 {
    unsigned i;
 
+   /* Early exit if there is no backing texture views in use */
+   if (!svga->state.hw_draw.has_backed_views)
+      return;
+
    /* Note that we examine the svga->state.hw_draw.framebuffer surfaces,
     * not the svga->curr.framebuffer surfaces, because it's the former
     * surfaces which may be backing surface views (the actual render targets).