qxl-wddm-dod: Preparation for VSync activation
Prepare all the procedures needed for VSync feature but do not turn it on yet. Manual uncomment still required to enable it. Advanced users may enable VSync feature and report functional problem with it. The driver is expected to pass all the formal tests under HLK 1607 with device rev.3 and rev.4 but with device rev.4 on setups with high load or long round-trip delay video system may detect timeout during rendering operation and disable the driver with error 43. Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com> Acked-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
parent
db40bfd439
commit
c0506bcf5d
@ -32,6 +32,31 @@ DriverEntry(
|
|||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_FATAL, ("---> KMDOD build on on %s %s\n", __DATE__, __TIME__));
|
DbgPrint(TRACE_LEVEL_FATAL, ("---> KMDOD build on on %s %s\n", __DATE__, __TIME__));
|
||||||
|
|
||||||
|
RTL_OSVERSIONINFOW versionInfo;
|
||||||
|
versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
|
||||||
|
|
||||||
|
RtlGetVersion(&versionInfo);
|
||||||
|
|
||||||
|
// VSync control is NOT planned to be enabled on Win10 builds
|
||||||
|
// before RS1. Enabling it on DOD driver causes OS to stop the driver
|
||||||
|
// with error 43 when the system turns off display due to idle setting.
|
||||||
|
// On Windows 8.1 (9200 and 9600) till now no problem observed
|
||||||
|
// (OS does not send VSync enable command)
|
||||||
|
// On Windows 10RS1 (14393) enabling VSync control activates
|
||||||
|
// watchdog policy and creates high sensitivity to long (> 2 sec)
|
||||||
|
// processing in PresentDisplayOnly callback (stop with error 43)
|
||||||
|
|
||||||
|
if (versionInfo.dwBuildNumber >= 14393 || versionInfo.dwBuildNumber <= 9600)
|
||||||
|
{
|
||||||
|
// we will uncomment the line below after we address all the problems
|
||||||
|
// related to enabled VSync control in Win10RS1
|
||||||
|
|
||||||
|
//g_bSupportVSync = TRUE;
|
||||||
|
}
|
||||||
|
DbgPrint(TRACE_LEVEL_WARNING, ("VSync support %sabled for %d.%d.%d\n",
|
||||||
|
g_bSupportVSync ? "en" : "dis",
|
||||||
|
versionInfo.dwMajorVersion, versionInfo.dwMinorVersion, versionInfo.dwBuildNumber));
|
||||||
|
|
||||||
// Initialize DDI function pointers and dxgkrnl
|
// Initialize DDI function pointers and dxgkrnl
|
||||||
KMDDOD_INITIALIZATION_DATA InitialData = {0};
|
KMDDOD_INITIALIZATION_DATA InitialData = {0};
|
||||||
|
|
||||||
@ -67,6 +92,11 @@ DriverEntry(
|
|||||||
InitialData.DxgkDdiStopDeviceAndReleasePostDisplayOwnership = DodStopDeviceAndReleasePostDisplayOwnership;
|
InitialData.DxgkDdiStopDeviceAndReleasePostDisplayOwnership = DodStopDeviceAndReleasePostDisplayOwnership;
|
||||||
InitialData.DxgkDdiSystemDisplayEnable = DodSystemDisplayEnable;
|
InitialData.DxgkDdiSystemDisplayEnable = DodSystemDisplayEnable;
|
||||||
InitialData.DxgkDdiSystemDisplayWrite = DodSystemDisplayWrite;
|
InitialData.DxgkDdiSystemDisplayWrite = DodSystemDisplayWrite;
|
||||||
|
if (g_bSupportVSync)
|
||||||
|
{
|
||||||
|
InitialData.DxgkDdiControlInterrupt = DodControlInterrupt;
|
||||||
|
InitialData.DxgkDdiGetScanLine = DodGetScanLine;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS Status = DxgkInitializeDisplayOnlyDriver(pDriverObject, pRegistryPath, &InitialData);
|
NTSTATUS Status = DxgkInitializeDisplayOnlyDriver(pDriverObject, pRegistryPath, &InitialData);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
@ -559,6 +589,40 @@ DodQueryVidPnHWCapability(
|
|||||||
return pQxl->QueryVidPnHWCapability(pVidPnHWCaps);
|
return pQxl->QueryVidPnHWCapability(pVidPnHWCaps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
APIENTRY
|
||||||
|
DodControlInterrupt(
|
||||||
|
IN_CONST_HANDLE hAdapter,
|
||||||
|
IN_CONST_DXGK_INTERRUPT_TYPE InterruptType,
|
||||||
|
IN_BOOLEAN EnableInterrupt
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
QxlDod* pQxl = reinterpret_cast<QxlDod*>(hAdapter);
|
||||||
|
if (InterruptType == DXGK_INTERRUPT_DISPLAYONLY_VSYNC)
|
||||||
|
{
|
||||||
|
pQxl->EnableVsync(EnableInterrupt);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
APIENTRY
|
||||||
|
DodGetScanLine(
|
||||||
|
IN_CONST_HANDLE hAdapter,
|
||||||
|
INOUT_PDXGKARG_GETSCANLINE pGetScanLine
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
// Currently we do not see any practical use case when this procedure is called
|
||||||
|
// IDirectDraw has an interface for querying scan line
|
||||||
|
// Leave it not implemented like remote desktop does
|
||||||
|
// until we recognize use case for more intelligent implementation
|
||||||
|
DbgPrint(TRACE_LEVEL_ERROR, ("<---> %s\n", __FUNCTION__));
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
//END: Paged Code
|
//END: Paged Code
|
||||||
#pragma code_seg(pop)
|
#pragma code_seg(pop)
|
||||||
|
|
||||||
|
@ -217,6 +217,21 @@ DodSystemDisplayWrite(
|
|||||||
_In_ UINT PositionX,
|
_In_ UINT PositionX,
|
||||||
_In_ UINT PositionY);
|
_In_ UINT PositionY);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
APIENTRY
|
||||||
|
DodControlInterrupt(
|
||||||
|
IN_CONST_HANDLE hAdapter,
|
||||||
|
IN_CONST_DXGK_INTERRUPT_TYPE InterruptType,
|
||||||
|
IN_BOOLEAN EnableInterrupt
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
APIENTRY
|
||||||
|
DodGetScanLine(
|
||||||
|
IN_CONST_HANDLE hAdapter,
|
||||||
|
INOUT_PDXGKARG_GETSCANLINE pGetScanLine
|
||||||
|
);
|
||||||
|
|
||||||
#if DBG
|
#if DBG
|
||||||
|
|
||||||
extern int nDebugLevel;
|
extern int nDebugLevel;
|
||||||
|
Loading…
Reference in New Issue
Block a user