[Spice-devel] [PATCH 4/7] qxl-wddm-dod: Enable VSync control for RS1 and Win8.1

Yuri Benditovich yuri.benditovich at daynix.com
Sun Feb 12 13:09:51 UTC 2017


Declare VSync control related procedure and set global
flag indicating VSync support for Win10 RS1 and Win8.1
For earlier builds of Win10 (TH1 and TH2) we do not
enable VSync to avoid problem when display is turned off
due to idle setting.

Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
---
 qxldod/driver.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 qxldod/driver.h   | 15 +++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/qxldod/driver.cpp b/qxldod/driver.cpp
index dc84aa8..d1c876c 100755
--- a/qxldod/driver.cpp
+++ b/qxldod/driver.cpp
@@ -32,6 +32,19 @@ DriverEntry(
 
     DbgPrint(TRACE_LEVEL_FATAL, ("---> KMDOD build on on %s %s\n", __DATE__, __TIME__));
 
+    RTL_OSVERSIONINFOW versionInfo;
+    versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
+
+
+    RtlGetVersion(&versionInfo);
+    if (versionInfo.dwBuildNumber >= 14393 || versionInfo.dwBuildNumber <= 9600)
+    {
+        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
     KMDDOD_INITIALIZATION_DATA InitialData = {0};
 
@@ -67,6 +80,11 @@ DriverEntry(
     InitialData.DxgkDdiStopDeviceAndReleasePostDisplayOwnership = DodStopDeviceAndReleasePostDisplayOwnership;
     InitialData.DxgkDdiSystemDisplayEnable          = DodSystemDisplayEnable;
     InitialData.DxgkDdiSystemDisplayWrite           = DodSystemDisplayWrite;
+    if (g_bSupportVSync)
+    {
+        InitialData.DxgkDdiControlInterrupt = DodControlInterrupt;
+        InitialData.DxgkDdiGetScanLine = DodGetScanLine;
+    }
 
     NTSTATUS Status = DxgkInitializeDisplayOnlyDriver(pDriverObject, pRegistryPath, &InitialData);
     if (!NT_SUCCESS(Status))
@@ -559,6 +577,40 @@ DodQueryVidPnHWCapability(
     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
 #pragma code_seg(pop)
 
diff --git a/qxldod/driver.h b/qxldod/driver.h
index 97b9415..2dcbda4 100755
--- a/qxldod/driver.h
+++ b/qxldod/driver.h
@@ -217,6 +217,21 @@ DodSystemDisplayWrite(
     _In_  UINT  PositionX,
     _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
 
 extern int nDebugLevel;
-- 
2.7.0.windows.1



More information about the Spice-devel mailing list