Mesa (master): svga: fix index/vertex buffer surface reference at draw

Brian Paul brianp at kemper.freedesktop.org
Thu Jun 23 13:41:57 UTC 2016


Module: Mesa
Branch: master
Commit: d4a77254cb491c8e4a90ecefb0c9ae430bb0278a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d4a77254cb491c8e4a90ecefb0c9ae430bb0278a

Author: Charmaine Lee <charmainel at vmware.com>
Date:   Mon May 16 15:12:57 2016 -0700

svga: fix index/vertex buffer surface reference at draw

Currently with the SetVertexBuffers optimization, we avoid emitting
redundant DXSetVertexBuffers commands. However, these buffers surfaces
will still need to be referenced, otherwise, in the case of linux,
the subsequent surface discard map will map to the existing mob instead
of a new one, causing rendering artifacts.

With this patch, we'll call resource_rebind() to reference the resources
even if we are avoiding the actual set command. This fixes the
rendering artifacts in the window title area running with unity in
Ubuntu 14.04

Tested with piglit, glretrace.

Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Sinclair Yeh <syeh at vmware.com>

---

 src/gallium/drivers/svga/svga_draw.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/gallium/drivers/svga/svga_draw.c b/src/gallium/drivers/svga/svga_draw.c
index 872dd7f..600df89 100644
--- a/src/gallium/drivers/svga/svga_draw.c
+++ b/src/gallium/drivers/svga/svga_draw.c
@@ -577,6 +577,17 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
             }
          }
       }
+      else {
+         /* Even though we can avoid emitting the redundant SetVertexBuffers
+          * command, we still need to reference the vertex buffers surfaces.
+          */
+         for (i = 0; i < vbuf_count; i++) {
+            ret = svga->swc->resource_rebind(svga->swc, vbuffer_handles[i],
+                                             NULL, SVGA_RELOC_READ);
+            if (ret != PIPE_OK)
+               return ret;
+         }
+      }
    }
 
    /* Set primitive type (line, tri, etc) */
@@ -609,6 +620,15 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
          svga->state.hw_draw.ib_format = indexFormat;
          svga->state.hw_draw.ib_offset = range->indexArray.offset;
       }
+      else {
+         /* Even though we can avoid emitting the redundant SetIndexBuffer
+          * command, we still need to reference the index buffer surface.
+          */
+         ret = svga->swc->resource_rebind(svga->swc, ib_handle,
+                                          NULL, SVGA_RELOC_READ);
+         if (ret != PIPE_OK)
+            return ret;
+      }
 
       if (instance_count > 1) {
          ret = SVGA3D_vgpu10_DrawIndexedInstanced(svga->swc,




More information about the mesa-commit mailing list