[Spice-devel] [RFC PATCH qxl-wddm-dod 07/28] On power wake call the init functions before setting the vidpn to black. Otherwise, BSOD.
Dmitry Fleytman
dmitry at daynix.com
Mon Jul 18 06:33:48 UTC 2016
From: Sandy Stutsman <sstutsma at redhat.com>
---
qxldod/QxlDod.cpp | 66 ++++++++++++++++++++++++++++---------------------------
1 file changed, 34 insertions(+), 32 deletions(-)
diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
index ec960e5..9d13934 100755
--- a/qxldod/QxlDod.cpp
+++ b/qxldod/QxlDod.cpp
@@ -284,12 +284,16 @@ NTSTATUS QxlDod::SetPowerState(_In_ ULONG HardwareUid,
_In_ DEVICE_POWER_STATE DevicePowerState,
_In_ POWER_ACTION ActionType)
{
+ NTSTATUS Status(STATUS_SUCCESS);
PAGED_CODE();
DbgPrint(TRACE_LEVEL_INFORMATION, ("---> %s HardwareUid = 0x%x ActionType = %s DevicePowerState = %s AdapterPowerState = %s\n", __FUNCTION__, HardwareUid, DbgPowerActionString(ActionType), DbgDevicePowerString(DevicePowerState), DbgDevicePowerString(m_AdapterPowerState)));
if (HardwareUid == DISPLAY_ADAPTER_HW_ID)
{
- if (DevicePowerState == PowerDeviceD0)
+ // There is nothing to do to specifically power up/down the display adapter
+ Status = m_pHWDevice->SetPowerState(DevicePowerState, &(m_CurrentModes[0].DispInfo));
+
+ if (NT_SUCCESS(Status) && DevicePowerState == PowerDeviceD0)
{
// When returning from D3 the device visibility defined to be off for all targets
@@ -305,12 +309,10 @@ NTSTATUS QxlDod::SetPowerState(_In_ ULONG HardwareUid,
// Store new adapter power state
m_AdapterPowerState = DevicePowerState;
- // There is nothing to do to specifically power up/down the display adapter
- return m_pHWDevice->SetPowerState(DevicePowerState, &(m_CurrentModes[0].DispInfo));
}
// TODO: This is where the specified monitor should be powered up/down
- return STATUS_SUCCESS;
+ return Status;
}
NTSTATUS QxlDod::QueryChildRelations(_Out_writes_bytes_(ChildRelationsSize) DXGK_CHILD_DESCRIPTOR* pChildRelations,
@@ -2977,10 +2979,10 @@ BOOL QxlDevice::SetVideoModeInfo(UINT Idx, QXLMode* pModeInfo)
void QxlDevice::UpdateVideoModeInfo(UINT Idx, UINT xres, UINT yres, UINT bpp)
{
PVIDEO_MODE_INFORMATION pMode = NULL;
- UINT bytes_pp = (bpp + 7) / 8;
+ UINT bytes_pp = (bpp + 7) / 8;
ULONG color_bits;
PAGED_CODE();
-
+
pMode = &m_ModeInfo[Idx];
pMode->VisScreenWidth = xres;
pMode->VisScreenHeight = yres;
@@ -4400,39 +4402,39 @@ NTSTATUS QxlDevice::Escape(_In_ CONST DXGKARG_ESCAPE* pEscap)
{
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
QXLEscapeSetCustomDisplay *custom_display;
- UINT xres;
- UINT yres;
- UINT bpp;
+ UINT xres;
+ UINT yres;
+ UINT bpp;
if (pEscap->PrivateDriverDataSize != sizeof(QXLEscapeSetCustomDisplay)) {
DbgPrint(TRACE_LEVEL_ERROR, ("<--> %s Incorrect buffer size %d instead of %d\n", __FUNCTION__, pEscap->PrivateDriverDataSize, sizeof(QXLEscapeSetCustomDisplay)));
return STATUS_INVALID_BUFFER_SIZE;
}
custom_display = (QXLEscapeSetCustomDisplay*)pEscap->pPrivateDriverData;
- xres = custom_display->xres & ~0x3;
- yres = custom_display->yres & ~0x3;
- bpp = custom_display->bpp;
- if (bpp != QXL_BPP)
- {
- bpp = QXL_BPP;
- }
- if (xres < MIN_WIDTH_SIZE || yres < MIN_HEIGHT_SIZE)
- {
+ xres = custom_display->xres & ~0x3;
+ yres = custom_display->yres & ~0x3;
+ bpp = custom_display->bpp;
+ if (bpp != QXL_BPP)
+ {
+ bpp = QXL_BPP;
+ }
+ if (xres < MIN_WIDTH_SIZE || yres < MIN_HEIGHT_SIZE)
+ {
DbgPrint(TRACE_LEVEL_ERROR, ("%s: xres = %d, yres = %d\n", __FUNCTION__, xres, yres));
- return ERROR_INVALID_DATA;
- }
-
- if (m_CustomMode == (m_ModeCount - 1))
- m_CustomMode = (USHORT)(m_ModeCount - 2);
- else
- m_CustomMode = (USHORT)(m_ModeCount - 1);
-
- if ((xres * yres * bpp / 8) > m_RomHdr->surface0_area_size) {
- DbgPrint(TRACE_LEVEL_ERROR, ("%s: Mode (%dx%d#%d) doesn't fit in memory (%d)\n",
- __FUNCTION__, xres, yres, bpp, m_RomHdr->surface0_area_size));
- return STATUS_INVALID_PARAMETER;
- }
- UpdateVideoModeInfo(m_CustomMode, xres, yres, bpp);
+ return ERROR_INVALID_DATA;
+ }
+
+ if (m_CustomMode == (m_ModeCount - 1))
+ m_CustomMode = (USHORT)(m_ModeCount - 2);
+ else
+ m_CustomMode = (USHORT)(m_ModeCount - 1);
+
+ if ((xres * yres * bpp / 8) > m_RomHdr->surface0_area_size) {
+ DbgPrint(TRACE_LEVEL_ERROR, ("%s: Mode (%dx%d#%d) doesn't fit in memory (%d)\n",
+ __FUNCTION__, xres, yres, bpp, m_RomHdr->surface0_area_size));
+ return STATUS_INVALID_PARAMETER;
+ }
+ UpdateVideoModeInfo(m_CustomMode, xres, yres, bpp);
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
return STATUS_SUCCESS;
}
--
1.8.3.1
More information about the Spice-devel
mailing list