aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2018-07-31 10:12:47 -0600
committerBrian Paul <[email protected]>2018-08-08 08:20:10 -0600
commit92e5dc94acbed3d08a2d2e29ed6f219569efc1cd (patch)
tree9e90dbbb8a598e1040983dc5846781054edffca6
parenta45b49570092357a78a2f53b0c53de46bbf87e29 (diff)
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 <[email protected]> Reviewed-by: Charmaine Lee <[email protected]>
-rw-r--r--src/gallium/drivers/svga/svga_draw_private.h30
-rw-r--r--src/gallium/drivers/svga/svga_pipe_rasterizer.c14
-rw-r--r--src/gallium/drivers/svga/svga_state_rss.c19
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 2a60038e9b5..52a2c0f18b3 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 90eb3ef7738..d54ce2d4180 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 0cf8be8efbd..786839f7051 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.