diff options
author | Keith Whitwell <keithw@vmware.com> | 2009-11-26 11:55:47 +0000 |
---|---|---|
committer | Keith Whitwell <keithw@vmware.com> | 2009-11-26 11:55:47 +0000 |
commit | 7b0e4adaf21d4c788657eff41cb51d5c89647309 (patch) | |
tree | cbdb55e113654e1485c63c7748c55c6dd758adea /src/gallium/state_trackers/xorg/xorg_driver.c | |
parent | 8544c309d0a296449d11cf2cf52ca306662dc41d (diff) |
st/xorg: render throttling in block handler
Similar to the classic swapbuffer throttling in GL drivers, put an
upper bound on the number of outstanding chunks of rendering the state
tracker can generate -- where calling the block handler denotes a
chunk.
Currently that number is set at around 4 "chunks", but could be
tweaked up or down. If a better measure for the amount of outstanding
rendering is found, that would be fine too.
As it stands, this improves interactivity by preventing the X server
from queueing up arbitary amounts of rendering.
Diffstat (limited to 'src/gallium/state_trackers/xorg/xorg_driver.c')
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_driver.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/xorg/xorg_driver.c b/src/gallium/state_trackers/xorg/xorg_driver.c index c74fb28072..4c66354ad4 100644 --- a/src/gallium/state_trackers/xorg/xorg_driver.c +++ b/src/gallium/state_trackers/xorg/xorg_driver.c @@ -450,8 +450,24 @@ static void drv_block_handler(int i, pointer blockData, pointer pTimeout, pScreen->BlockHandler(i, blockData, pTimeout, pReadmask); pScreen->BlockHandler = drv_block_handler; - if (ms->ctx) - ms->ctx->flush(ms->ctx, PIPE_FLUSH_RENDER_CACHE, NULL); + if (ms->ctx) { + int j; + + ms->ctx->flush(ms->ctx, PIPE_FLUSH_RENDER_CACHE, &ms->fence[XORG_NR_FENCES-1]); + + if (ms->fence[0]) + ms->ctx->screen->fence_finish(ms->ctx->screen, ms->fence[0], 0); + + /* The amount of rendering generated by a block handler can be + * quite small. Let us get a fair way ahead of hardware before + * throttling. + */ + for (j = 0; j < XORG_NR_FENCES; j++) + ms->screen->fence_reference(ms->screen, + &ms->fence[j], + ms->fence[j+1]); + } + #ifdef DRM_MODE_FEATURE_DIRTYFB { |