svga: avoid ubinding render targets that have already been unbound
authorCharmaine Lee <charmainel@vmware.com>
Tue, 12 Jul 2016 00:11:41 +0000 (17:11 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 15 Jul 2016 20:24:34 +0000 (14:24 -0600)
Fixed the remaining redundant SetRenderTargets command emission.

Tested with lightsMark2008, Heaven, mtt piglit, glretrace, conform.

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

index 54f75a2f8344c7b7d21907d5e0e37b67d678b23f..b1362a981689ffe0ca183db9ca5a1ea159f0fc5f 100644 (file)
@@ -168,6 +168,7 @@ emit_fb_vgpu10(struct svga_context *svga)
    struct pipe_framebuffer_state *curr = &svga->curr.framebuffer;
    struct pipe_framebuffer_state *hw = &svga->state.hw_clear.framebuffer;
    const unsigned num_color = MAX2(curr->nr_cbufs, hw->nr_cbufs);
+   int last_rtv = -1;
    unsigned i;
    enum pipe_error ret = PIPE_OK;
 
@@ -187,6 +188,7 @@ emit_fb_vgpu10(struct svga_context *svga)
          }
 
          assert(svga_surface(rtv[i])->view_id != SVGA3D_INVALID_ID);
+         last_rtv = i;
       }
       else {
          rtv[i] = NULL;
@@ -213,7 +215,10 @@ emit_fb_vgpu10(struct svga_context *svga)
       if (ret != PIPE_OK)
          return ret;
 
-      svga->state.hw_draw.num_rendertargets = num_color;
+      /* number of render targets sent to the device, not including trailing
+       * unbound render targets.
+       */
+      svga->state.hw_draw.num_rendertargets = last_rtv + 1;
       svga->state.hw_draw.dsv = dsv;
       memcpy(svga->state.hw_draw.rtv, rtv, num_color * sizeof(rtv[0]));