u_blitter: add a msaa parameter to util_blitter_clear
[mesa.git] / src / gallium / drivers / svga / svga_pipe_draw.c
index ee4a1057adf4f99fff948c4ed58a41831e0c3acf..5ebd17cf0eabc5c50685467353883625beefdd9e 100644 (file)
@@ -49,46 +49,20 @@ is_using_flat_shading(const struct svga_context *svga)
 
 static enum pipe_error
 retry_draw_range_elements(struct svga_context *svga,
-                          struct pipe_resource *index_buffer,
-                          unsigned index_size,
-                          int index_bias,
-                          unsigned min_index,
-                          unsigned max_index,
-                          enum pipe_prim_type prim,
-                          unsigned start,
-                          unsigned count,
-                          unsigned start_instance,
-                          unsigned instance_count)
+                          const struct pipe_draw_info *info,
+                          unsigned count)
 {
    enum pipe_error ret;
 
    SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_DRAWELEMENTS);
 
-   svga_hwtnl_set_fillmode(svga->hwtnl, svga->curr.rast->hw_fillmode);
-
-   /** determine if flatshade is to be used after svga_update_state()
-    *  in case the fragment shader is changed.
-    */
-   svga_hwtnl_set_flatshade(svga->hwtnl,
-                            svga->curr.rast->templ.flatshade ||
-                            is_using_flat_shading(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, info, count);
+   if (ret != PIPE_OK) {
       svga_context_flush(svga, NULL);
+      ret = svga_hwtnl_draw_range_elements(svga->hwtnl, info, count);
    }
 
+   assert (ret == PIPE_OK);
    SVGA_STATS_TIME_POP(svga_sws(svga));
    return ret;
 }
@@ -103,24 +77,11 @@ retry_draw_arrays(struct svga_context *svga,
 
    SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_DRAWARRAYS);
 
-   svga_hwtnl_set_fillmode(svga->hwtnl, svga->curr.rast->hw_fillmode);
-
-   /** determine if flatshade is to be used after svga_update_state()
-    *  in case the fragment shader is changed.
-    */
-   svga_hwtnl_set_flatshade(svga->hwtnl,
-                            svga->curr.rast->templ.flatshade ||
-                            is_using_flat_shading(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);
    }
 
@@ -163,8 +124,6 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
    unsigned count = info->count;
    enum pipe_error ret = 0;
    boolean needed_swtnl;
-   struct pipe_resource *indexbuf =
-      info->has_user_indices ? NULL : info->index.resource;
 
    SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_DRAWVBO);
 
@@ -174,13 +133,6 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
        svga->curr.rast->templ.cull_face == PIPE_FACE_FRONT_AND_BACK)
       goto done;
 
-   /* Upload a user index buffer. */
-   unsigned index_offset = 0;
-   if (info->index_size && info->has_user_indices &&
-       !util_upload_index_buffer(pipe, info, &indexbuf, &index_offset)) {
-      goto done;
-   }
-
    /*
     * Mark currently bound target surfaces as dirty
     * doesn't really matter if it is done before drawing.
@@ -226,26 +178,27 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
 
       /* Avoid leaking the previous hwtnl bias to swtnl */
       svga_hwtnl_set_index_bias(svga->hwtnl, 0);
-      ret = svga_swtnl_draw_vbo(svga, info, indexbuf, index_offset);
+      ret = svga_swtnl_draw_vbo(svga, info);
    }
    else {
-      if (info->index_size && indexbuf) {
-         unsigned offset;
-
-         assert(index_offset % info->index_size == 0);
-         offset = index_offset / info->index_size;
-
-         ret = retry_draw_range_elements(svga,
-                                         indexbuf,
-                                         info->index_size,
-                                         info->index_bias,
-                                         info->min_index,
-                                         info->max_index,
-                                         info->mode,
-                                         info->start + offset,
-                                         count,
-                                         info->start_instance,
-                                         info->instance_count);
+      if (!svga_update_state_retry(svga, SVGA_STATE_HW_DRAW)) {
+         static const char *msg = "State update failed, skipping draw call";
+         debug_printf("%s\n", msg);
+         pipe_debug_message(&svga->debug.callback, INFO, "%s", msg);
+         goto done;
+      }
+      svga_hwtnl_set_fillmode(svga->hwtnl, svga->curr.rast->hw_fillmode);
+
+      /** determine if flatshade is to be used after svga_update_state()
+       *  in case the fragment shader is changed.
+       */
+      svga_hwtnl_set_flatshade(svga->hwtnl,
+                               svga->curr.rast->templ.flatshade ||
+                               is_using_flat_shading(svga),
+                               svga->curr.rast->templ.flatshade_first);
+
+      if (info->index_size) {
+         ret = retry_draw_range_elements(svga, info, count);
       }
       else {
          ret = retry_draw_arrays(svga, info->mode, info->start, count,
@@ -262,8 +215,6 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
    }
 
 done:
-   if (info->index_size && info->index.resource != indexbuf)
-      pipe_resource_reference(&indexbuf, NULL);
    SVGA_STATS_TIME_POP(svga_sws(svga));
 }