diff options
author | Sandy Stutsman <sstutsma@redhat.com> | 2015-10-30 15:50:55 -0400 |
---|---|---|
committer | Sandy Stutsman <sstutsma@redhat.com> | 2015-10-30 15:50:55 -0400 |
commit | 45a2f73a6c09f54ef418a8aa41593d05a06232bf (patch) | |
tree | 4cbf357df2dfab8e929e30e17afbf2f3d4ebc1c3 | |
parent | f8aed9bb4bee5b1c0b2e4458c999fa43b2ce0dbb (diff) |
On power wake call the init functions before setting the vidpn to black. Otherwise, BSOD.
-rwxr-xr-x | qxldod/QxlDod.cpp | 66 |
1 files 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;
}
|