ac/gpu_info: add has_unaligned_shader_loads
[mesa.git] / src / gallium / drivers / svga / svga_pipe_draw.c
index 42525c3153063b9c04f59d725c1918d9280bedf7..ace1d2cb6f3c06928037dde1c0c8a627cf5da550 100644 (file)
  **********************************************************/
 
 
-#include "util/u_format.h"
 #include "util/u_helpers.h"
 #include "util/u_inlines.h"
 #include "util/u_prim.h"
 #include "util/u_prim_restart.h"
-#include "util/u_upload_mgr.h"
-#include "indices/u_indices.h"
 
-#include "svga_hw_reg.h"
-#include "svga_cmd.h"
 #include "svga_context.h"
-#include "svga_screen.h"
 #include "svga_draw.h"
 #include "svga_shader.h"
-#include "svga_state.h"
 #include "svga_surface.h"
 #include "svga_swtnl.h"
 #include "svga_debug.h"
@@ -55,44 +48,31 @@ 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)
+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)
 {
    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,
+                                           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);
    }
 
@@ -102,32 +82,19 @@ retry_draw_range_elements( struct svga_context *svga,
 
 
 static enum pipe_error
-retry_draw_arrays( struct svga_context *svga,
-                   enum pipe_prim_type prim, unsigned start, unsigned count,
-                   unsigned start_instance, unsigned instance_count)
+retry_draw_arrays(struct svga_context *svga,
+                  enum pipe_prim_type prim, unsigned start, unsigned count,
+                  unsigned start_instance, unsigned instance_count)
 {
    enum pipe_error ret;
 
    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);
    }
 
@@ -165,8 +132,8 @@ need_fallback_prim_restart(const struct svga_context *svga,
 static void
 svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
 {
-   struct svga_context *svga = svga_context( pipe );
-   enum pipe_prim_type reduced_prim = u_reduced_prim( info->mode );
+   struct svga_context *svga = svga_context(pipe);
+   enum pipe_prim_type reduced_prim = u_reduced_prim(info->mode);
    unsigned count = info->count;
    enum pipe_error ret = 0;
    boolean needed_swtnl;
@@ -210,12 +177,12 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
       goto done;
    }
 
-   if (!u_trim_pipe_prim( info->mode, &count ))
+   if (!u_trim_pipe_prim(info->mode, &count))
       goto done;
 
    needed_swtnl = svga->state.sw.need_swtnl;
 
-   svga_update_state_retry( svga, SVGA_STATE_NEED_SWTNL );
+   svga_update_state_retry(svga, SVGA_STATE_NEED_SWTNL);
 
    if (svga->state.sw.need_swtnl) {
       svga->hud.num_fallbacks++;  /* for SVGA_QUERY_NUM_FALLBACKS */
@@ -232,27 +199,44 @@ 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 );
+      svga_hwtnl_set_index_bias(svga->hwtnl, 0);
       ret = svga_swtnl_draw_vbo(svga, info, indexbuf, index_offset);
    }
    else {
+      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 && 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);
+         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);
       }
       else {
          ret = retry_draw_arrays(svga, info->mode, info->start, count,
@@ -264,7 +248,7 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
    (void)ret;
 
    if (SVGA_DEBUG & DEBUG_FLUSH) {
-      svga_hwtnl_flush_retry( svga );
+      svga_hwtnl_flush_retry(svga);
       svga_context_flush(svga, NULL);
    }
 
@@ -275,7 +259,8 @@ done:
 }
 
 
-void svga_init_draw_functions( struct svga_context *svga )
+void
+svga_init_draw_functions(struct svga_context *svga)
 {
    svga->pipe.draw_vbo = svga_draw_vbo;
 }