summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/svga/svga_draw_arrays.c8
-rw-r--r--src/gallium/drivers/svga/svga_draw_elements.c3
-rw-r--r--src/gallium/drivers/svga/svga_draw_private.h38
3 files changed, 43 insertions, 6 deletions
diff --git a/src/gallium/drivers/svga/svga_draw_arrays.c b/src/gallium/drivers/svga/svga_draw_arrays.c
index c0567728e92..43d7a975695 100644
--- a/src/gallium/drivers/svga/svga_draw_arrays.c
+++ b/src/gallium/drivers/svga/svga_draw_arrays.c
@@ -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,
diff --git a/src/gallium/drivers/svga/svga_draw_elements.c b/src/gallium/drivers/svga/svga_draw_elements.c
index a987b929861..b74c745ee4a 100644
--- a/src/gallium/drivers/svga/svga_draw_elements.c
+++ b/src/gallium/drivers/svga/svga_draw_elements.c
@@ -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,
diff --git a/src/gallium/drivers/svga/svga_draw_private.h b/src/gallium/drivers/svga/svga_draw_private.h
index 48e0b6017fd..da5d60e38f7 100644
--- a/src/gallium/drivers/svga/svga_draw_private.h
+++ b/src/gallium/drivers/svga/svga_draw_private.h
@@ -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,