svga: move svga_update_state() call in draw code
authorBrian Paul <brianp@vmware.com>
Wed, 14 Feb 2018 17:33:58 +0000 (09:33 -0800)
committerBrian Paul <brianp@vmware.com>
Thu, 15 Feb 2018 16:05:08 +0000 (09:05 -0700)
This fixes a few Piglit transform feedback regressions caused by
commit 7a1401938b351.

In that change I moved the moved svga_update_state() into the loops,
after the calls to svga_hwtnl_set_flatshade().  But
svga_hwtnl_set_flatshade() actually depends on some derived shader
state.  This patch moves the svga_update_state() call into
svga_draw_vbo() so it's not duplicated in two places.

Fixes: 7a1401938b351 ("svga: clean up retry_draw_range_elements(),
retry_draw_arrays()")

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/drivers/svga/svga_pipe_draw.c

index ee4a1057adf4f99fff948c4ed58a41831e0c3acf..af538819ea6c8a8b0867984ad321d14182f5718e 100644 (file)
@@ -75,17 +75,14 @@ retry_draw_range_elements(struct svga_context *svga,
                             svga->curr.rast->templ.flatshade_first);
 
    for (unsigned try = 0; try < 2; try++) {
-      ret = svga_update_state(svga, SVGA_STATE_HW_DRAW);
-      if (ret == PIPE_OK) {
-         ret = svga_hwtnl_draw_range_elements(svga->hwtnl,
-                                              index_buffer, index_size,
-                                              index_bias,
-                                              min_index, max_index,
-                                              prim, start, count,
-                                              start_instance, instance_count);
-         if (ret == PIPE_OK)
-            break;
-      }
+      ret = svga_hwtnl_draw_range_elements(svga->hwtnl,
+                                           index_buffer, index_size,
+                                           index_bias,
+                                           min_index, max_index,
+                                           prim, start, count,
+                                           start_instance, instance_count);
+      if (ret == PIPE_OK)
+         break;
       svga_context_flush(svga, NULL);
    }
 
@@ -114,13 +111,10 @@ retry_draw_arrays(struct svga_context *svga,
                             svga->curr.rast->templ.flatshade_first);
 
    for (unsigned try = 0; try < 2; try++) {
-      ret = svga_update_state(svga, SVGA_STATE_HW_DRAW);
-      if (ret == PIPE_OK) {
-         ret = svga_hwtnl_draw_arrays(svga->hwtnl, prim, start, count,
-                                      start_instance, instance_count);
-         if (ret == PIPE_OK)
-            break;
-      }
+      ret = svga_hwtnl_draw_arrays(svga->hwtnl, prim, start, count,
+                                   start_instance, instance_count);
+      if (ret == PIPE_OK)
+         break;
       svga_context_flush(svga, NULL);
    }
 
@@ -229,6 +223,13 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
       ret = svga_swtnl_draw_vbo(svga, info, indexbuf, index_offset);
    }
    else {
+      ret = svga_update_state(svga, SVGA_STATE_HW_DRAW);
+      if (ret != PIPE_OK) {
+         svga_context_flush(svga, NULL);
+         ret = svga_update_state(svga, SVGA_STATE_HW_DRAW);
+         assert(ret == PIPE_OK);
+      }
+
       if (info->index_size && indexbuf) {
          unsigned offset;