On 03/06/2015 06:56 AM, Chris Wilson wrote:
In order to facilitate the concurrency offered by triple buffering and to
offset the latency induced by swapping via an external process, which
may incur extra rendering itself, only throttle to the previous frame
and not the last. This doubles the maximum possible latency at the
benefit of improving throughput and reducing jitter.
Signed-off-by: Chris Wilson ch...@chris-wilson.co.uk
Cc: Daniel Vetter daniel.vet...@ffwll.ch
Cc: Kenneth Graunke kenn...@whitecape.org
Cc: Ben Widawsky b...@bwidawsk.net
Cc: Kristian Høgsberg k...@bitplanet.net
Cc: Chad Versace chad.vers...@linux.intel.com
---
src/mesa/drivers/dri/i965/brw_context.c | 19 ---
src/mesa/drivers/dri/i965/brw_context.h | 2 +-
src/mesa/drivers/dri/i965/intel_batchbuffer.c | 7 ---
3 files changed, 17 insertions(+), 11 deletions(-)
I'm ok with the patch's idea. Just please rename the variable. It's badly named
now. The batches are used for more than just swapbuffers. And it holds two
batches,
but how can there be two first batches?
How about brw-post_throttle_batches? Any name without first or swap would
be fine.
diff --git a/src/mesa/drivers/dri/i965/brw_context.c
b/src/mesa/drivers/dri/i965/brw_context.c
index 2ed5f16..6897c2c 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -928,8 +928,10 @@ intelDestroyContext(__DRIcontext * driContextPriv)
intel_batchbuffer_free(brw);
- drm_intel_bo_unreference(brw-first_post_swapbuffers_batch);
- brw-first_post_swapbuffers_batch = NULL;
+ drm_intel_bo_unreference(brw-first_post_swapbuffers_batch[1]);
+ drm_intel_bo_unreference(brw-first_post_swapbuffers_batch[0]);
+ brw-first_post_swapbuffers_batch[1] = NULL;
+ brw-first_post_swapbuffers_batch[0] = NULL;
driDestroyOptionCache(brw-optionCache);
@@ -1238,11 +1240,14 @@ 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_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;
+ if (brw-need_swap_throttle brw-first_post_swapbuffers_batch[0]) {
+ if (brw-first_post_swapbuffers_batch[1]) {
+ if (!brw-disable_throttling)
+
drm_intel_bo_wait_rendering(brw-first_post_swapbuffers_batch[1]);
+ drm_intel_bo_unreference(brw-first_post_swapbuffers_batch[1]);
+ }
+ brw-first_post_swapbuffers_batch[1] =
brw-first_post_swapbuffers_batch[0];
+ brw-first_post_swapbuffers_batch[0] = NULL;
brw-need_swap_throttle = false;
brw-need_front_throttle = false;
}
diff --git a/src/mesa/drivers/dri/i965/brw_context.h
b/src/mesa/drivers/dri/i965/brw_context.h
index b90e050..e347f26 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -1030,7 +1030,7 @@ struct brw_context
bool front_buffer_dirty;
/** Framerate throttling: @{ */
- drm_intel_bo *first_post_swapbuffers_batch;
+ drm_intel_bo *first_post_swapbuffers_batch[2];
bool need_swap_throttle;
bool need_front_throttle;
/** @} */
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
index 5ac4d18..460b4b9 100644
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
@@ -168,6 +168,7 @@ static void
brw_new_batch(struct brw_context *brw)
{
/* Create a new batchbuffer and reset the associated state: */
+ drm_intel_gem_bo_clear_relocs(brw-batch.bo, 0);
intel_batchbuffer_reset(brw);
/* If the kernel supports hardware contexts, then most hardware state is
@@ -289,9 +290,9 @@ _intel_batchbuffer_flush(struct brw_context *brw,
if (brw-batch.used == 0)
return 0;
- if (brw-first_post_swapbuffers_batch == NULL) {
- brw-first_post_swapbuffers_batch = brw-batch.bo;
- drm_intel_bo_reference(brw-first_post_swapbuffers_batch);
+ if (brw-first_post_swapbuffers_batch[0] == NULL) {
+ brw-first_post_swapbuffers_batch[0] = brw-batch.bo;
+ drm_intel_bo_reference(brw-first_post_swapbuffers_batch[0]);
}
if (unlikely(INTEL_DEBUG DEBUG_BATCH)) {
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev