[PATCH] qxl-wddm-dod: Load best know defaults for video mode at driver's start

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Even if initial display resolution is not available at driver start, try
to find it in the registry. Then the driver can prevent black screen
on uninstall/disable also when it was installed on UEFI machine after
the production driver 0.18 which did not report valid video mode.

Signed-off-by: Yuri Benditovich <yuri.benditovich@xxxxxxxxxx>
---
 qxldod/QxlDod.cpp | 37 ++++++++++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 5 deletions(-)

diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
index dea78e2..525cdc3 100755
--- a/qxldod/QxlDod.cpp
+++ b/qxldod/QxlDod.cpp
@@ -5169,6 +5169,37 @@ UINT SpiceFromPixelFormat(D3DDDIFORMAT Format)
     }
 }
 
+// Width and Height values for initial video mode are populated by
+// display class driver upon switch from boot display to operational one.
+// This is not documented and can be changed in future, but
+// present under the same key in Win8.1/Win10/2016/2019
+static void RetrieveDisplayDefaults(DXGK_DISPLAY_INFORMATION& DispInfo)
+{
+    PAGED_CODE();
+    RTL_QUERY_REGISTRY_TABLE QueryTable[3] = {};
+    QueryTable[0].Flags = QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_TYPECHECK | RTL_QUERY_REGISTRY_REQUIRED;
+    QueryTable[0].DefaultType = QueryTable[1].DefaultType = REG_DWORD << 24;
+    QueryTable[0].Name = L"Height";
+    QueryTable[0].EntryContext = &DispInfo.Height;
+    QueryTable[1].Name = L"Width";
+    QueryTable[1].EntryContext = &DispInfo.Width;
+
+    NTSTATUS status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, L"BGFX", QueryTable, NULL, NULL);
+    if (NT_SUCCESS(status))
+    {
+        DbgPrint(TRACE_LEVEL_INFORMATION, ("%s: %dx%d\n", __FUNCTION__, DispInfo.Width, DispInfo.Height));
+    }
+    else
+    {
+        DbgPrint(TRACE_LEVEL_INFORMATION, ("%s: status = %X\n", __FUNCTION__, status));
+        DispInfo.Width = INITIAL_WIDTH;
+        DispInfo.Height = INITIAL_HEIGHT;
+    }
+    DispInfo.ColorFormat = D3DDDIFMT_X8R8G8B8;
+    DispInfo.Pitch = DispInfo.Width * BPPFromPixelFormat(DispInfo.ColorFormat) / BITS_PER_BYTE;
+    DispInfo.TargetId = DispInfo.AcpiId = 0;
+}
+
 NTSTATUS HwDeviceInterface::AcquireDisplayInfo(DXGK_DISPLAY_INFORMATION& DispInfo)
 {
     PAGED_CODE();
@@ -5188,11 +5219,7 @@ NTSTATUS HwDeviceInterface::AcquireDisplayInfo(DXGK_DISPLAY_INFORMATION& DispInf
     if (DispInfo.Width == 0)
     {
         DbgPrint(TRACE_LEVEL_WARNING, ("QxlDod::AcquireDisplayInfo has zero width!\n"));
-        DispInfo.ColorFormat = D3DDDIFMT_A8R8G8B8;
-        DispInfo.Width = INITIAL_WIDTH;
-        DispInfo.Height = INITIAL_HEIGHT;
-        DispInfo.Pitch = DispInfo.Width * BPPFromPixelFormat(DispInfo.ColorFormat) / BITS_PER_BYTE;
-        DispInfo.TargetId = 0;
+        RetrieveDisplayDefaults(DispInfo);
     }
     return Status;
 }
-- 
2.16.1.windows.4

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux Virtualization]     [Linux Virtualization]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]