diff options
author | Eric Anholt <[email protected]> | 2017-11-24 22:34:12 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2017-12-01 15:37:28 -0800 |
commit | 230e646a4013ed5d9c80c54d48ef0ac9ee4edbb0 (patch) | |
tree | acce4e972a5a5573bf71e93673eaa05bde96dc21 | |
parent | fefff74b0d1d7a308dafe5079f67fc07baa15f11 (diff) |
broadcom/vc4: Decompose single QUADs to a TRIANGLE_FAN.
No significant difference in the minetest replay, but it should reduce
overhead by not requiring that we write quad indices to index buffers that
we repeatedly re-upload (and making the draw packet smaller, as well).
Over the course of the series the actual game seems to be up by 1-2 fps.
-rw-r--r-- | src/gallium/drivers/vc4/vc4_draw.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c index fe9612c38e4..900c0abaf20 100644 --- a/src/gallium/drivers/vc4/vc4_draw.c +++ b/src/gallium/drivers/vc4/vc4_draw.c @@ -286,6 +286,7 @@ static void vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) { struct vc4_context *vc4 = vc4_context(pctx); + struct pipe_draw_info local_info; if (!info->count_from_stream_output && !info->indirect && !info->primitive_restart && @@ -293,11 +294,19 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) return; if (info->mode >= PIPE_PRIM_QUADS) { - util_primconvert_save_rasterizer_state(vc4->primconvert, &vc4->rasterizer->base); - util_primconvert_draw_vbo(vc4->primconvert, info); - perf_debug("Fallback conversion for %d %s vertices\n", - info->count, u_prim_name(info->mode)); - return; + if (info->mode == PIPE_PRIM_QUADS && + info->count == 4 && + !vc4->rasterizer->base.flatshade) { + local_info = *info; + local_info.mode = PIPE_PRIM_TRIANGLE_FAN; + info = &local_info; + } else { + util_primconvert_save_rasterizer_state(vc4->primconvert, &vc4->rasterizer->base); + util_primconvert_draw_vbo(vc4->primconvert, info); + perf_debug("Fallback conversion for %d %s vertices\n", + info->count, u_prim_name(info->mode)); + return; + } } /* Before setting up the draw, do any fixup blits necessary. */ |