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

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@daynix.com>
Acked-by: Marek Kedzierski <mkedzier@redhat.com>
This commit is contained in:
Yuri Benditovich 2019-01-25 09:48:52 +02:00 committed by Frediano Ziglio
parent 61193f9cab
commit 7f81d670e4

View File

@ -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) NTSTATUS HwDeviceInterface::AcquireDisplayInfo(DXGK_DISPLAY_INFORMATION& DispInfo)
{ {
PAGED_CODE(); PAGED_CODE();
@ -5188,11 +5219,7 @@ NTSTATUS HwDeviceInterface::AcquireDisplayInfo(DXGK_DISPLAY_INFORMATION& DispInf
if (DispInfo.Width == 0) if (DispInfo.Width == 0)
{ {
DbgPrint(TRACE_LEVEL_WARNING, ("QxlDod::AcquireDisplayInfo has zero width!\n")); DbgPrint(TRACE_LEVEL_WARNING, ("QxlDod::AcquireDisplayInfo has zero width!\n"));
DispInfo.ColorFormat = D3DDDIFMT_A8R8G8B8; RetrieveDisplayDefaults(DispInfo);
DispInfo.Width = INITIAL_WIDTH;
DispInfo.Height = INITIAL_HEIGHT;
DispInfo.Pitch = DispInfo.Width * BPPFromPixelFormat(DispInfo.ColorFormat) / BITS_PER_BYTE;
DispInfo.TargetId = 0;
} }
return Status; return Status;
} }