From 516736705017f3e19be37f22c6655a055413683b Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 24 Nov 2017 22:15:28 -0800 Subject: [PATCH] broadcom/vc4: Skip emitting redundant VC4_PACKET_GEM_HANDLES. Now that there's only one user of it, it's pretty obvious how to avoid emitting redundant ones. This should save a bunch of kernel validation overhead. No statistically sigificant difference on the minetest trace I was looking at (n=169), but the maximum FPS is up by .3% --- src/gallium/drivers/vc4/vc4_context.h | 3 +++ src/gallium/drivers/vc4/vc4_draw.c | 10 +++++++--- src/gallium/drivers/vc4/vc4_job.c | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/vc4/vc4_context.h b/src/gallium/drivers/vc4/vc4_context.h index 4a1e409..cd404d4 100644 --- a/src/gallium/drivers/vc4/vc4_context.h +++ b/src/gallium/drivers/vc4/vc4_context.h @@ -243,6 +243,9 @@ struct vc4_job { */ uint32_t bo_space; + /* Last BO hindex referenced from VC4_PACKET_GEM_HANDLES. */ + uint32_t last_gem_handle_hindex; + /** @{ Surfaces to submit rendering for. */ struct pipe_surface *color_read; struct pipe_surface *color_write; diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c index fd80f67..fe9612c 100644 --- a/src/gallium/drivers/vc4/vc4_draw.c +++ b/src/gallium/drivers/vc4/vc4_draw.c @@ -388,9 +388,13 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) * to perform the relocation in the IB packet (without * emitting to the actual HW). */ - cl_u8(&bcl, VC4_PACKET_GEM_HANDLES); - cl_u32(&bcl, vc4_gem_hindex(job, rsc->bo)); - cl_u32(&bcl, 0); + uint32_t hindex = vc4_gem_hindex(job, rsc->bo); + if (job->last_gem_handle_hindex != hindex) { + cl_u8(&bcl, VC4_PACKET_GEM_HANDLES); + cl_u32(&bcl, hindex); + cl_u32(&bcl, 0); + job->last_gem_handle_hindex = hindex; + } cl_u8(&bcl, VC4_PACKET_GL_INDEXED_PRIMITIVE); cl_u8(&bcl, diff --git a/src/gallium/drivers/vc4/vc4_job.c b/src/gallium/drivers/vc4/vc4_job.c index 7fe20c1..5d18cb9 100644 --- a/src/gallium/drivers/vc4/vc4_job.c +++ b/src/gallium/drivers/vc4/vc4_job.c @@ -90,6 +90,8 @@ vc4_job_create(struct vc4_context *vc4) job->draw_max_x = 0; job->draw_max_y = 0; + job->last_gem_handle_hindex = ~0; + return job; } -- 2.7.4