svga: rebind index buffer
authorCharmaine Lee <charmainel@vmware.com>
Wed, 20 Jan 2016 04:25:39 +0000 (20:25 -0800)
committerBrian Paul <brianp@vmware.com>
Mon, 21 Mar 2016 19:37:40 +0000 (13:37 -0600)
Similar to other resources, current index buffer needs to be
rebound at the first draw of the current command buffer to make
sure the buffer is available for the draw command.

Fixes bug 1587263.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/drivers/svga/svga_context.c
src/gallium/drivers/svga/svga_draw.c

index da4281490ae1dfd322b9c1fd5de14734642f9985..896dcdf59d020d6c391ed956509a66e13f34828b 100644 (file)
@@ -247,6 +247,7 @@ struct pipe_context *svga_context_create(struct pipe_screen *screen,
           sizeof(svga->state.hw_draw.default_constbuf_size));
    memset(svga->state.hw_draw.enabled_constbufs, 0,
           sizeof(svga->state.hw_draw.enabled_constbufs));
+   svga->state.hw_draw.ib = NULL;
 
    /* Create a no-operation blend state which we will bind whenever the
     * requested blend state is impossible (e.g. due to having an integer
index fe6cf71a6e570dfbf659986db4e85765a3a48b13..3eda09acc7c01a0cd5d817e13beffc34470baeba 100644 (file)
@@ -458,6 +458,14 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
       ret = svga_rebind_shaders(svga);
       if (ret != PIPE_OK)
          return ret;
+
+      /* Rebind index buffer */
+      if (svga->state.hw_draw.ib) {
+         struct svga_winsys_context *swc = svga->swc;
+         ret = swc->resource_rebind(swc, svga->state.hw_draw.ib, NULL, SVGA_RELOC_READ);
+         if (ret != PIPE_OK)
+            return ret;
+      }
    }
 
    ret = validate_sampler_resources(svga);