more qxl bits
This commit is contained in:
parent
4947c22618
commit
08a8760977
@ -85,7 +85,7 @@ NTSTATUS QxlDod::StartDevice(_In_ DXGK_START_INFO* pDxgkStartInfo,
|
|||||||
RtlCopyMemory(&m_DxgkInterface, pDxgkInterface, sizeof(m_DxgkInterface));
|
RtlCopyMemory(&m_DxgkInterface, pDxgkInterface, sizeof(m_DxgkInterface));
|
||||||
RtlZeroMemory(m_CurrentModes, sizeof(m_CurrentModes));
|
RtlZeroMemory(m_CurrentModes, sizeof(m_CurrentModes));
|
||||||
//CHECK ME!!!!!!!!!!!!!
|
//CHECK ME!!!!!!!!!!!!!
|
||||||
m_CurrentModes[0].DispInfo.TargetId = D3DDDI_ID_UNINITIALIZED;
|
m_CurrentModes[0].DispInfo.TargetId = D3DDDI_ID_UNINITIALIZED;
|
||||||
// Get device information from OS.
|
// Get device information from OS.
|
||||||
NTSTATUS Status = m_DxgkInterface.DxgkCbGetDeviceInformation(m_DxgkInterface.DeviceHandle, &m_DeviceInfo);
|
NTSTATUS Status = m_DxgkInterface.DxgkCbGetDeviceInformation(m_DxgkInterface.DeviceHandle, &m_DeviceInfo);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
@ -120,7 +120,7 @@ NTSTATUS QxlDod::StartDevice(_In_ DXGK_START_INFO* pDxgkStartInfo,
|
|||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = m_pHWDevice->HWInit(m_DeviceInfo.TranslatedResourceList);
|
Status = m_pHWDevice->HWInit(m_DeviceInfo.TranslatedResourceList, &m_CurrentModes[0].DispInfo);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
QXL_LOG_ASSERTION1("HWInit failed with status 0x%X\n",
|
QXL_LOG_ASSERTION1("HWInit failed with status 0x%X\n",
|
||||||
@ -128,14 +128,6 @@ NTSTATUS QxlDod::StartDevice(_In_ DXGK_START_INFO* pDxgkStartInfo,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = m_pHWDevice->GetModeList(&m_CurrentModes[0].DispInfo);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
QXL_LOG_ASSERTION1("GetModeList failed with status 0x%X\n",
|
|
||||||
Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
*pNumberOfViews = MAX_VIEWS;
|
*pNumberOfViews = MAX_VIEWS;
|
||||||
*pNumberOfChildren = MAX_CHILDREN;
|
*pNumberOfChildren = MAX_CHILDREN;
|
||||||
m_Flags.DriverStarted = TRUE;
|
m_Flags.DriverStarted = TRUE;
|
||||||
@ -691,7 +683,7 @@ NTSTATUS QxlDod::AddSingleSourceMode(_In_ CONST DXGK_VIDPNSOURCEMODESET_INTERFAC
|
|||||||
{
|
{
|
||||||
// Create new mode info that will be populated
|
// Create new mode info that will be populated
|
||||||
D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo = NULL;
|
D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo = NULL;
|
||||||
PVBE_MODEINFO pModeInfo = m_pHWDevice->GetModeInfo(idx);
|
PVIDEO_MODE_INFORMATION pModeInfo = m_pHWDevice->GetModeInfo(idx);
|
||||||
NTSTATUS Status = pVidPnSourceModeSetInterface->pfnCreateNewModeInfo(hVidPnSourceModeSet, &pVidPnSourceModeInfo);
|
NTSTATUS Status = pVidPnSourceModeSetInterface->pfnCreateNewModeInfo(hVidPnSourceModeSet, &pVidPnSourceModeInfo);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
@ -703,10 +695,10 @@ NTSTATUS QxlDod::AddSingleSourceMode(_In_ CONST DXGK_VIDPNSOURCEMODESET_INTERFAC
|
|||||||
// Populate mode info with values from current mode and hard-coded values
|
// Populate mode info with values from current mode and hard-coded values
|
||||||
// Always report 32 bpp format, this will be color converted during the present if the mode is < 32bpp
|
// Always report 32 bpp format, this will be color converted during the present if the mode is < 32bpp
|
||||||
pVidPnSourceModeInfo->Type = D3DKMDT_RMT_GRAPHICS;
|
pVidPnSourceModeInfo->Type = D3DKMDT_RMT_GRAPHICS;
|
||||||
pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx = pModeInfo->XResolution;
|
pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx = pModeInfo->VisScreenWidth;
|
||||||
pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy = pModeInfo->YResolution;
|
pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy = pModeInfo->VisScreenHeight;
|
||||||
pVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize = pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize;
|
pVidPnSourceModeInfo->Format.Graphics.VisibleRegionSize = pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize;
|
||||||
pVidPnSourceModeInfo->Format.Graphics.Stride = pModeInfo->BytesPerScanLine / pModeInfo->XResolution;
|
pVidPnSourceModeInfo->Format.Graphics.Stride = pModeInfo->ScreenStride;
|
||||||
pVidPnSourceModeInfo->Format.Graphics.PixelFormat = D3DDDIFMT_A8R8G8B8;
|
pVidPnSourceModeInfo->Format.Graphics.PixelFormat = D3DDDIFMT_A8R8G8B8;
|
||||||
pVidPnSourceModeInfo->Format.Graphics.ColorBasis = D3DKMDT_CB_SCRGB;
|
pVidPnSourceModeInfo->Format.Graphics.ColorBasis = D3DKMDT_CB_SCRGB;
|
||||||
pVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode = D3DKMDT_PVAM_DIRECT;
|
pVidPnSourceModeInfo->Format.Graphics.PixelValueAccessMode = D3DKMDT_PVAM_DIRECT;
|
||||||
@ -747,7 +739,7 @@ NTSTATUS QxlDod::AddSingleTargetMode(_In_ CONST DXGK_VIDPNTARGETMODESET_INTERFAC
|
|||||||
//FIXME !!!!!!
|
//FIXME !!!!!!
|
||||||
for (UINT ModeIndex = 0; ModeIndex < m_pHWDevice->GetModeCount(); ++ModeIndex)
|
for (UINT ModeIndex = 0; ModeIndex < m_pHWDevice->GetModeCount(); ++ModeIndex)
|
||||||
{
|
{
|
||||||
PVBE_MODEINFO pModeInfo = m_pHWDevice->GetModeInfo(SourceId);
|
PVIDEO_MODE_INFORMATION pModeInfo = m_pHWDevice->GetModeInfo(SourceId);
|
||||||
pVidPnTargetModeInfo = NULL;
|
pVidPnTargetModeInfo = NULL;
|
||||||
Status = pVidPnTargetModeSetInterface->pfnCreateNewModeInfo(hVidPnTargetModeSet, &pVidPnTargetModeInfo);
|
Status = pVidPnTargetModeSetInterface->pfnCreateNewModeInfo(hVidPnTargetModeSet, &pVidPnTargetModeInfo);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
@ -757,8 +749,8 @@ NTSTATUS QxlDod::AddSingleTargetMode(_In_ CONST DXGK_VIDPNTARGETMODESET_INTERFAC
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
pVidPnTargetModeInfo->VideoSignalInfo.VideoStandard = D3DKMDT_VSS_OTHER;
|
pVidPnTargetModeInfo->VideoSignalInfo.VideoStandard = D3DKMDT_VSS_OTHER;
|
||||||
pVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cx = pModeInfo->XResolution;
|
pVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cx = pModeInfo->VisScreenWidth;
|
||||||
pVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy = pModeInfo->YResolution;
|
pVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy = pModeInfo->VisScreenHeight;
|
||||||
pVidPnTargetModeInfo->VideoSignalInfo.ActiveSize = pVidPnTargetModeInfo->VideoSignalInfo.TotalSize;
|
pVidPnTargetModeInfo->VideoSignalInfo.ActiveSize = pVidPnTargetModeInfo->VideoSignalInfo.TotalSize;
|
||||||
pVidPnTargetModeInfo->VideoSignalInfo.VSyncFreq.Numerator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
pVidPnTargetModeInfo->VideoSignalInfo.VSyncFreq.Numerator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
||||||
pVidPnTargetModeInfo->VideoSignalInfo.VSyncFreq.Denominator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
pVidPnTargetModeInfo->VideoSignalInfo.VSyncFreq.Denominator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
||||||
@ -792,7 +784,7 @@ NTSTATUS QxlDod::AddSingleMonitorMode(_In_ CONST DXGKARG_RECOMMENDMONITORMODES*
|
|||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
D3DKMDT_MONITOR_SOURCE_MODE* pMonitorSourceMode = NULL;
|
D3DKMDT_MONITOR_SOURCE_MODE* pMonitorSourceMode = NULL;
|
||||||
PVBE_MODEINFO pVbeModeInfo = NULL;
|
PVIDEO_MODE_INFORMATION pVbeModeInfo = NULL;
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
|
|
||||||
@ -804,12 +796,12 @@ NTSTATUS QxlDod::AddSingleMonitorMode(_In_ CONST DXGKARG_RECOMMENDMONITORMODES*
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
pVbeModeInfo = m_pHWDevice->GetModeInfo(m_pHWDevice->GetCurrentModeIndex());//&m_ModeInfo[m_CurrentMode];
|
pVbeModeInfo = m_pHWDevice->GetModeInfo(m_pHWDevice->GetCurrentModeIndex());
|
||||||
|
|
||||||
// Since we don't know the real monitor timing information, just use the current display mode (from the POST device) with unknown frequencies
|
// Since we don't know the real monitor timing information, just use the current display mode (from the POST device) with unknown frequencies
|
||||||
pMonitorSourceMode->VideoSignalInfo.VideoStandard = D3DKMDT_VSS_OTHER;
|
pMonitorSourceMode->VideoSignalInfo.VideoStandard = D3DKMDT_VSS_OTHER;
|
||||||
pMonitorSourceMode->VideoSignalInfo.TotalSize.cx = pVbeModeInfo->XResolution;
|
pMonitorSourceMode->VideoSignalInfo.TotalSize.cx = pVbeModeInfo->VisScreenWidth;
|
||||||
pMonitorSourceMode->VideoSignalInfo.TotalSize.cy = pVbeModeInfo->YResolution;
|
pMonitorSourceMode->VideoSignalInfo.TotalSize.cy = pVbeModeInfo->VisScreenHeight;
|
||||||
pMonitorSourceMode->VideoSignalInfo.ActiveSize = pMonitorSourceMode->VideoSignalInfo.TotalSize;
|
pMonitorSourceMode->VideoSignalInfo.ActiveSize = pMonitorSourceMode->VideoSignalInfo.TotalSize;
|
||||||
pMonitorSourceMode->VideoSignalInfo.VSyncFreq.Numerator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
pMonitorSourceMode->VideoSignalInfo.VSyncFreq.Numerator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
||||||
pMonitorSourceMode->VideoSignalInfo.VSyncFreq.Denominator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
pMonitorSourceMode->VideoSignalInfo.VSyncFreq.Denominator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
||||||
@ -864,12 +856,12 @@ NTSTATUS QxlDod::AddSingleMonitorMode(_In_ CONST DXGKARG_RECOMMENDMONITORMODES*
|
|||||||
|
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_INFORMATION, ("%s: add pref mode, dimensions %ux%u, taken from DxgkCbAcquirePostDisplayOwnership at StartDevice\n", __FUNCTION__,
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("%s: add pref mode, dimensions %ux%u, taken from DxgkCbAcquirePostDisplayOwnership at StartDevice\n", __FUNCTION__,
|
||||||
pVbeModeInfo->XResolution, pVbeModeInfo->YResolution));
|
pVbeModeInfo->VisScreenWidth, pVbeModeInfo->VisScreenHeight));
|
||||||
|
|
||||||
// Since we don't know the real monitor timing information, just use the current display mode (from the POST device) with unknown frequencies
|
// Since we don't know the real monitor timing information, just use the current display mode (from the POST device) with unknown frequencies
|
||||||
pMonitorSourceMode->VideoSignalInfo.VideoStandard = D3DKMDT_VSS_OTHER;
|
pMonitorSourceMode->VideoSignalInfo.VideoStandard = D3DKMDT_VSS_OTHER;
|
||||||
pMonitorSourceMode->VideoSignalInfo.TotalSize.cx = pVbeModeInfo->XResolution;
|
pMonitorSourceMode->VideoSignalInfo.TotalSize.cx = pVbeModeInfo->VisScreenWidth;
|
||||||
pMonitorSourceMode->VideoSignalInfo.TotalSize.cy = pVbeModeInfo->YResolution;
|
pMonitorSourceMode->VideoSignalInfo.TotalSize.cy = pVbeModeInfo->VisScreenHeight;
|
||||||
pMonitorSourceMode->VideoSignalInfo.ActiveSize = pMonitorSourceMode->VideoSignalInfo.TotalSize;
|
pMonitorSourceMode->VideoSignalInfo.ActiveSize = pMonitorSourceMode->VideoSignalInfo.TotalSize;
|
||||||
pMonitorSourceMode->VideoSignalInfo.VSyncFreq.Numerator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
pMonitorSourceMode->VideoSignalInfo.VSyncFreq.Numerator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
||||||
pMonitorSourceMode->VideoSignalInfo.VSyncFreq.Denominator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
pMonitorSourceMode->VideoSignalInfo.VSyncFreq.Denominator = D3DKMDT_FREQUENCY_NOTSPECIFIED;
|
||||||
@ -1524,9 +1516,9 @@ NTSTATUS QxlDod::SetSourceModeAndPath(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMo
|
|||||||
pCurrentBddMode->Flags.FullscreenPresent = TRUE;
|
pCurrentBddMode->Flags.FullscreenPresent = TRUE;
|
||||||
for (USHORT ModeIndex = 0; ModeIndex < m_pHWDevice->GetModeCount(); ++ModeIndex)
|
for (USHORT ModeIndex = 0; ModeIndex < m_pHWDevice->GetModeCount(); ++ModeIndex)
|
||||||
{
|
{
|
||||||
PVBE_MODEINFO pModeInfo = m_pHWDevice->GetModeInfo(m_pHWDevice->GetCurrentModeIndex());
|
PVIDEO_MODE_INFORMATION pModeInfo = m_pHWDevice->GetModeInfo(m_pHWDevice->GetCurrentModeIndex());
|
||||||
if (pCurrentBddMode->DispInfo.Width == pModeInfo->XResolution &&
|
if (pCurrentBddMode->DispInfo.Width == pModeInfo->VisScreenWidth &&
|
||||||
pCurrentBddMode->DispInfo.Height == pModeInfo->YResolution )
|
pCurrentBddMode->DispInfo.Height == pModeInfo->VisScreenHeight )
|
||||||
{
|
{
|
||||||
Status = m_pHWDevice->SetCurrentMode(m_pHWDevice->GetModeNumber(ModeIndex));
|
Status = m_pHWDevice->SetCurrentMode(m_pHWDevice->GetModeNumber(ModeIndex));
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
@ -1944,13 +1936,12 @@ QxlDod::ExecutePresentDisplayOnly(
|
|||||||
|
|
||||||
RtlZeroMemory(ctx,size);
|
RtlZeroMemory(ctx,size);
|
||||||
|
|
||||||
// const CURRENT_BDD_MODE* pModeCur = GetCurrentMode(m_SourceId);
|
|
||||||
const CURRENT_BDD_MODE* pModeCur = &m_CurrentModes[0];
|
const CURRENT_BDD_MODE* pModeCur = &m_CurrentModes[0];
|
||||||
ctx->DstAddr = DstAddr;
|
ctx->DstAddr = DstAddr;
|
||||||
ctx->DstBitPerPixel = DstBitPerPixel;
|
ctx->DstBitPerPixel = DstBitPerPixel;
|
||||||
ctx->DstStride = pModeCur->DispInfo.Pitch; //m_ModeInfo[m_CurrentMode].BytesPerScanLine;//
|
ctx->DstStride = pModeCur->DispInfo.Pitch;
|
||||||
ctx->SrcWidth = pModeCur->SrcModeWidth;//m_ModeInfo[m_CurrentMode].XResolution;//
|
ctx->SrcWidth = pModeCur->SrcModeWidth;
|
||||||
ctx->SrcHeight = pModeCur->SrcModeHeight;//m_ModeInfo[m_CurrentMode].YResolution;//
|
ctx->SrcHeight = pModeCur->SrcModeHeight;
|
||||||
ctx->SrcAddr = NULL;
|
ctx->SrcAddr = NULL;
|
||||||
ctx->SrcPitch = SrcPitch;
|
ctx->SrcPitch = SrcPitch;
|
||||||
ctx->Rotation = Rotation;
|
ctx->Rotation = Rotation;
|
||||||
@ -2477,6 +2468,43 @@ VgaDevice::~VgaDevice(void)
|
|||||||
m_ModeCount = 0;
|
m_ModeCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL VgaDevice::SetVideoModeInfo(UINT Idx, PVBE_MODEINFO pModeInfo)
|
||||||
|
{
|
||||||
|
PVIDEO_MODE_INFORMATION pMode = NULL;
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
pMode = &m_ModeInfo[Idx];
|
||||||
|
pMode->Length = sizeof(VIDEO_MODE_INFORMATION);
|
||||||
|
pMode->ModeIndex = Idx;//m_ModeNumbers[Idx];
|
||||||
|
pMode->VisScreenWidth = pModeInfo->XResolution;
|
||||||
|
pMode->VisScreenHeight = pModeInfo->YResolution;
|
||||||
|
pMode->ScreenStride = pModeInfo->LinBytesPerScanLine;
|
||||||
|
pMode->NumberOfPlanes = pModeInfo->NumberOfPlanes;
|
||||||
|
pMode->BitsPerPlane = pModeInfo->BitsPerPixel / pModeInfo->NumberOfPlanes;
|
||||||
|
pMode->Frequency = 60;
|
||||||
|
pMode->XMillimeter = pModeInfo->XResolution * 254 / 720;
|
||||||
|
pMode->YMillimeter = pModeInfo->YResolution * 254 / 720;
|
||||||
|
|
||||||
|
if (pModeInfo->BitsPerPixel == 15 && pModeInfo->NumberOfPlanes == 1)
|
||||||
|
{
|
||||||
|
pMode->BitsPerPlane = 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
pMode->NumberRedBits = pModeInfo->LinRedMaskSize;
|
||||||
|
pMode->NumberGreenBits = pModeInfo->LinGreenMaskSize;
|
||||||
|
pMode->NumberBlueBits = pModeInfo->LinBlueMaskSize;
|
||||||
|
pMode->RedMask = ((1 << pModeInfo->LinRedMaskSize) - 1) << pModeInfo->LinRedFieldPosition;
|
||||||
|
pMode->GreenMask = ((1 << pModeInfo->LinGreenMaskSize) - 1) << pModeInfo->LinGreenFieldPosition;
|
||||||
|
pMode->BlueMask = ((1 << pModeInfo->LinBlueMaskSize) - 1) << pModeInfo->LinBlueFieldPosition;
|
||||||
|
|
||||||
|
pMode->AttributeFlags = VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_NO_OFF_SCREEN;
|
||||||
|
pMode->VideoMemoryBitmapWidth = pModeInfo->XResolution;
|
||||||
|
pMode->VideoMemoryBitmapHeight = pModeInfo->YResolution;
|
||||||
|
pMode->DriverSpecificAttributeFlags = 0;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
@ -2486,9 +2514,9 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
ULONG SuitableModeCount;
|
ULONG SuitableModeCount;
|
||||||
USHORT ModeTemp;
|
USHORT ModeTemp;
|
||||||
USHORT CurrentMode;
|
USHORT CurrentMode;
|
||||||
PVBE_MODEINFO VbeModeInfo;
|
|
||||||
VBE_INFO VbeInfo = {0};
|
VBE_INFO VbeInfo = {0};
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
|
VBE_MODEINFO tmpModeInfo;
|
||||||
|
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
@ -2560,7 +2588,7 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("ModeCount %d\n", ModeCount));
|
DbgPrint(TRACE_LEVEL_ERROR, ("ModeCount %d\n", ModeCount));
|
||||||
|
|
||||||
m_ModeInfo = reinterpret_cast<PVBE_MODEINFO> (new (PagedPool) BYTE[sizeof (VBE_MODEINFO) * ModeCount]);
|
m_ModeInfo = reinterpret_cast<PVIDEO_MODE_INFORMATION> (new (PagedPool) BYTE[sizeof (VIDEO_MODE_INFORMATION) * ModeCount]);
|
||||||
m_ModeNumbers = reinterpret_cast<PUSHORT> (new (PagedPool) BYTE [sizeof (USHORT) * ModeCount]);
|
m_ModeNumbers = reinterpret_cast<PUSHORT> (new (PagedPool) BYTE [sizeof (USHORT) * ModeCount]);
|
||||||
m_CurrentMode = 0;
|
m_CurrentMode = 0;
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("m_ModeInfo = 0x%p, m_ModeNumbers = 0x%p\n", m_ModeInfo, m_ModeNumbers));
|
DbgPrint(TRACE_LEVEL_ERROR, ("m_ModeInfo = 0x%p, m_ModeNumbers = 0x%p\n", m_ModeInfo, m_ModeNumbers));
|
||||||
@ -2594,22 +2622,22 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
Status = x86BiosReadMemory (
|
Status = x86BiosReadMemory (
|
||||||
m_Segment,
|
m_Segment,
|
||||||
m_Offset + sizeof (VbeInfo),
|
m_Offset + sizeof (VbeInfo),
|
||||||
m_ModeInfo + SuitableModeCount,
|
&tmpModeInfo,
|
||||||
sizeof(VBE_MODEINFO));
|
sizeof(VBE_MODEINFO));
|
||||||
|
|
||||||
VbeModeInfo = m_ModeInfo + SuitableModeCount;
|
|
||||||
UINT Height = pDispInfo->Height;
|
UINT Height = pDispInfo->Height;
|
||||||
UINT Width = pDispInfo->Width;
|
UINT Width = pDispInfo->Width;
|
||||||
UINT BitsPerPixel = BPPFromPixelFormat(pDispInfo->ColorFormat);
|
UINT BitsPerPixel = BPPFromPixelFormat(pDispInfo->ColorFormat);
|
||||||
|
|
||||||
if (VbeModeInfo->XResolution >= Width &&
|
if (tmpModeInfo.XResolution >= Width &&
|
||||||
VbeModeInfo->YResolution >= Height &&
|
tmpModeInfo.YResolution >= Height &&
|
||||||
VbeModeInfo->BitsPerPixel == BitsPerPixel &&
|
tmpModeInfo.BitsPerPixel == BitsPerPixel &&
|
||||||
VbeModeInfo->PhysBasePtr != 0)
|
tmpModeInfo.PhysBasePtr != 0)
|
||||||
{
|
{
|
||||||
m_ModeNumbers[SuitableModeCount] = ModeTemp;
|
m_ModeNumbers[SuitableModeCount] = ModeTemp;
|
||||||
if (VbeModeInfo->XResolution == 1024 &&
|
SetVideoModeInfo(SuitableModeCount, &tmpModeInfo);
|
||||||
VbeModeInfo->YResolution == 768)
|
if (tmpModeInfo.XResolution == 1024 &&
|
||||||
|
tmpModeInfo.YResolution == 768)
|
||||||
{
|
{
|
||||||
m_CurrentMode = (USHORT)SuitableModeCount;
|
m_CurrentMode = (USHORT)SuitableModeCount;
|
||||||
}
|
}
|
||||||
@ -2629,9 +2657,9 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
{
|
{
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("type %x, XRes = %d, YRes = %d, BPP = %d\n",
|
DbgPrint(TRACE_LEVEL_ERROR, ("type %x, XRes = %d, YRes = %d, BPP = %d\n",
|
||||||
m_ModeNumbers[idx],
|
m_ModeNumbers[idx],
|
||||||
m_ModeInfo[idx].XResolution,
|
m_ModeInfo[idx].VisScreenWidth,
|
||||||
m_ModeInfo[idx].YResolution,
|
m_ModeInfo[idx].VisScreenHeight,
|
||||||
m_ModeInfo[idx].BitsPerPixel));
|
m_ModeInfo[idx].BitsPerPlane));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_Segment != 0)
|
if (m_Segment != 0)
|
||||||
@ -2684,11 +2712,18 @@ NTSTATUS VgaDevice::GetCurrentMode(ULONG* pMode)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS VgaDevice::HWInit(PCM_RESOURCE_LIST pResList)
|
NTSTATUS VgaDevice::HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo)
|
||||||
{
|
{
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
UNREFERENCED_PARAMETER(pResList);
|
UNREFERENCED_PARAMETER(pResList);
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
||||||
|
return GetModeList(pDispInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS VgaDevice::HWClose(void)
|
||||||
|
{
|
||||||
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2717,17 +2752,123 @@ NTSTATUS VgaDevice::SetPowerState(POWER_ACTION ActionType)
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QxlDevice::QxlDevice(_In_ QxlDod* pQxlDod)
|
||||||
|
{
|
||||||
|
m_pQxlDod = pQxlDod;
|
||||||
|
m_ModeInfo = NULL;
|
||||||
|
m_ModeCount = 0;
|
||||||
|
m_ModeNumbers = NULL;
|
||||||
|
m_CurrentMode = 0;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS QxlDevice::GetModeList()
|
QxlDevice::~QxlDevice(void)
|
||||||
|
{
|
||||||
|
delete [] reinterpret_cast<BYTE*>(m_ModeInfo);
|
||||||
|
delete [] reinterpret_cast<BYTE*>(m_ModeNumbers);
|
||||||
|
m_ModeInfo = NULL;
|
||||||
|
m_ModeNumbers = NULL;
|
||||||
|
m_CurrentMode = 0;
|
||||||
|
m_ModeCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL QxlDevice::SetVideoModeInfo(UINT Idx, QXLMode* pModeInfo)
|
||||||
|
{
|
||||||
|
PVIDEO_MODE_INFORMATION pMode = NULL;
|
||||||
|
ULONG color_bits;
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
pMode = &m_ModeInfo[Idx];
|
||||||
|
pMode->Length = sizeof(VIDEO_MODE_INFORMATION);
|
||||||
|
pMode->ModeIndex = Idx;//m_ModeNumbers[Idx];
|
||||||
|
pMode->VisScreenWidth = pModeInfo->x_res;
|
||||||
|
pMode->VisScreenHeight = pModeInfo->y_res;
|
||||||
|
pMode->ScreenStride = pModeInfo->stride;
|
||||||
|
pMode->NumberOfPlanes = 1;
|
||||||
|
pMode->BitsPerPlane = pModeInfo->bits;
|
||||||
|
pMode->Frequency = 100;
|
||||||
|
pMode->XMillimeter = pModeInfo->x_mili;
|
||||||
|
pMode->YMillimeter = pModeInfo->y_mili;
|
||||||
|
color_bits = (pModeInfo->bits == 16) ? 5 : 8;
|
||||||
|
pMode->NumberRedBits = color_bits;
|
||||||
|
pMode->NumberGreenBits = color_bits;
|
||||||
|
pMode->NumberBlueBits = color_bits;
|
||||||
|
|
||||||
|
pMode->BlueMask = (1 << color_bits) - 1;
|
||||||
|
pMode->GreenMask = pMode->BlueMask << color_bits;
|
||||||
|
pMode->RedMask = pMode->GreenMask << color_bits;
|
||||||
|
|
||||||
|
pMode->AttributeFlags = VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS;
|
||||||
|
pMode->VideoMemoryBitmapWidth = pModeInfo->x_res;
|
||||||
|
pMode->VideoMemoryBitmapHeight = pModeInfo->y_res;
|
||||||
|
pMode->DriverSpecificAttributeFlags = pModeInfo->orientation;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS QxlDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
QXLModes *modes;
|
||||||
|
ULONG ModeCount;
|
||||||
|
ULONG SuitableModeCount;
|
||||||
|
USHORT CurrentMode;
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
if (!NT_SUCCESS (Status))
|
|
||||||
{
|
modes = (QXLModes *)((UCHAR*)m_RomHdr + m_RomHdr->modes_offset);
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("x86BiosWriteMemory failed with Status: 0x%X\n", Status));
|
if (m_RomSize < m_RomHdr->modes_offset + sizeof(QXLModes) ||
|
||||||
return Status;
|
(ModeCount = modes->n_modes) == 0 || m_RomSize <
|
||||||
|
m_RomHdr->modes_offset + sizeof(QXLModes) + ModeCount * sizeof(QXLMode)) {
|
||||||
|
DbgPrint(TRACE_LEVEL_ERROR, ("%s: bad rom size\n", __FUNCTION__));
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ModeCount += 2;
|
||||||
|
m_ModeInfo = reinterpret_cast<PVIDEO_MODE_INFORMATION> (new (PagedPool) BYTE[sizeof (VIDEO_MODE_INFORMATION) * ModeCount]);
|
||||||
|
m_ModeNumbers = reinterpret_cast<PUSHORT> (new (PagedPool) BYTE [sizeof (USHORT) * ModeCount]);
|
||||||
|
m_CurrentMode = 0;
|
||||||
|
|
||||||
|
for (CurrentMode = 0, SuitableModeCount = 0;
|
||||||
|
CurrentMode < ModeCount;
|
||||||
|
CurrentMode++)
|
||||||
|
{
|
||||||
|
|
||||||
|
UINT Height = pDispInfo->Height;
|
||||||
|
UINT Width = pDispInfo->Width;
|
||||||
|
UINT BitsPerPixel = BPPFromPixelFormat(pDispInfo->ColorFormat);
|
||||||
|
QXLMode* tmpModeInfo = &modes->modes[CurrentMode];
|
||||||
|
|
||||||
|
if (tmpModeInfo->x_res >= Width &&
|
||||||
|
tmpModeInfo->y_res >= Height &&
|
||||||
|
tmpModeInfo->bits == BitsPerPixel)
|
||||||
|
{
|
||||||
|
m_ModeNumbers[SuitableModeCount] = (USHORT)SuitableModeCount;
|
||||||
|
SetVideoModeInfo(SuitableModeCount, tmpModeInfo);
|
||||||
|
if (tmpModeInfo->x_res == 1024 &&
|
||||||
|
tmpModeInfo->y_res == 768)
|
||||||
|
{
|
||||||
|
m_CurrentMode = (USHORT)SuitableModeCount;
|
||||||
|
}
|
||||||
|
SuitableModeCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SuitableModeCount == 0)
|
||||||
|
{
|
||||||
|
DbgPrint(TRACE_LEVEL_ERROR, ("No video modes supported\n"));
|
||||||
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ModeCount = SuitableModeCount;
|
||||||
|
DbgPrint(TRACE_LEVEL_ERROR, ("ModeCount filtered %d\n", m_ModeCount));
|
||||||
|
for (ULONG idx = 0; idx < m_ModeCount; idx++)
|
||||||
|
{
|
||||||
|
DbgPrint(TRACE_LEVEL_ERROR, ("type %x, XRes = %d, YRes = %d, BPP = %d\n",
|
||||||
|
m_ModeNumbers[idx],
|
||||||
|
m_ModeInfo[idx].VisScreenWidth,
|
||||||
|
m_ModeInfo[idx].VisScreenHeight,
|
||||||
|
m_ModeInfo[idx].BitsPerPlane));
|
||||||
|
}
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -2766,9 +2907,10 @@ NTSTATUS QxlDevice::SetPowerState(POWER_ACTION ActionType)
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS QxlDevice::HWInit(PCM_RESOURCE_LIST pResList)
|
NTSTATUS QxlDevice::HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo)
|
||||||
{
|
{
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PDXGKRNL_INTERFACE pDxgkInterface = m_pQxlDod->GetDxgkInterrface();
|
PDXGKRNL_INTERFACE pDxgkInterface = m_pQxlDod->GetDxgkInterrface();
|
||||||
UINT pci_range = QXL_RAM_RANGE_INDEX;
|
UINT pci_range = QXL_RAM_RANGE_INDEX;
|
||||||
for (ULONG i = 0; i < pResList->Count; ++i)
|
for (ULONG i = 0; i < pResList->Count; ++i)
|
||||||
@ -2818,7 +2960,6 @@ NTSTATUS QxlDevice::HWInit(PCM_RESOURCE_LIST pResList)
|
|||||||
m_IoBase,
|
m_IoBase,
|
||||||
m_IoBase +
|
m_IoBase +
|
||||||
m_IoSize));
|
m_IoSize));
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CmResourceTypeInterrupt:
|
case CmResourceTypeInterrupt:
|
||||||
@ -2886,13 +3027,32 @@ NTSTATUS QxlDevice::HWInit(PCM_RESOURCE_LIST pResList)
|
|||||||
}
|
}
|
||||||
if (m_IoBase == NULL || m_IoSize == 0 ||
|
if (m_IoBase == NULL || m_IoSize == 0 ||
|
||||||
m_RomHdr == NULL || m_RomSize == 0 ||
|
m_RomHdr == NULL || m_RomSize == 0 ||
|
||||||
|
m_RomHdr->magic != QXL_ROM_MAGIC ||
|
||||||
m_RamStart == NULL || m_RamSize == 0 ||
|
m_RamStart == NULL || m_RamSize == 0 ||
|
||||||
m_VRamStart == NULL || m_VRamSize == 0)
|
m_VRamStart == NULL || m_VRamSize == 0 ||
|
||||||
|
(m_RamHdr = (QXLRam *)(m_RamStart + m_RomHdr->ram_header_offset)) == NULL ||
|
||||||
|
m_RamHdr->magic != QXL_RAM_MAGIC || !InitMemSlots())
|
||||||
{
|
{
|
||||||
UnmapMemory();
|
UnmapMemory();
|
||||||
|
DestroyMemSlots();
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_LogBuf = m_RamHdr->log_buf;
|
||||||
|
m_LogPort = m_IoBase + QXL_IO_LOG;
|
||||||
|
|
||||||
|
Status = GetModeList(pDispInfo);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
QXL_LOG_ASSERTION1("GetModeList failed with status 0x%X\n",
|
||||||
|
Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateEvents();
|
||||||
|
CreateRings();
|
||||||
|
CreateMemSlots();
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2923,6 +3083,102 @@ void QxlDevice::UnmapMemory(void)
|
|||||||
m_VRamStart = NULL;
|
m_VRamStart = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL QxlDevice::InitMemSlots(void)
|
||||||
|
{
|
||||||
|
m_NumMemSlots = m_RomHdr->slots_end;
|
||||||
|
m_SlotGenBits = m_RomHdr->slot_gen_bits;
|
||||||
|
m_SlotIdBits = m_RomHdr->slot_id_bits;
|
||||||
|
m_VaSlotMask = (~(uint64_t)0) >> (m_SlotIdBits + m_SlotGenBits);
|
||||||
|
size_t size = m_NumMemSlots * sizeof(MemSlot);
|
||||||
|
m_MemSlots = reinterpret_cast<MemSlot*>
|
||||||
|
(new (PagedPool) BYTE[size]);
|
||||||
|
if (m_MemSlots)
|
||||||
|
{
|
||||||
|
RtlZeroMemory(m_MemSlots, size);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QxlDevice::DestroyMemSlots(void)
|
||||||
|
{
|
||||||
|
delete [] reinterpret_cast<BYTE*>(m_MemSlots);
|
||||||
|
m_MemSlots = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QxlDevice::SetupHWSlot(UINT8 Idx, MemSlot *pSlot)
|
||||||
|
{
|
||||||
|
m_RamHdr->mem_slot.mem_start = pSlot->start_phys_addr;
|
||||||
|
m_RamHdr->mem_slot.mem_end = pSlot->end_phys_addr;
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)(m_IoBase + QXL_IO_MEMSLOT_ADD), Idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL QxlDevice::CreateEvents()
|
||||||
|
{
|
||||||
|
KeInitializeEvent(&m_DisplayEvent,
|
||||||
|
SynchronizationEvent,
|
||||||
|
FALSE);
|
||||||
|
KeInitializeEvent(&m_CursorEvent,
|
||||||
|
SynchronizationEvent,
|
||||||
|
FALSE);
|
||||||
|
KeInitializeEvent(&m_IoCmdEvent,
|
||||||
|
SynchronizationEvent,
|
||||||
|
FALSE);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL QxlDevice::CreateRings()
|
||||||
|
{
|
||||||
|
m_CommandRing = &(m_RamHdr->cmd_ring);
|
||||||
|
m_CursorRing = &(m_RamHdr->cursor_ring);
|
||||||
|
m_ReleaseRing = &(m_RamHdr->release_ring);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT8 QxlDevice::SetupMemSlot(UINT8 Idx, QXLPHYSICAL start, QXLPHYSICAL end)
|
||||||
|
{
|
||||||
|
UINT64 high_bits;
|
||||||
|
MemSlot *pSlot;
|
||||||
|
UINT8 slot_index;
|
||||||
|
|
||||||
|
slot_index = m_RomHdr->slots_start + Idx;
|
||||||
|
pSlot = &m_MemSlots[slot_index];
|
||||||
|
pSlot->start_phys_addr = start;
|
||||||
|
pSlot->end_phys_addr = end;
|
||||||
|
|
||||||
|
SetupHWSlot(Idx, pSlot);
|
||||||
|
|
||||||
|
pSlot->generation = m_RomHdr->slot_generation;
|
||||||
|
high_bits = slot_index << m_SlotGenBits;
|
||||||
|
high_bits |= pSlot->generation;
|
||||||
|
high_bits <<= (64 - (m_SlotGenBits + m_SlotIdBits));
|
||||||
|
pSlot->high_bits = high_bits;
|
||||||
|
return slot_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL QxlDevice::CreateMemSlots(void)
|
||||||
|
{
|
||||||
|
m_MainMemSlot= SetupMemSlot(0, (QXLPHYSICAL)m_VRamStart, (QXLPHYSICAL)(m_VRamStart + m_RomHdr->ram_header_offset));
|
||||||
|
m_SurfaceMemSlot = SetupMemSlot(1, (QXLPHYSICAL)m_RamStart, (QXLPHYSICAL)(m_RamStart + m_RamSize));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QxlDevice::ResetDevice(void)
|
||||||
|
{
|
||||||
|
m_RamHdr->int_mask = ~0;
|
||||||
|
WRITE_PORT_UCHAR(m_IoBase + QXL_IO_MEMSLOT_ADD, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS QxlDevice::HWClose(void)
|
||||||
|
{
|
||||||
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
|
UnmapMemory();
|
||||||
|
DestroyMemSlots();
|
||||||
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
UINT BPPFromPixelFormat(D3DDDIFORMAT Format)
|
UINT BPPFromPixelFormat(D3DDDIFORMAT Format)
|
||||||
{
|
{
|
||||||
switch (Format)
|
switch (Format)
|
||||||
|
@ -212,20 +212,22 @@ class HwDeviceIntrface :
|
|||||||
public:
|
public:
|
||||||
// HwDeviceIntrface(_In_ QxlDod* pQxlDod);
|
// HwDeviceIntrface(_In_ QxlDod* pQxlDod);
|
||||||
// virtual ~HwDeviceIntrface(void);
|
// virtual ~HwDeviceIntrface(void);
|
||||||
virtual NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
|
|
||||||
virtual NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode) = 0;
|
virtual NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode) = 0;
|
||||||
virtual NTSTATUS SetCurrentMode(ULONG Mode) = 0;
|
virtual NTSTATUS SetCurrentMode(ULONG Mode) = 0;
|
||||||
virtual NTSTATUS GetCurrentMode(ULONG* Mode) = 0;
|
virtual NTSTATUS GetCurrentMode(ULONG* Mode) = 0;
|
||||||
virtual NTSTATUS SetPowerState(POWER_ACTION ActionType) = 0;
|
virtual NTSTATUS SetPowerState(POWER_ACTION ActionType) = 0;
|
||||||
virtual NTSTATUS HWInit(PCM_RESOURCE_LIST pResList) = 0;
|
virtual NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
|
||||||
|
virtual NTSTATUS HWClose(void) = 0;
|
||||||
ULONG GetModeCount(void) {return m_ModeCount;}
|
ULONG GetModeCount(void) {return m_ModeCount;}
|
||||||
PVBE_MODEINFO GetModeInfo(UINT idx) {return &m_ModeInfo[idx];}
|
PVIDEO_MODE_INFORMATION GetModeInfo(UINT idx) {return &m_ModeInfo[idx];}
|
||||||
USHORT GetModeNumber(USHORT idx) {return m_ModeNumbers[idx];}
|
USHORT GetModeNumber(USHORT idx) {return m_ModeNumbers[idx];}
|
||||||
USHORT GetCurrentModeIndex(void) {return m_CurrentMode;}
|
USHORT GetCurrentModeIndex(void) {return m_CurrentMode;}
|
||||||
VOID SetCurrentModeIndex(USHORT idx) {m_CurrentMode = idx;}
|
VOID SetCurrentModeIndex(USHORT idx) {m_CurrentMode = idx;}
|
||||||
|
protected:
|
||||||
|
virtual NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
|
||||||
protected:
|
protected:
|
||||||
QxlDod* m_pQxlDod;
|
QxlDod* m_pQxlDod;
|
||||||
PVBE_MODEINFO m_ModeInfo;
|
PVIDEO_MODE_INFORMATION m_ModeInfo;
|
||||||
ULONG m_ModeCount;
|
ULONG m_ModeCount;
|
||||||
PUSHORT m_ModeNumbers;
|
PUSHORT m_ModeNumbers;
|
||||||
USHORT m_CurrentMode;
|
USHORT m_CurrentMode;
|
||||||
@ -237,28 +239,52 @@ class VgaDevice :
|
|||||||
public:
|
public:
|
||||||
VgaDevice(_In_ QxlDod* pQxlDod);
|
VgaDevice(_In_ QxlDod* pQxlDod);
|
||||||
virtual ~VgaDevice(void);
|
virtual ~VgaDevice(void);
|
||||||
NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo);
|
|
||||||
NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode);
|
NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode);
|
||||||
NTSTATUS SetCurrentMode(ULONG Mode);
|
NTSTATUS SetCurrentMode(ULONG Mode);
|
||||||
NTSTATUS GetCurrentMode(ULONG* Mode);
|
NTSTATUS GetCurrentMode(ULONG* Mode);
|
||||||
NTSTATUS SetPowerState(POWER_ACTION ActionType);
|
NTSTATUS SetPowerState(POWER_ACTION ActionType);
|
||||||
NTSTATUS HWInit(PCM_RESOURCE_LIST pResList);
|
NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo);
|
||||||
|
NTSTATUS HWClose(void);
|
||||||
|
protected:
|
||||||
|
NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo);
|
||||||
|
private:
|
||||||
|
BOOL SetVideoModeInfo(UINT Idx, PVBE_MODEINFO pModeInfo);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct _MemSlot {
|
||||||
|
UINT8 generation;
|
||||||
|
UINT64 start_phys_addr;
|
||||||
|
UINT64 end_phys_addr;
|
||||||
|
UINT64 start_virt_addr;
|
||||||
|
UINT64 end_virt_addr;
|
||||||
|
QXLPHYSICAL high_bits;
|
||||||
|
} MemSlot;
|
||||||
|
|
||||||
class QxlDevice :
|
class QxlDevice :
|
||||||
public HwDeviceIntrface
|
public HwDeviceIntrface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QxlDevice(_In_ QxlDod* pQxlDod){m_pQxlDod = pQxlDod;}
|
QxlDevice(_In_ QxlDod* pQxlDod);
|
||||||
virtual ~QxlDevice(void){;}
|
virtual ~QxlDevice(void);
|
||||||
NTSTATUS GetModeList(void);
|
|
||||||
NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode);
|
NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode);
|
||||||
NTSTATUS SetCurrentMode(ULONG Mode);
|
NTSTATUS SetCurrentMode(ULONG Mode);
|
||||||
NTSTATUS GetCurrentMode(ULONG* Mode);
|
NTSTATUS GetCurrentMode(ULONG* Mode);
|
||||||
NTSTATUS SetPowerState(POWER_ACTION ActionType);
|
NTSTATUS SetPowerState(POWER_ACTION ActionType);
|
||||||
NTSTATUS HWInit(PCM_RESOURCE_LIST pResList);
|
NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo);
|
||||||
|
NTSTATUS HWClose(void);
|
||||||
|
protected:
|
||||||
|
NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo);
|
||||||
private:
|
private:
|
||||||
void UnmapMemory(void);
|
void UnmapMemory(void);
|
||||||
|
BOOL SetVideoModeInfo(UINT Idx, QXLMode* pModeInfo);
|
||||||
|
BOOL InitMemSlots(void);
|
||||||
|
BOOL CreateMemSlots(void);
|
||||||
|
void DestroyMemSlots(void);
|
||||||
|
void ResetDevice(void);
|
||||||
|
void SetupHWSlot(UINT8 Idx, MemSlot *pSlot);
|
||||||
|
UINT8 SetupMemSlot(UINT8 Idx, QXLPHYSICAL start, QXLPHYSICAL end);
|
||||||
|
BOOL CreateEvents();
|
||||||
|
BOOL CreateRings();
|
||||||
private:
|
private:
|
||||||
PUCHAR m_IoBase;
|
PUCHAR m_IoBase;
|
||||||
BOOLEAN m_IoMapped;
|
BOOLEAN m_IoMapped;
|
||||||
@ -275,6 +301,25 @@ private:
|
|||||||
|
|
||||||
QXLRom *m_RomHdr;
|
QXLRom *m_RomHdr;
|
||||||
ULONG m_RomSize;
|
ULONG m_RomSize;
|
||||||
|
|
||||||
|
MemSlot *m_MemSlots;
|
||||||
|
UINT8 m_NumMemSlots;
|
||||||
|
UINT8 m_MainMemSlot;
|
||||||
|
UINT8 m_SurfaceMemSlot;
|
||||||
|
UINT8 m_SlotIdBits;
|
||||||
|
UINT8 m_SlotGenBits;
|
||||||
|
QXLPHYSICAL m_VaSlotMask;
|
||||||
|
|
||||||
|
QXLCommandRing *m_CommandRing;
|
||||||
|
QXLCursorRing *m_CursorRing;
|
||||||
|
QXLReleaseRing *m_ReleaseRing;
|
||||||
|
|
||||||
|
KEVENT m_DisplayEvent;
|
||||||
|
KEVENT m_CursorEvent;
|
||||||
|
KEVENT m_IoCmdEvent;
|
||||||
|
|
||||||
|
PUCHAR m_LogPort;
|
||||||
|
PUCHAR m_LogBuf;
|
||||||
};
|
};
|
||||||
|
|
||||||
class QxlDod :
|
class QxlDod :
|
||||||
|
@ -90,7 +90,7 @@
|
|||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH);.\Include</AdditionalIncludeDirectories>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<ExceptionHandling />
|
<ExceptionHandling />
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -106,7 +106,7 @@
|
|||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH);.\Include</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>Inf2Cat /driver:$(OutDir) /os:8_X86</Command>
|
<Command>Inf2Cat /driver:$(OutDir) /os:8_X86</Command>
|
||||||
@ -120,7 +120,7 @@
|
|||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH);.\Include</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>Inf2Cat /driver:$(OutDir) /os:8_X64</Command>
|
<Command>Inf2Cat /driver:$(OutDir) /os:8_X64</Command>
|
||||||
@ -134,7 +134,7 @@
|
|||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);$(SDK_INC_PATH);.\Include</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>Inf2Cat /driver:$(OutDir) /os:8_X64</Command>
|
<Command>Inf2Cat /driver:$(OutDir) /os:8_X64</Command>
|
||||||
|
Loading…
Reference in New Issue
Block a user