Blame SOURCES/0001-xf86-dri2-Use-va_gl-as-vdpau_driver-for-Intel-i965-G.patch

55d6a0
From acf5a0100c98a040e5e07a79ecf4a83627da770e Mon Sep 17 00:00:00 2001
55d6a0
From: Hans de Goede <hdegoede@redhat.com>
55d6a0
Date: Thu, 23 Mar 2017 12:54:07 +0100
55d6a0
Subject: [PATCH xserver] xf86: dri2: Use va_gl as vdpau_driver for Intel i965
55d6a0
 GPUs
55d6a0
55d6a0
The modesetting driver (which now often is used with Intel GPUs),
55d6a0
relies on dri2_probe_driver_name() to get the dri and vdpau driver
55d6a0
names, before this commit it would always assign the same name to
55d6a0
the 2 names. But the vdpau driver for i965 GPUs should be va_gl
55d6a0
(i915 does not support vdpau at all).
55d6a0
55d6a0
This commit modifies the used lookup table and dri2_probe_driver_name()
55d6a0
to set the vdpau_driver to va_gl for i965 GPUs, it leaves the 2
55d6a0
names the same for all other GPUs.
55d6a0
55d6a0
Note this commit adds a FIXME comment for a memory leak in
55d6a0
dri2_probe_driver_name(), that leak was already present and fixing
55d6a0
it falls outside of the scope of this commit.
55d6a0
55d6a0
BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1413733
55d6a0
Cc: kwizart@gmail.com
55d6a0
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
55d6a0
---
55d6a0
 hw/xfree86/dri2/dri2.c                      | 31 +++++++++++++--------
55d6a0
 hw/xfree86/dri2/pci_ids/pci_id_driver_map.h | 21 +++++++-------
55d6a0
 2 files changed, 31 insertions(+), 21 deletions(-)
55d6a0
55d6a0
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
55d6a0
index 6619e3aa7..1f8ad14bc 100644
55d6a0
--- a/hw/xfree86/dri2/dri2.c
55d6a0
+++ b/hw/xfree86/dri2/dri2.c
55d6a0
@@ -1437,14 +1437,18 @@ get_prime_id(void)
55d6a0
 
55d6a0
 #include "pci_ids/pci_id_driver_map.h"
55d6a0
 
55d6a0
-static char *
55d6a0
-dri2_probe_driver_name(ScreenPtr pScreen, DRI2InfoPtr info)
55d6a0
+static void
55d6a0
+dri2_probe_driver_name(ScreenPtr pScreen, DRI2InfoPtr info,
55d6a0
+                       const char **dri_driver_ret,
55d6a0
+                       const char **vdpau_driver_ret)
55d6a0
 {
55d6a0
 #ifdef WITH_LIBDRM
55d6a0
     int i, j;
55d6a0
-    char *driver = NULL;
55d6a0
     drmDevicePtr dev;
55d6a0
 
55d6a0
+    *dri_driver_ret = NULL;
55d6a0
+    *vdpau_driver_ret = NULL;
55d6a0
+
55d6a0
     /* For non-PCI devices and drmGetDevice fail, just assume that
55d6a0
      * the 3D driver is named the same as the kernel driver. This is
55d6a0
      * currently true for vc4 and msm (freedreno).
55d6a0
@@ -1456,12 +1460,14 @@ dri2_probe_driver_name(ScreenPtr pScreen, DRI2InfoPtr info)
55d6a0
             xf86DrvMsg(pScreen->myNum, X_ERROR,
55d6a0
                        "[DRI2] Couldn't drmGetVersion() on non-PCI device, "
55d6a0
                        "no driver name found.\n");
55d6a0
-            return NULL;
55d6a0
+            return;
55d6a0
         }
55d6a0
 
55d6a0
-        driver = strndup(version->name, version->name_len);
55d6a0
+        /* FIXME this gets leaked */
55d6a0
+        *dri_driver_ret = strndup(version->name, version->name_len);
55d6a0
+        *vdpau_driver_ret = *dri_driver_ret;
55d6a0
         drmFreeVersion(version);
55d6a0
-        return driver;
55d6a0
+        return;
55d6a0
     }
55d6a0
 
55d6a0
     for (i = 0; driver_map[i].driver; i++) {
55d6a0
@@ -1469,13 +1475,15 @@ dri2_probe_driver_name(ScreenPtr pScreen, DRI2InfoPtr info)
55d6a0
             continue;
55d6a0
 
55d6a0
         if (driver_map[i].num_chips_ids == -1) {
55d6a0
-             driver = strdup(driver_map[i].driver);
55d6a0
+             *dri_driver_ret = driver_map[i].driver;
55d6a0
+             *vdpau_driver_ret = driver_map[i].vdpau_driver;
55d6a0
              goto out;
55d6a0
         }
55d6a0
 
55d6a0
         for (j = 0; j < driver_map[i].num_chips_ids; j++) {
55d6a0
             if (driver_map[i].chip_ids[j] == dev->deviceinfo.pci->device_id) {
55d6a0
-                driver = strdup(driver_map[i].driver);
55d6a0
+                *dri_driver_ret = driver_map[i].driver;
55d6a0
+                *vdpau_driver_ret = driver_map[i].vdpau_driver;
55d6a0
                 goto out;
55d6a0
             }
55d6a0
         }
55d6a0
@@ -1487,9 +1495,9 @@ dri2_probe_driver_name(ScreenPtr pScreen, DRI2InfoPtr info)
55d6a0
                dev->deviceinfo.pci->vendor_id, dev->deviceinfo.pci->device_id);
55d6a0
 out:
55d6a0
     drmFreeDevice(&dev;;
55d6a0
-    return driver;
55d6a0
 #else
55d6a0
-    return NULL;
55d6a0
+    *dri_driver_ret = NULL;
55d6a0
+    *vdpau_driver_ret = NULL;
55d6a0
 #endif
55d6a0
 }
55d6a0
 
55d6a0
@@ -1610,7 +1618,8 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
55d6a0
         if (info->driverName) {
55d6a0
             ds->driverNames[0] = info->driverName;
55d6a0
         } else {
55d6a0
-            ds->driverNames[0] = ds->driverNames[1] = dri2_probe_driver_name(pScreen, info);
55d6a0
+            dri2_probe_driver_name(pScreen, info,
55d6a0
+                                   &ds->driverNames[0], &ds->driverNames[1]);
55d6a0
             if (!ds->driverNames[0])
55d6a0
                 return FALSE;
55d6a0
         }
55d6a0
diff --git a/hw/xfree86/dri2/pci_ids/pci_id_driver_map.h b/hw/xfree86/dri2/pci_ids/pci_id_driver_map.h
55d6a0
index da7ea1c1e..7036d1003 100644
55d6a0
--- a/hw/xfree86/dri2/pci_ids/pci_id_driver_map.h
55d6a0
+++ b/hw/xfree86/dri2/pci_ids/pci_id_driver_map.h
55d6a0
@@ -66,21 +66,22 @@ static const int vmwgfx_chip_ids[] = {
55d6a0
 static const struct {
55d6a0
    int vendor_id;
55d6a0
    const char *driver;
55d6a0
+   const char *vdpau_driver;
55d6a0
    const int *chip_ids;
55d6a0
    int num_chips_ids;
55d6a0
 } driver_map[] = {
55d6a0
-   { 0x8086, "i915", i915_chip_ids, ARRAY_SIZE(i915_chip_ids) },
55d6a0
-   { 0x8086, "i965", i965_chip_ids, ARRAY_SIZE(i965_chip_ids) },
55d6a0
+   { 0x8086, "i915", "i915", i915_chip_ids, ARRAY_SIZE(i915_chip_ids) },
55d6a0
+   { 0x8086, "i965", "va_gl", i965_chip_ids, ARRAY_SIZE(i965_chip_ids) },
55d6a0
 #ifndef DRIVER_MAP_GALLIUM_ONLY
55d6a0
-   { 0x1002, "radeon", r100_chip_ids, ARRAY_SIZE(r100_chip_ids) },
55d6a0
-   { 0x1002, "r200", r200_chip_ids, ARRAY_SIZE(r200_chip_ids) },
55d6a0
+   { 0x1002, "radeon", "radeon", r100_chip_ids, ARRAY_SIZE(r100_chip_ids) },
55d6a0
+   { 0x1002, "r200", "r200", r200_chip_ids, ARRAY_SIZE(r200_chip_ids) },
55d6a0
 #endif
55d6a0
-   { 0x1002, "r300", r300_chip_ids, ARRAY_SIZE(r300_chip_ids) },
55d6a0
-   { 0x1002, "r600", r600_chip_ids, ARRAY_SIZE(r600_chip_ids) },
55d6a0
-   { 0x1002, "radeonsi", radeonsi_chip_ids, ARRAY_SIZE(radeonsi_chip_ids) },
55d6a0
-   { 0x10de, "nouveau", NULL, -1 },
55d6a0
-   { 0x1af4, "virtio_gpu", virtio_gpu_chip_ids, ARRAY_SIZE(virtio_gpu_chip_ids) },
55d6a0
-   { 0x15ad, "vmwgfx", vmwgfx_chip_ids, ARRAY_SIZE(vmwgfx_chip_ids) },
55d6a0
+   { 0x1002, "r300", "r300", r300_chip_ids, ARRAY_SIZE(r300_chip_ids) },
55d6a0
+   { 0x1002, "r600","r600",  r600_chip_ids, ARRAY_SIZE(r600_chip_ids) },
55d6a0
+   { 0x1002, "radeonsi", "radeonsi", radeonsi_chip_ids, ARRAY_SIZE(radeonsi_chip_ids) },
55d6a0
+   { 0x10de, "nouveau", "nouveau", NULL, -1 },
55d6a0
+   { 0x1af4, "virtio_gpu", "virtio_gpu", virtio_gpu_chip_ids, ARRAY_SIZE(virtio_gpu_chip_ids) },
55d6a0
+   { 0x15ad, "vmwgfx", "vmwgfx", vmwgfx_chip_ids, ARRAY_SIZE(vmwgfx_chip_ids) },
55d6a0
    { 0x0000, NULL, NULL, 0 },
55d6a0
 };
55d6a0
 
55d6a0
-- 
55d6a0
2.19.0
55d6a0