summaryrefslogtreecommitdiff
path: root/src/nv_driver.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2010-08-26 13:19:39 +1000
committerBen Skeggs <bskeggs@redhat.com>2010-08-26 13:22:11 +1000
commit34025f0dc9284873d4bf7e4f547ed69fc562a3c9 (patch)
treeea475e062d8b439b3db8fa0427dd3a70108456ae /src/nv_driver.c
parent390f1c86d9583f4ceabd407ee47410073c2a1b55 (diff)
kickoff from the flush callback chain
This is a port of intel commit: 69d65f9184006eac790efcff78a0e425160e95aa Submit batch buffers from flush callback chain There are a few cases where the server will flush client output buffers but our block handler only catches the most common (before going into select If the server flushes client buffers before we submit our batch buffer, the client may receive a damage event for rendering that hasn't happened yet Instead, we can hook into the flush callback chain, which the server will invoke just before flushing output. This lets us submit batch buffers before sending out events, preserving ordering. Fixes 28438: [bisected] incorrect character in gnome-terminal under compiz https://bugs.freedesktop.org/show_bug.cgi?id=28438 Signed-off-by: Kristian Høgsberg <krh@bitplanet.net> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'src/nv_driver.c')
-rw-r--r--src/nv_driver.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 3c16918..bd061ed 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -355,6 +355,16 @@ NVLeaveVT(int scrnIndex, int flags)
ErrorF("Error dropping master: %d\n", ret);
}
+static void
+NVFlushCallback(CallbackListPtr *list, pointer user_data, pointer call_data)
+{
+ ScrnInfoPtr pScrn = user_data;
+ NVPtr pNv = NVPTR(pScrn);
+
+ if (pScrn->vtSema && !pNv->NoAccel)
+ FIRE_RING (pNv->chan);
+}
+
static void
NVBlockHandler (
int i,
@@ -367,9 +377,6 @@ NVBlockHandler (
ScrnInfoPtr pScrnInfo = xf86Screens[i];
NVPtr pNv = NVPTR(pScrnInfo);
- if (pScrnInfo->vtSema && !pNv->NoAccel)
- FIRE_RING (pNv->chan);
-
pScreen->BlockHandler = pNv->BlockHandler;
(*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
pScreen->BlockHandler = NVBlockHandler;
@@ -432,6 +439,8 @@ NVCloseScreen(int scrnIndex, ScreenPtr pScreen)
xf86_cursors_fini(pScreen);
+ DeleteCallback(&FlushCallback, NVFlushCallback, pScrn);
+
if (pNv->ShadowPtr) {
free(pNv->ShadowPtr);
pNv->ShadowPtr = NULL;
@@ -1146,6 +1155,9 @@ NVScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
pNv->BlockHandler = pScreen->BlockHandler;
pScreen->BlockHandler = NVBlockHandler;
+ if (!AddCallback(&FlushCallback, NVFlushCallback, pScrn))
+ return FALSE;
+
pScrn->vtSema = TRUE;
pScrn->pScreen = pScreen;