svga: fix test for unfilled triangles fallback
authorBrian Paul <brianp@vmware.com>
Wed, 25 May 2016 18:42:55 +0000 (12:42 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 26 May 2016 23:44:17 +0000 (17:44 -0600)
VGPU10 actually supports line-mode triangles.  We failed to make use of
that before.

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/drivers/svga/svga_draw_arrays.c
src/gallium/drivers/svga/svga_draw_elements.c
src/gallium/drivers/svga/svga_draw_private.h

index c0567728e920b696fa4af3bf0e60b50d6586a577..43d7a975695924f502ed4f1bebd0ae22b746747c 100644 (file)
@@ -212,6 +212,11 @@ svga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl,
    unsigned api_pv = hwtnl->api_pv;
    struct svga_context *svga = hwtnl->svga;
 
+   if (svga->curr.rast->templ.fill_front !=
+       svga->curr.rast->templ.fill_back) {
+      assert(hwtnl->api_fillmode == PIPE_POLYGON_MODE_FILL);
+   }
+
    if (svga->curr.rast->templ.flatshade &&
        svga->state.hw_draw.fs->constant_color_output) {
       /* The fragment color is a constant, not per-vertex so the whole
@@ -236,8 +241,7 @@ svga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl,
       }
    }
 
-   if (hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL &&
-       u_reduced_prim(prim) == PIPE_PRIM_TRIANGLES) {
+   if (svga_need_unfilled_fallback(hwtnl, prim)) {
       /* Convert unfilled polygons into points, lines, triangles */
       gen_type = u_unfilled_generator(prim,
                                       start,
index a987b929861ceb6550ec5e5d9ca0b1487ef19823..b74c745ee4a045766d0dea24dcc3164f541f79c2 100644 (file)
@@ -138,8 +138,7 @@ svga_hwtnl_draw_range_elements(struct svga_hwtnl *hwtnl,
    u_translate_func gen_func;
    enum pipe_error ret = PIPE_OK;
 
-   if (hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL &&
-       u_reduced_prim(prim) == PIPE_PRIM_TRIANGLES) {
+   if (svga_need_unfilled_fallback(hwtnl, prim)) {
       gen_type = u_unfilled_translator(prim,
                                        index_size,
                                        count,
index 48e0b6017fdc10ecb7344c5efbc9d2268315ae5c..da5d60e38f7baf5735d34112f04c97f44612243b 100644 (file)
@@ -29,6 +29,8 @@
 #include "pipe/p_compiler.h"
 #include "pipe/p_defines.h"
 #include "indices/u_indices.h"
+#include "util/u_prim.h"
+#include "svga_context.h"
 #include "svga_hw_reg.h"
 #include "svga3d_shaderdefs.h"
 
@@ -182,9 +184,41 @@ struct svga_hwtnl {
 
 
 
-/***********************************************************************
- * Internal functions
+/**
+ * Do we need to use the gallium 'indices' helper to render unfilled
+ * triangles?
  */
+static inline boolean
+svga_need_unfilled_fallback(const struct svga_hwtnl *hwtnl, unsigned prim)
+{
+   const struct svga_context *svga = hwtnl->svga;
+
+   if (u_reduced_prim(prim) != PIPE_PRIM_TRIANGLES) {
+      /* if we're drawing points or lines, no fallback needed */
+      return FALSE;
+   }
+
+   if (svga_have_vgpu10(svga)) {
+      /* vgpu10 supports polygon fill and line modes */
+      if ((prim == PIPE_PRIM_QUADS ||
+           prim == PIPE_PRIM_QUAD_STRIP ||
+           prim == PIPE_PRIM_POLYGON) &&
+          hwtnl->api_fillmode == PIPE_POLYGON_MODE_LINE) {
+         /* VGPU10 doesn't directly render quads or polygons.  They're
+          * converted to triangles.  If we let the device draw the triangle
+          * outlines we'll get an extra, stray lines in the interiors.
+          * So, to draw unfilled quads correctly, we need the fallback.
+          */
+         return true;
+      }
+      return hwtnl->api_fillmode == PIPE_POLYGON_MODE_POINT;
+   } else {
+      /* vgpu9 doesn't support line or point fill modes */
+      return hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL;
+   }
+}
+
+
 enum pipe_error 
 svga_hwtnl_prim( struct svga_hwtnl *hwtnl,
                  const SVGA3dPrimitiveRange *range,