From 57301015f16e26f12caf6f6cb4d730e7793cb2c3 Mon Sep 17 00:00:00 2001
From: Adam Jackson <ajax@redhat.com>
Date: Wed, 30 May 2018 11:46:46 -0400
Subject: [PATCH xf86-video-vesa] Disable shadow by default on known-virtual
 GPUs

Device memory is the same domain as host memory, in this case, so the
shadow just introduces more memcpy.

Signed-off-by: Adam Jackson <ajax@redhat.com>
---
 src/vesa.c | 35 ++++++++++++++++++++++++++++++++---
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/src/vesa.c b/src/vesa.c
index 2300f4e..7d2bf94 100644
--- a/src/vesa.c
+++ b/src/vesa.c
@@ -844,9 +844,38 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags)
     memcpy(pVesa->Options, VESAOptions, sizeof(VESAOptions));
     xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pVesa->Options);
 
-    /* Use shadow by default */
-    pVesa->shadowFB = xf86ReturnOptValBool(pVesa->Options, OPTION_SHADOW_FB,
-                                           TRUE);
+    /* Use shadow by default, for non-virt hardware */
+    if (!xf86GetOptValBool(pVesa->Options, OPTION_SHADOW_FB, &pVesa->shadowFB))
+    {
+	switch (pVesa->pciInfo->vendor_id) {
+	    case 0x1234: /* bochs vga (not in pci.ids) */
+	    case 0x15ad: /* vmware */
+	    case 0x1b36: /* qemu qxl */
+	    case 0x80ee: /* virtualbox */
+	    case 0xaaaa: /* parallels (not in pci.ids) */
+		pVesa->shadowFB = FALSE;
+		break;
+
+	    case 0x1013: /* qemu's cirrus emulation */
+		if (pVesa->pciInfo->subvendor_id == 0x1af4)
+		    pVesa->shadowFB = FALSE;
+		else
+		    pVesa->shadowFB = TRUE;
+		break;
+
+	    case 0x1414: /* microsoft hyper-v */
+		if (pVesa->pciInfo->device_id == 0x5353)
+		    pVesa->shadowFB = FALSE;
+		else
+		    pVesa->shadowFB = TRUE;
+		break;
+
+	    default:
+		pVesa->shadowFB = TRUE;
+		break;
+	}
+    }
+
     /*  Use default refresh by default. Too many VBE 3.0
      *   BIOSes are incorrectly implemented.
      */
-- 
2.17.0

