Mesa (master): svga: use SVGA3D_RS_FILLMODE for vgpu9

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Aug 8 15:39:40 UTC 2018


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

Author: Brian Paul <brianp at vmware.com>
Date:   Tue Jul 31 10:12:47 2018 -0600

svga: use SVGA3D_RS_FILLMODE for vgpu9

I'm not sure why we didn't support this in the past, but fillmode
is supported by all renderers nowadays.

Also fix the logic in svga_create_rasterizer_state() to avoid a few
swtnl case.

No piglit regressions

Reviewed-by: Neha Bhende <bhenden at vmware.com>
Reviewed-by: Charmaine Lee <charmainel at vmware.com>

---

 src/gallium/drivers/svga/svga_draw_private.h    | 30 +++++++++----------------
 src/gallium/drivers/svga/svga_pipe_rasterizer.c | 14 ++++++------
 src/gallium/drivers/svga/svga_state_rss.c       | 19 ++++++++++++++++
 3 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/src/gallium/drivers/svga/svga_draw_private.h b/src/gallium/drivers/svga/svga_draw_private.h
index 2a60038e9b..52a2c0f18b 100644
--- a/src/gallium/drivers/svga/svga_draw_private.h
+++ b/src/gallium/drivers/svga/svga_draw_private.h
@@ -191,31 +191,23 @@ static inline boolean
 svga_need_unfilled_fallback(const struct svga_hwtnl *hwtnl,
                             enum pipe_prim_type 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;
+   if ((prim == PIPE_PRIM_QUADS ||
+        prim == PIPE_PRIM_QUAD_STRIP ||
+        prim == PIPE_PRIM_POLYGON) &&
+       hwtnl->api_fillmode == PIPE_POLYGON_MODE_LINE) {
+      /* We can'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 false;
 }
 
 
diff --git a/src/gallium/drivers/svga/svga_pipe_rasterizer.c b/src/gallium/drivers/svga/svga_pipe_rasterizer.c
index 90eb3ef773..d54ce2d418 100644
--- a/src/gallium/drivers/svga/svga_pipe_rasterizer.c
+++ b/src/gallium/drivers/svga/svga_pipe_rasterizer.c
@@ -255,7 +255,7 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
    {
       int fill_front = templ->fill_front;
       int fill_back = templ->fill_back;
-      int fill = PIPE_POLYGON_MODE_FILL;
+      int fill;
       boolean offset_front = util_get_offset(templ, fill_front);
       boolean offset_back = util_get_offset(templ, fill_back);
       boolean offset = FALSE;
@@ -267,13 +267,13 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
          break;
 
       case PIPE_FACE_FRONT:
-         offset = offset_front;
-         fill = fill_front;
+         offset = offset_back;
+         fill = fill_back;
          break;
 
       case PIPE_FACE_BACK:
-         offset = offset_back;
-         fill = fill_back;
+         offset = offset_front;
+         fill = fill_front;
          break;
 
       case PIPE_FACE_NONE:
@@ -283,6 +283,7 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
              */
             rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
             rast->need_pipeline_tris_str = "different front/back fillmodes";
+            fill = PIPE_POLYGON_MODE_FILL;
          }
          else {
             offset = offset_front;
@@ -302,8 +303,7 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
       if (fill != PIPE_POLYGON_MODE_FILL &&
           (templ->flatshade ||
            templ->light_twoside ||
-           offset ||
-           templ->cull_face != PIPE_FACE_NONE)) {
+           offset)) {
          fill = PIPE_POLYGON_MODE_FILL;
          rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
          rast->need_pipeline_tris_str = "unfilled primitives with no index manipulation";
diff --git a/src/gallium/drivers/svga/svga_state_rss.c b/src/gallium/drivers/svga/svga_state_rss.c
index 0cf8be8efb..786839f705 100644
--- a/src/gallium/drivers/svga/svga_state_rss.c
+++ b/src/gallium/drivers/svga/svga_state_rss.c
@@ -75,6 +75,23 @@ svga_queue_rs(struct rs_queue *q, unsigned rss, unsigned value)
 }
 
 
+static unsigned
+translate_fill_mode(unsigned fill)
+{
+   switch (fill) {
+   case PIPE_POLYGON_MODE_POINT:
+      return SVGA3D_FILLMODE_POINT;
+   case PIPE_POLYGON_MODE_LINE:
+      return SVGA3D_FILLMODE_LINE;
+   case PIPE_POLYGON_MODE_FILL:
+      return SVGA3D_FILLMODE_FILL;
+   default:
+      assert(!"Bad fill mode");
+      return SVGA3D_FILLMODE_FILL;
+   }
+}
+
+
 /* Compare old and new render states and emit differences between them
  * to hardware.  Simplest implementation would be to emit the whole of
  * the "to" state.
@@ -207,6 +224,8 @@ emit_rss_vgpu9(struct svga_context *svga, unsigned dirty)
        */
       EMIT_RS(svga, curr->shademode, SHADEMODE);
 
+      EMIT_RS(svga, translate_fill_mode(curr->hw_fillmode), FILLMODE);
+
       /* Don't do culling while the software pipeline is active.  It
        * does it for us, and additionally introduces potentially
        * back-facing triangles.




More information about the mesa-commit mailing list