[Mesa-dev] [PATCH 1/2] i965: Throttle rendering to an fbo
Ian Romanick
idr at freedesktop.org
Wed Mar 11 09:12:11 PDT 2015
I've sent my substantive feedback in other messages in the thread.
Below is just some nitpicky formatting kinds of stuff.
On 03/06/2015 01:58 PM, Chris Wilson wrote:
> When rendering to an fbo, even though it may be acting as a winsys
> frontbuffer or just generally, we never throttle. However, when rendering
> to an fbo, there is no natural frame boundary. Conventionally we use
> SwapBuffers and glFinish, but potential callers avoid often glFinish for
> being too heavy handed (waiting on all outstanding rendering to complete).
> The kernel provides a soft-throttling option for this case that waits for
> rendering older than 20ms to be complete (that's a little too lax to be
> used for swapbuffers, but is here a useful safety net). The remaining
> choice is then either never to throttle, throttle after every draw call,
> or at after intermediate user defined point such as glFlush and thus all the
> implied flushes. This patch opts for the latter as that is the current
> method used for flushing to front buffers.
>
> v2: Defer the throttling from inside the flush to the next
> intel_prepare_render() and switch non-fbo frontbuffer throttling over to
> use the same lax method. The issuing being that
> glFlush()/intel_prepare_read() is just as likely to be called inside a
> tight loop and not at "frame" boundaries.
>
> v3: Rename from need_front_throttle to need_flush_throttle to avoid any
> ambiguity between front buffer rendering and fbo rendering. (Chad)
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> Cc: Kenneth Graunke <kenneth at whitecape.org>
> Cc: Ben Widawsky <ben at bwidawsk.net>
> Cc: Kristian Høgsberg <krh at bitplanet.net>
> Cc: Chad Versace <chad.versace at linux.intel.com>
> Reviewed-by: Chad Versace <chad.versace at linux.intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_context.c | 16 ++++++++++++----
> src/mesa/drivers/dri/i965/brw_context.h | 12 +++++++++++-
> src/mesa/drivers/dri/i965/intel_screen.c | 8 ++++----
> 3 files changed, 27 insertions(+), 9 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> index 972e458..bfda55f 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.c
> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> @@ -232,8 +232,8 @@ intel_glFlush(struct gl_context *ctx)
>
> intel_batchbuffer_flush(brw);
> intel_flush_front(ctx);
> - if (brw_is_front_buffer_drawing(ctx->DrawBuffer))
> - brw->need_throttle = true;
> +
> + brw->need_flush_throttle = true;
> }
>
> static void
> @@ -1238,12 +1238,20 @@ intel_prepare_render(struct brw_context *brw)
> * the swap, and getting our hands on that doesn't seem worth it,
> * so we just us the first batch we emitted after the last swap.
> */
> - if (brw->need_throttle && brw->first_post_swapbuffers_batch) {
> + if (brw->need_swap_throttle && brw->first_post_swapbuffers_batch) {
> if (!brw->disable_throttling)
> drm_intel_bo_wait_rendering(brw->first_post_swapbuffers_batch);
> drm_intel_bo_unreference(brw->first_post_swapbuffers_batch);
> brw->first_post_swapbuffers_batch = NULL;
> - brw->need_throttle = false;
> + brw->need_swap_throttle = false;
> + /* Throttling here is more precise than the throttle ioctl, so skip it */
> + brw->need_flush_throttle = false;
> + }
> +
> + if (brw->need_flush_throttle) {
> + __DRIscreen *psp = brw->intelScreen->driScrnPriv;
> + drmCommandNone(psp->fd, DRM_I915_GEM_THROTTLE);
> + brw->need_flush_throttle = false;
> }
> }
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 682fbe9..7854300 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1031,7 +1031,17 @@ struct brw_context
>
> /** Framerate throttling: @{ */
> drm_intel_bo *first_post_swapbuffers_batch;
> - bool need_throttle;
Blank line here.
> + /* Limit the number of outstanding SwapBuffers by waiting for an earlier
> + * frame of rendering to complete. This gives a very precise cap to the
> + * latency between input and output such that rendering never gets more
> + * than a frame behind the user. (With the caveat that we technically are
> + * not using the SwapBuffers itself as a barrier but the first batch
> + * submitted afterwards, which may be immediately prior to the next
> + * SwapBuffers.)
> + */
> + bool need_swap_throttle;
> + /** General throttling, not caught by throttling between SwapBuffers */
> + bool need_flush_throttle;
> /** @} */
>
> GLuint stats_wm;
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
> index cea7ddf..3640b67 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.c
> +++ b/src/mesa/drivers/dri/i965/intel_screen.c
> @@ -174,10 +174,10 @@ intel_dri2_flush_with_flags(__DRIcontext *cPriv,
> if (flags & __DRI2_FLUSH_DRAWABLE)
> intel_resolve_for_dri2_flush(brw, dPriv);
>
> - if (reason == __DRI2_THROTTLE_SWAPBUFFER ||
> - reason == __DRI2_THROTTLE_FLUSHFRONT) {
> - brw->need_throttle = true;
> - }
> + if (reason == __DRI2_THROTTLE_SWAPBUFFER)
> + brw->need_swap_throttle = true;
> + if (reason == __DRI2_THROTTLE_FLUSHFRONT)
> + brw->need_flush_throttle = true;
>
> intel_batchbuffer_flush(brw);
>
>
More information about the mesa-dev
mailing list