VBoxDispMini.cpp revision b0a3d0ec5780199a2f379da63c59ccf48f1a73b9
/* $Id$ */
/** @file
* VBox XPDM Display driver, helper functions which interacts with our miniport driver
*/
/*
* Copyright (C) 2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "VBoxDisp.h"
#include "VBoxDispMini.h"
/* Returns if given video mode is supported by display driver */
{
&& (pMode->BitsPerPlane==8 || pMode->BitsPerPlane==16 || pMode->BitsPerPlane==24 || pMode->BitsPerPlane==32))
{
return TRUE;
}
return FALSE;
}
/* Returns list video modes supported by both miniport and display driver.
* Note: caller is resposible to free up ppModesTable.
*/
{
LOGF_ENTER();
/* Get number of video modes supported by miniport */
{
WARN(("sizeof(VIDEO_MODE_INFORMATION) differs for miniport and display drivers. "
"Check that both are compiled with same ddk version!"));
}
/* Allocate temp buffer */
if (!pMiniportModes)
{
WARN(("not enough memory!"));
return VERR_NO_MEMORY;
}
/* Get video modes supported by miniport */
{
}
/* Check which of miniport modes are supprted by display driver.
* Note: size of VIDEO_MODE_INFORMATION is returned by miniport driver in numModes.ModeInformationLength,
* it might be different from the one we have here.
*/
cSupportedModes = 0;
{
/*sanity check*/
{
}
{
}
else
{
}
}
if (0==cSupportedModes)
{
WARN(("0 video modes supported!"));
return VERR_NOT_SUPPORTED;
}
/* Allocate and zero output buffer */
if (!*ppModesTable)
{
WARN(("not enough memory!"));
return VERR_NO_MEMORY;
}
/* Copy supported modes to output buffer */
{
{
++j;
}
}
Assert(j==cSupportedModes);
/* Free temp buffer */
LOGF_LEAVE();
return VINF_SUCCESS;
}
/* Query miniport for mouse pointer caps */
{
LOGF_ENTER();
VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES", cbReturned, sizeof(VIDEO_POINTER_CAPABILITIES), VERR_DEV_IO_ERROR);
LOGF_LEAVE();
return VINF_SUCCESS;
}
/* Set device mode */
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_SET_CURRENT_MODE, &mode, sizeof(VIDEO_MODE), NULL, 0, &cbReturned);
LOGF_LEAVE();
return VINF_SUCCESS;
}
/* Map device framebuffer and VRAM to our virtual address space */
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(pDev->hDriver, IOCTL_VIDEO_MAP_VIDEO_MEMORY, &vMem, sizeof(vMem), &vMemInfo, sizeof(vMemInfo), &cbReturned);
VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_MAP_VIDEO_MEMORY", cbReturned, sizeof(vMemInfo), VERR_DEV_IO_ERROR);
{
WARN(("FrameBufferBase!=VideoRamBase."));
return VERR_GENERAL_FAILURE;
}
/* Check if we can access mapped memory */
{
WARN(("can't write to framebuffer memory!"));
return VERR_GENERAL_FAILURE;
}
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(pDev->hDriver, IOCTL_VIDEO_UNMAP_VIDEO_MEMORY, &vMem, sizeof(vMem), NULL, 0, &cbReturned);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_QUERY_HGSMI_INFO", cbReturned, sizeof(QUERYHGSMIRESULT), VERR_DEV_IO_ERROR);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_HGSMI_QUERY_CALLBACKS", cbReturned, sizeof(HGSMIQUERYCALLBACKS), VERR_DEV_IO_ERROR);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_HGSMI_QUERY_PORTPROCS", cbReturned, sizeof(HGSMIQUERYCPORTPROCS), VERR_DEV_IO_ERROR);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_VHWA_QUERY_INFO", cbReturned, sizeof(VHWAQUERYINFO), VERR_DEV_IO_ERROR);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_SET_COLOR_REGISTERS, pClut, cbClut, NULL, 0, &cbReturned);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_SET_POINTER_POSITION, pPos, sizeof(VIDEO_POINTER_POSITION),
NULL, 0, &cbReturned);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(pDev->hDriver, IOCTL_VIDEO_SET_POINTER_ATTR, pDev->pointer.pAttrs, pDev->pointer.cbAttrs,
NULL, 0, &cbReturned);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_VBOX_SETVISIBLEREGION, pRects, cRects*sizeof(RTRECT),
NULL, 0, &cbReturned);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
LOGF_LEAVE();
return VINF_SUCCESS;
}
int VBoxDispMPShareVideoMemory(HANDLE hDriver, PVIDEO_SHARE_MEMORY pSMem, PVIDEO_SHARE_MEMORY_INFORMATION pSMemInfo)
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_SHARE_VIDEO_MEMORY, pSMem, sizeof(VIDEO_SHARE_MEMORY),
sizeof(VIDEO_SHARE_MEMORY_INFORMATION), VERR_DEV_IO_ERROR);
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
LOGF_ENTER();
dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY, pSMem, sizeof(VIDEO_SHARE_MEMORY),
NULL, 0, &cbReturned);
LOGF_LEAVE();
return VINF_SUCCESS;
}