[Spice-devel] [PATCH qxl-wddm-dod 08/26] On power wake call the init functions before setting the vidpn to black. Otherwise, BSOD.
Frediano Ziglio
fziglio at redhat.com
Tue Aug 30 13:42:17 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;
>
this should not only be set if Status is successful?
> - // 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;
Please remove these space changes.
> @@ -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;
> }
Same here.
Frediano
More information about the Spice-devel
mailing list