svga: fix index buffer reference in the hw state
authorCharmaine Lee <charmainel@vmware.com>
Tue, 3 May 2016 01:12:24 +0000 (18:12 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 23 Jun 2016 13:31:19 +0000 (07:31 -0600)
Instead of copy the index buffer resource handle to the hw state in
the context structure, use pipe_resource_reference to properly reference
the index buffer resource in the context.

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

index 007d5bc3b5129e8034d7f4a40a7fef013be453fd..01f290eebfe64a82b417ad8186c2e47616893a1e 100644 (file)
@@ -361,7 +361,7 @@ struct svga_hw_draw_state
    struct svga_winsys_surface *vbuffer_handles[PIPE_MAX_ATTRIBS];
    unsigned num_vbuffers;
 
-   struct svga_winsys_surface *ib;  /**< index buffer for drawing */
+   struct pipe_resource *ib;  /**< index buffer for drawing */
    SVGA3dSurfaceFormat ib_format;
    unsigned ib_offset;
 
index f314d5560633ac4e973684b398287097a7eabb3c..b6de7af80a89fc3ad7f45c758635bb1caf64f292 100644 (file)
@@ -441,6 +441,7 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
    const unsigned vbuf_count = hwtnl->cmd.vbuf_count;
    enum pipe_error ret;
    unsigned i;
+   boolean rebind_ib = FALSE;
 
    assert(svga_have_vgpu10(svga));
    assert(hwtnl->cmd.prim_count == 0);
@@ -465,7 +466,7 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
          return ret;
 
       /* Force rebinding the index buffer when needed */
-      svga->state.hw_draw.ib = NULL;
+      rebind_ib = TRUE;
    }
 
    ret = validate_sampler_resources(svga);
@@ -563,15 +564,19 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
       SVGA3dSurfaceFormat indexFormat = xlate_index_format(range->indexWidth);
 
       /* setup index buffer */
-      if (ib_handle != svga->state.hw_draw.ib ||
+      if (rebind_ib ||
+          ib != svga->state.hw_draw.ib ||
           indexFormat != svga->state.hw_draw.ib_format ||
           range->indexArray.offset != svga->state.hw_draw.ib_offset) {
+
+         assert(indexFormat != SVGA3D_FORMAT_INVALID);
          ret = SVGA3D_vgpu10_SetIndexBuffer(svga->swc, ib_handle,
                                             indexFormat,
                                             range->indexArray.offset);
          if (ret != PIPE_OK)
             return ret;
-         svga->state.hw_draw.ib = ib_handle;
+
+         pipe_resource_reference(&svga->state.hw_draw.ib, ib);
          svga->state.hw_draw.ib_format = indexFormat;
          svga->state.hw_draw.ib_offset = range->indexArray.offset;
       }
@@ -598,16 +603,19 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
    }
    else {
       /* non-indexed drawing */
-      if (svga->state.hw_draw.ib_format != SVGA3D_FORMAT_INVALID) {
+      if (svga->state.hw_draw.ib_format != SVGA3D_FORMAT_INVALID ||
+          svga->state.hw_draw.ib != NULL) {
          /* Unbind previously bound index buffer */
          ret = SVGA3D_vgpu10_SetIndexBuffer(svga->swc, NULL,
                                             SVGA3D_FORMAT_INVALID, 0);
          if (ret != PIPE_OK)
             return ret;
          svga->state.hw_draw.ib_format = SVGA3D_FORMAT_INVALID;
-         svga->state.hw_draw.ib = NULL;
+         pipe_resource_reference(&svga->state.hw_draw.ib, NULL);
       }
 
+      assert(svga->state.hw_draw.ib == NULL);
+
       if (instance_count > 1) {
          ret = SVGA3D_vgpu10_DrawInstanced(svga->swc,
                                            vcount,
index 99757e4e1358addebc17b2948274b4b0db0a0b6d..4692f76654635241396f48d4b75dcd422a0816a7 100644 (file)
@@ -327,6 +327,8 @@ void svga_cleanup_vertex_state( struct svga_context *svga )
    
    for (i = 0 ; i < svga->curr.num_vertex_buffers; i++)
       pipe_resource_reference(&svga->curr.vb[i].buffer, NULL);
+
+   pipe_resource_reference(&svga->state.hw_draw.ib, NULL);
 }