svga: fix test for unfilled triangles fallback

VGPU10 actually supports line-mode triangles.  We failed to make use of
that before.

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
Brian Paul 2016-05-25 12:42:55 -06:00
parent 2c07c40d2f
commit 90afd7b7ef
3 changed files with 43 additions and 6 deletions

View 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,

View 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,

View 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,