From 44cb9578c0e5e10568826bc3ecbed97d358bba3c Mon Sep 17 00:00:00 2001 From: Alex Goins Date: Thu, 16 Jun 2016 20:06:55 -0700 Subject: [PATCH] modesetting: Disable Reverse PRIME for i915 Reverse PRIME seems to be designed with discrete graphics as a sink in mind, designed to do an extra copy from sysmem to vidmem to prevent a discrete chip from needing to scan out from sysmem. The criteria it used to detect this case is if we are a GPU screen and Glamor accelerated. It's possible for i915 to fulfill these conditions, despite the fact that the additional copy doesn't make sense for i915. Normally, you could just set AccelMethod = none as an option for the device and call it a day. However, when running with modesetting as both the sink and the source, Glamor must be enabled. Ideally, you would be able to set AccelMethod individually for devices using the same driver, but there seems to be a bug in X option parsing that makes all devices on a driver inherit the options from the first detected device. Thus, glamor needs to be enabled for all or for none until that bug (if it's even a bug) is fixed. Nonetheless, it probably doesn't make sense to do the extra copy on i915 even if Glamor is enabled for the device, so this is more user friendly by not requiring users to disable acceleration for i915. v1: N/A v2: N/A v3: N/A v4: Initial commit v5: Unchanged v6: Rebase onto ToT v7: NULL check and free drmVersionPtr Reviewed-by: Dave Airlie Signed-off-by: Alex Goins --- hw/xfree86/drivers/modesetting/driver.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c index 2d66a4b8f..160cbc944 100644 --- a/hw/xfree86/drivers/modesetting/driver.c +++ b/hw/xfree86/drivers/modesetting/driver.c @@ -1385,9 +1385,22 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to initialize the Present extension.\n"); } - /* enable reverse prime if we are a GPU screen, and accelerated */ - if (pScreen->isGPU) + /* enable reverse prime if we are a GPU screen, and accelerated, and not + * i915. i915 is happy scanning out from sysmem. */ + if (pScreen->isGPU) { + drmVersionPtr version; + + /* enable if we are an accelerated GPU screen */ ms->drmmode.reverse_prime_offload_mode = TRUE; + + /* disable if we detect i915 */ + if ((version = drmGetVersion(ms->drmmode.fd))) { + if (!strncmp("i915", version->name, version->name_len)) { + ms->drmmode.reverse_prime_offload_mode = FALSE; + } + drmFreeVersion(version); + } + } } #endif