summaryrefslogtreecommitdiffstats
path: root/src/gallium/targets/xorg-vmwgfx
diff options
context:
space:
mode:
authorThomas Hellstrom <[email protected]>2010-05-31 20:34:59 +0100
committerJakob Bornecrantz <[email protected]>2010-05-31 22:34:59 +0100
commitd12f2bb9c03a9e8a08824c849200f5b23c05914c (patch)
treea86af4658c5ec1d318b89537f1f477ad761b93ad /src/gallium/targets/xorg-vmwgfx
parentcd151effe654c460c46ba55780eb89b3072077c0 (diff)
st/xorg, vmware: Make throttling configurable.
The xorg state tracker gets two new options to let the user choose whether to enable / disable dirty throttling and swapbuffer throttling. The default value of these options are enabled, unless the winsys supplies a customizer with other values. The customizer record has been extended to allow this, and also to set winsys-based throttling on a per- context basis. The vmware part of this patch disables the dirty throttling if the kernel supports command submission throttling, and also in that case sets kernel based throttling for everything but swapbuffers. The vmware winsys does not set throttling per context, even if it theoretically could, but instead sets throttling per screen. This should perhaps be changed, should the xorg state tracker start to use multiple rendering contexts. Kernel throttling is off by default for all new screens/contexts, so the dri state tracker is not affected. This significantly improves interactivity of the vmware xorg driver. Cherry-picked from commit a8f3b3f88acc1f0193fa740e76e9d815f07f32ab Signed-off-by: Thomas Hellstrom <[email protected]> Signed-off-by: Jakob Bornecrantz <[email protected]>
Diffstat (limited to 'src/gallium/targets/xorg-vmwgfx')
-rw-r--r--src/gallium/targets/xorg-vmwgfx/vmw_screen.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_screen.c b/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
index 5e4ef41688d..e0edf32adb4 100644
--- a/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
+++ b/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
@@ -32,9 +32,14 @@
#include "vmw_hook.h"
#include "vmw_driver.h"
+#include <pipe/p_context.h>
#include "cursorstr.h"
+void vmw_winsys_screen_set_throttling(struct pipe_screen *screen,
+ uint32_t throttle_us);
+
+
/* modified version of crtc functions */
xf86CrtcFuncsRec vmw_screen_crtc_funcs;
@@ -83,12 +88,51 @@ vmw_screen_cursor_close(struct vmw_customizer *vmw)
config->crtc[i]->funcs = vmw->cursor_priv;
}
+static void
+vmw_context_throttle(CustomizerPtr cust,
+ struct pipe_context *pipe,
+ enum xorg_throttling_reason reason)
+{
+ switch (reason) {
+ case THROTTLE_RENDER:
+ vmw_winsys_screen_set_throttling(pipe->screen, 20000);
+ break;
+ default:
+ vmw_winsys_screen_set_throttling(pipe->screen, 0);
+ }
+}
+
+static void
+vmw_context_no_throttle(CustomizerPtr cust,
+ struct pipe_context *pipe,
+ enum xorg_throttling_reason reason)
+{
+ vmw_winsys_screen_set_throttling(pipe->screen, 0);
+}
+
static Bool
vmw_screen_init(CustomizerPtr cust, int fd)
{
struct vmw_customizer *vmw = vmw_customizer(cust);
+ drmVersionPtr ver;
vmw->fd = fd;
+ ver = drmGetVersion(fd);
+ if (ver == NULL ||
+ (ver->version_major == 1 && ver->version_minor < 1)) {
+ cust->swap_throttling = TRUE;
+ cust->dirty_throttling = TRUE;
+ cust->winsys_context_throttle = vmw_context_no_throttle;
+ } else {
+ cust->swap_throttling = TRUE;
+ cust->dirty_throttling = FALSE;
+ cust->winsys_context_throttle = vmw_context_throttle;
+ debug_printf("%s: Enabling kernel throttling.\n", __func__);
+ }
+
+ if (ver)
+ drmFreeVersion(ver);
+
vmw_screen_cursor_init(vmw);
vmw_ctrl_ext_init(vmw);