st/xorg: render throttling in block handler
authorKeith Whitwell <keithw@vmware.com>
Thu, 26 Nov 2009 11:55:47 +0000 (11:55 +0000)
committerKeith Whitwell <keithw@vmware.com>
Thu, 26 Nov 2009 11:55:47 +0000 (11:55 +0000)
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.

src/gallium/state_trackers/xorg/xorg_driver.c
src/gallium/state_trackers/xorg/xorg_renderer.c
src/gallium/state_trackers/xorg/xorg_tracker.h

index c74fb28072972536c73a763f2ee2c2e2fe306358..4c66354ad450fa88b37d4a7c73107f59ef2c3847 100644 (file)
@@ -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
     {
index 16ac5d204d9c1c70d15e4568cbcb70882f6ea04f..d9698e32e1fa74012b651bb11d45499d6e124c19 100644 (file)
 
 #include <math.h>
 
-enum AxisOrientation {
-   Y0_BOTTOM,
-   Y0_TOP
-};
-
 #define floatsEqual(x, y) (fabs(x - y) <= 0.00001f * MIN2(fabs(x), fabs(y)))
 #define floatIsZero(x) (floatsEqual((x) + 1, 1))
 
index 31e11b480932639d6e34ebb30f7b3771bb2e797e..c6c7b2fe158d6931291b8822068fc27b5cbfe300 100644 (file)
@@ -63,6 +63,8 @@ typedef struct
     ScrnInfoPtr pScrn_2;
 } EntRec, *EntPtr;
 
+#define XORG_NR_FENCES 3
+
 typedef struct _modesettingRec
 {
     /* drm */
@@ -86,6 +88,8 @@ typedef struct _modesettingRec
     unsigned int SaveGeneration;
 
     void (*blockHandler)(int, pointer, pointer, pointer);
+    struct pipe_fence_handle *fence[XORG_NR_FENCES];
+
     CreateScreenResourcesProcPtr createScreenResources;
 
     /* for frontbuffer backing store */