summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/intel_options.c2
-rw-r--r--src/intel_options.h2
-rw-r--r--src/sna/sna.h3
-rw-r--r--src/sna/sna_display.c3
-rw-r--r--src/sna/sna_dri.c8
-rw-r--r--src/sna/sna_driver.c32
6 files changed, 40 insertions, 10 deletions
diff --git a/src/intel_options.c b/src/intel_options.c
index 153cc629..6d53a3f3 100644
--- a/src/intel_options.c
+++ b/src/intel_options.c
@@ -13,6 +13,8 @@ const OptionInfoRec intel_options[] = {
{OPTION_VIDEO_KEY, "VideoKey", OPTV_INTEGER, {0}, 0},
{OPTION_TILING_2D, "Tiling", OPTV_BOOLEAN, {0}, 1},
{OPTION_TILING_FB, "LinearFramebuffer", OPTV_BOOLEAN, {0}, 0},
+ {OPTION_VSYNC, "VSync", OPTV_BOOLEAN, {0}, 1},
+ {OPTION_PAGEFLIP, "PageFlip", OPTV_BOOLEAN, {0}, 1},
{OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN, {0}, 1},
{OPTION_TRIPLE_BUFFER, "TripleBuffer", OPTV_BOOLEAN, {0}, 1},
{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, 0},
diff --git a/src/intel_options.h b/src/intel_options.h
index 095660c3..e61075b3 100644
--- a/src/intel_options.h
+++ b/src/intel_options.h
@@ -19,6 +19,8 @@ enum intel_options {
OPTION_COLOR_KEY,
OPTION_TILING_2D,
OPTION_TILING_FB,
+ OPTION_VSYNC,
+ OPTION_PAGEFLIP,
OPTION_SWAPBUFFERS_WAIT,
OPTION_TRIPLE_BUFFER,
OPTION_PREFER_OVERLAY,
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 2f732eb1..32d9ef37 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -226,7 +226,8 @@ struct sna {
unsigned flags;
#define SNA_NO_WAIT 0x1
#define SNA_NO_FLIP 0x2
-#define SNA_TRIPLE_BUFFER 0x4
+#define SNA_NO_VSYNC 0x4
+#define SNA_TRIPLE_BUFFER 0x8
#define SNA_TEAR_FREE 0x10
#define SNA_FORCE_SHADOW 0x20
#define SNA_FLUSH_GTT 0x40
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 1d1022e0..f1482341 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3627,6 +3627,9 @@ sna_wait_for_scanline(struct sna *sna,
assert(to_sna_crtc(crtc)->bo != NULL);
assert(pixmap == sna->front);
+ if (sna->flags & SNA_NO_VSYNC)
+ return false;
+
/*
* Make sure we don't wait for a scanline that will
* never occur
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 25f66b31..4c5476e4 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -303,7 +303,7 @@ sna_dri_create_buffer(DrawablePtr draw,
case DRI2BufferBackLeft:
if (draw->width == sna->front->drawable.width &&
draw->height == sna->front->drawable.height &&
- (sna->flags & SNA_NO_FLIP) == 0)
+ (sna->flags & (SNA_NO_WAIT | SNA_NO_FLIP)) == 0)
flags |= CREATE_SCANOUT;
case DRI2BufferBackRight:
case DRI2BufferFrontRight:
@@ -1080,6 +1080,8 @@ can_flip(struct sna * sna,
WindowPtr win = (WindowPtr)draw;
PixmapPtr pixmap;
+ assert((sna->flags & SNA_NO_WAIT) == 0);
+
if (draw->type == DRAWABLE_PIXMAP)
return false;
@@ -1967,7 +1969,9 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
assert(sna_pixmap_from_drawable(draw)->flush);
/* Drawable not displayed... just complete the swap */
- pipe = sna_dri_get_pipe(draw);
+ pipe = -1;
+ if (sna->flags & SNA_NO_WAIT)
+ pipe = sna_dri_get_pipe(draw);
if (pipe == -1) {
DBG(("%s: off-screen, immediate update\n", __FUNCTION__));
goto blit;
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 4da6cbb0..da5740a7 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -294,12 +294,20 @@ static void sna_selftest(void)
sna_damage_selftest();
}
+static bool has_vsync(struct sna *sna)
+{
+ if (sna->flags & SNA_IS_HOSTED)
+ return false;
+
+ return true;
+}
+
static bool has_pageflipping(struct sna *sna)
{
drm_i915_getparam_t gp;
int v;
- if (sna->flags & (SNA_IS_HOSTED | SNA_NO_WAIT))
+ if (sna->flags & SNA_IS_HOSTED)
return false;
v = 0;
@@ -508,13 +516,23 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
if (!xf86ReturnOptValBool(sna->Options, OPTION_SWAPBUFFERS_WAIT, TRUE))
sna->flags |= SNA_NO_WAIT;
- if (xf86ReturnOptValBool(sna->Options, OPTION_TRIPLE_BUFFER, TRUE))
- sna->flags |= SNA_TRIPLE_BUFFER;
- if (has_pageflipping(sna)) {
- if (xf86ReturnOptValBool(sna->Options, OPTION_TEAR_FREE, FALSE))
- sna->flags |= SNA_TEAR_FREE;
- } else
+
+ if (!has_vsync(sna) ||
+ !xf86ReturnOptValBool(sna->Options, OPTION_VSYNC, TRUE))
+ sna->flags |= SNA_NO_VSYNC;
+
+ if (!has_pageflipping(sna) ||
+ !xf86ReturnOptValBool(sna->Options, OPTION_PAGEFLIP, TRUE))
sna->flags |= SNA_NO_FLIP;
+
+ if ((sna->flags & (SNA_NO_VSYNC | SNA_NO_FLIP | SNA_NO_WAIT)) == 0 &&
+ xf86ReturnOptValBool(sna->Options, OPTION_TRIPLE_BUFFER, TRUE))
+ sna->flags |= SNA_TRIPLE_BUFFER;
+
+ if ((sna->flags & (SNA_NO_VSYNC | SNA_NO_FLIP)) == 0 &&
+ xf86ReturnOptValBool(sna->Options, OPTION_TEAR_FREE, FALSE))
+ sna->flags |= SNA_TEAR_FREE;
+
if (xf86ReturnOptValBool(sna->Options, OPTION_CRTC_PIXMAPS, FALSE))
sna->flags |= SNA_FORCE_SHADOW;