VBoxGuestR3LibVideo.cpp revision 9fc58edfe4464fca24d4a064b9d3fe2ed173a71a
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * VBoxGuestR3Lib - Ring-3 Support Library for VirtualBox guest additions, Video.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Copyright (C) 2007-2012 Oracle Corporation
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * available from http://www.virtualbox.org. This file is free software;
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * you can redistribute it and/or modify it under the terms of the GNU
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * General Public License (GPL) as published by the Free Software
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * The contents of this file may alternatively be used under the terms
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * of the Common Development and Distribution License Version 1.0
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * VirtualBox OSE distribution, in which case the provisions of the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * CDDL are applicable instead of those of the GPL.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * You may elect to license modified versions of this file under the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * terms and conditions of either the GPL or the CDDL or both.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync/*******************************************************************************
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync* Header Files *
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync*******************************************************************************/
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync#include <VBox/HostServices/GuestPropertySvc.h> /* For Save and RetrieveVideoMode */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync#if !defined(VBOX_VBGLR3_XFREE86) && !defined(VBOX_VBGLR3_XORG)
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync/* Rather than try to resolve all the header file conflicts, I will just
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync prototype what we need here. */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncextern "C" void* xf86memcpy(void*,const void*,xf86size_t);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncextern "C" void* xf86memset(const void*,int,xf86size_t);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync#endif /* VBOX_VBGLR3_XFREE86 */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync#define VIDEO_PROP_PREFIX "/VirtualBox/GuestAdd/Vbgl/Video/"
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Enable or disable video acceleration.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns VBox status code.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param fEnable Pass zero to disable, any other value to enable.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncVBGLR3DECL(int) VbglR3VideoAccelEnable(bool fEnable)
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync vmmdevInitRequest(&Req.header, VMMDevReq_VideoAccelEnable);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Flush the video buffer.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns VBox status code.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync vmmdevInitRequest(&Req.header, VMMDevReq_VideoAccelFlush);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Send mouse pointer shape information to the host.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns VBox status code.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param fFlags Mouse pointer flags.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param xHot X coordinate of hot spot.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param yHot Y coordinate of hot spot.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param cx Pointer width.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param cy Pointer height.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pvImg Pointer to the image data (can be NULL).
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param cbImg Size of the image data pointed to by pvImg.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncVBGLR3DECL(int) VbglR3SetPointerShape(uint32_t fFlags, uint32_t xHot, uint32_t yHot, uint32_t cx, uint32_t cy, const void *pvImg, size_t cbImg)
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync size_t cbReq = vmmdevGetMousePointerReqSize(cx, cy);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync || cbReq == RT_OFFSETOF(VMMDevReqMousePointer, pointerData) + cbImg,
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync int rc = vbglR3GRAlloc((VMMDevRequestHeader **)&pReq, cbReq,
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Send mouse pointer shape information to the host.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * This version of the function accepts a request for clients that
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * already allocate and manipulate the request structure directly.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns VBox status code.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pReq Pointer to the VMMDevReqMousePointer structure.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncVBGLR3DECL(int) VbglR3SetPointerShapeReq(VMMDevReqMousePointer *pReq)
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Query the last display change request sent from the host to the guest.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns iprt status value
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pcx Where to store the horizontal pixel resolution
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pcy Where to store the vertical pixel resolution
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * requested (a value of zero means do not change).
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pcBits Where to store the bits per pixel requested (a value
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * of zero means do not change).
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param iDisplay Where to store the display number the request was for
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * - 0 for the primary display, 1 for the first
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * secondary display, etc.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param fAck whether or not to acknowledge the newest request sent by
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * the host. If this is set, the function will return the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * most recent host request, otherwise it will return the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * last request to be acknowledged.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncstatic int getDisplayChangeRequest2(uint32_t *pcx, uint32_t *pcy,
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync AssertPtrReturn(piDisplay, VERR_INVALID_PARAMETER);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync vmmdevInitRequest(&Req.header, VMMDevReq_GetDisplayChangeRequest2);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync Req.eventAck = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Query the last display change request sent from the host to the guest.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns iprt status value
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pcx Where to store the horizontal pixel resolution
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * requested (a value of zero means do not change).
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pcy Where to store the vertical pixel resolution
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * requested (a value of zero means do not change).
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pcBits Where to store the bits per pixel requested (a value
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * of zero means do not change).
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param piDisplay Where to store the display number the request was for
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * - 0 for the primary display, 1 for the first
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * secondary display, etc.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param fAck whether or not to acknowledge the newest request sent by
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * the host. If this is set, the function will return the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * most recent host request, otherwise it will return the
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * last request to be acknowledged.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pdx New horizontal position of the secondary monitor.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Optional.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pdy New vertical position of the secondary monitor.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Optional.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * param pfEnabled Secondary monitor is enabled or not.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Optional.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * param pfChangeOrigin Whether the mode hint retrieved included information
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * about origin/display offset inside the frame-buffer.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Optional.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncVBGLR3DECL(int) VbglR3GetDisplayChangeRequest(uint32_t *pcx, uint32_t *pcy,
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync AssertPtrReturn(piDisplay, VERR_INVALID_PARAMETER);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync AssertPtrNullReturn(pfEnabled, VERR_INVALID_PARAMETER);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync AssertPtrNullReturn(pfChangeOrigin, VERR_INVALID_PARAMETER);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync rc = vmmdevInitRequest(&Req.header, VMMDevReq_GetDisplayChangeRequestEx);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync Req.eventAck = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync /* NEEDS TESTING: test below with current Additions on VBox 4.1 or older. */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync /** @todo Can we find some standard grep-able string for "NEEDS TESTING"? */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync if (rc == VERR_NOT_IMPLEMENTED) /* Fall back to the old API. */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync return getDisplayChangeRequest2(pcx, pcy, pcBits, piDisplay, fAck);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Query the host as to whether it likes a specific video mode.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns the result of the query
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param cx the width of the mode being queried
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param cy the height of the mode being queried
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param cBits the bpp of the mode being queried
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncVBGLR3DECL(bool) VbglR3HostLikesVideoMode(uint32_t cx, uint32_t cy, uint32_t cBits)
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync bool fRc = true; /* If for some reason we can't contact the host then
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * we like everything. */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync vmmdevInitRequest(&req.header, VMMDevReq_VideoModeSupported);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Get the highest screen number for which there is a saved video mode or "0"
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * if there are no saved modes.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns iprt status value
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param pcScreen where to store the virtual screen number
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsyncVBGLR3DECL(int) VbglR3VideoModeGetHighestSavedScreen(unsigned *pcScreen)
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync using namespace guestProp;
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync const char *pszName;
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync rc = VbglR3GuestPropEnum(u32ClientId, &pszPattern, 1, &pHandle,
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync rc = RTStrToUInt32Full(pszName + sizeof(VIDEO_PROP_PREFIX) - 1, 10,
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync if (RT_SUCCESS(rc)) /* There may be similar properties with text. */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync rc = VbglR3GuestPropEnumNext(pHandle, &pszName, NULL, NULL, NULL);
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync#else /* !VBOX_WITH_GUEST_PROPS */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync#endif /* !VBOX_WITH_GUEST_PROPS */
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * Save video mode parameters to the guest property store.
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @returns iprt status value
51a909d272137afafb6e48492caa2ed38c4c9f77vboxsync * @param cScreen virtual screen number
unsigned cBits, unsigned x, unsigned y,
bool fEnabled)
#if defined(VBOX_WITH_GUEST_PROPS)
using namespace guestProp;
bool fEnabled2;
if (u32ClientId != 0)
&fEnabled2);
return rc;
return VERR_NOT_IMPLEMENTED;
unsigned *pcBits,
bool *pfEnabled)
#if defined(VBOX_WITH_GUEST_PROPS)
using namespace guestProp;
int cMatches;
/** @todo add a VbglR3GuestPropReadValueF/FV that does the RTStrPrintf for you. */
if (u32ClientId != 0)
&x, &y, &fEnabled);
else if (cMatches < 0)
if (pcx)
if (pcy)
if (pcBits)
if (px)
*px = x;
if (py)
*py = y;
if (pfEnabled)
return rc;
return VERR_NOT_IMPLEMENTED;