DisplayImpl.h revision 3357eeed76d19616f784af90f42755da2b54bc4d
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * VirtualBox COM class implementation
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * Copyright (C) 2006-2015 Oracle Corporation
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * available from http://www.virtualbox.org. This file is free software;
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * you can redistribute it and/or modify it under the terms of the GNU
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * General Public License (GPL) as published by the Free Software
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync /* The following 3 fields (u32Offset, u32MaxFramebufferSize and u32InformationSize)
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync * are not used by the current HGSMI. They are needed for backward compatibility with
d05e58c15346e272284b3db3adae55a8fb8977davboxsync * pre-HGSMI additions.
ab93606043a9881487aa83be04191d2f4ea24071vboxsync /** The framebuffer has default format and must be updates immediately. */
d05e58c15346e272284b3db3adae55a8fb8977davboxsync#endif /* VBOX_WITH_HGSMI */
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync#endif /* VBOX_WITH_CROGL */
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync/* The legacy VBVA (VideoAccel) data.
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync * Backward compatibility with the guest additions 3.x or older.
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsynctypedef struct VIDEOACCEL
d05e58c15346e272284b3db3adae55a8fb8977davboxsync /* Old guest additions (3.x and older) use both VMMDev and DevVGA refresh timer
d05e58c15346e272284b3db3adae55a8fb8977davboxsync * to process the VBVABUFFER memory. Therefore the legacy VBVA (VideoAccel) host
d05e58c15346e272284b3db3adae55a8fb8977davboxsync * code can be executed concurrently by VGA refresh timer and the guest VMMDev
ab93606043a9881487aa83be04191d2f4ea24071vboxsync * request in SMP VMs. The semaphore serialized this.
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync virtual HRESULT i_getScreenResolution(ULONG cScreen, ULONG *pcx,
ab93606043a9881487aa83be04191d2f4ea24071vboxsync ULONG *pcy, ULONG *pcBPP, LONG *pXOrigin, LONG *pYOrigin) = 0;
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync virtual void i_getFramebufferDimensions(int32_t *px1, int32_t *py1,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync virtual HRESULT i_reportHostCursorCapabilities(uint32_t fCapabilitiesAdded, uint32_t fCapabilitiesRemoved) = 0;
ab93606043a9881487aa83be04191d2f4ea24071vboxsync virtual HRESULT i_reportHostCursorPosition(int32_t x, int32_t y) = 0;
d05e58c15346e272284b3db3adae55a8fb8977davboxsync // public initializer/uninitializer for internal purposes only
d05e58c15346e272284b3db3adae55a8fb8977davboxsync // public methods only for internal purposes
d05e58c15346e272284b3db3adae55a8fb8977davboxsync int i_handleDisplayResize(unsigned uScreenId, uint32_t bpp, void *pvVRAM, uint32_t cbLine,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync void i_handleDisplayUpdate(unsigned uScreenId, int x, int y, int w, int h);
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync void i_handleUpdateVMMDevSupportsGraphics(bool fSupportsGraphics);
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync void i_handleUpdateGuestVBVACapabilities(uint32_t fNewCapabilities);
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync void i_handleUpdateVBVAInputMapping(int32_t xOrigin, int32_t yOrigin, uint32_t cx, uint32_t cy);
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync int i_handleVHWACommandProcess(PVBOXVHWACMD pCommand);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync void i_handleCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam);
ab93606043a9881487aa83be04191d2f4ea24071vboxsync void i_handleCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync void i_handleCrHgsmiCommandProcess(PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync void i_handleCrHgsmiControlProcess(PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
d05e58c15346e272284b3db3adae55a8fb8977davboxsync int i_handleCrHgcmCtlSubmit(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync void i_handleCrVRecScreenshotPerform(uint32_t uScreen,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync uint32_t x, uint32_t y, uint32_t uPixelFormat, uint32_t uBitsPerPixel,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync uint32_t uBytesPerLine, uint32_t uGuestWidth, uint32_t uGuestHeight,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync bool i_handleCrVRecScreenshotBegin(uint32_t uScreen, uint64_t u64TimeStamp);
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync void i_handleCrVRecScreenshotEnd(uint32_t uScreen, uint64_t u64TimeStamp);
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync int i_notifyCroglResize(const PVBVAINFOVIEW pView, const PVBVAINFOSCREEN pScreen, void *pvVRAM);
ab93606043a9881487aa83be04191d2f4ea24071vboxsync int i_handleSetVisibleRegion(uint32_t cRect, PRTRECT pRect);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync int i_handleQueryVisibleRegion(uint32_t *pcRect, PRTRECT pRect);
ab93606043a9881487aa83be04191d2f4ea24071vboxsync /* Legacy video acceleration requests coming from the VGA refresh timer. */
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync int VideoAccelEnableVGA(bool fEnable, VBVAMEMORY *pVbvaMemory);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync /* Legacy video acceleration requests coming from VMMDev. */
d05e58c15346e272284b3db3adae55a8fb8977davboxsync int VideoAccelEnableVMMDev(bool fEnable, VBVAMEMORY *pVbvaMemory);
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync int i_VideoCaptureEnableScreens(ComSafeArrayIn(BOOL, aScreens));
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync // DisplayMouseInterface methods
d05e58c15346e272284b3db3adae55a8fb8977davboxsync virtual HRESULT i_getScreenResolution(ULONG cScreen, ULONG *pcx,
ab93606043a9881487aa83be04191d2f4ea24071vboxsync ULONG *pcy, ULONG *pcBPP, LONG *pXOrigin, LONG *pYOrigin)
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync return getScreenResolution(cScreen, pcx, pcy, pcBPP, pXOrigin, pYOrigin, NULL);
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync virtual void i_getFramebufferDimensions(int32_t *px1, int32_t *py1,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync virtual HRESULT i_reportHostCursorCapabilities(uint32_t fCapabilitiesAdded, uint32_t fCapabilitiesRemoved);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync virtual HRESULT i_reportHostCursorPosition(int32_t x, int32_t y);
3e39de9ed8b88fa8907468a77bef44d10049b12avboxsync // Wrapped IDisplay properties
3e39de9ed8b88fa8907468a77bef44d10049b12avboxsync // Wrapped IDisplay methods
3e39de9ed8b88fa8907468a77bef44d10049b12avboxsync virtual HRESULT getScreenResolution(ULONG aScreenId,
3e39de9ed8b88fa8907468a77bef44d10049b12avboxsync virtual HRESULT detachFramebuffer(ULONG aScreenId);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync virtual HRESULT takeScreenShotToArray(ULONG aScreenId,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync virtual HRESULT invalidateAndUpdateScreen(ULONG aScreenId);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync virtual HRESULT completeVHWACommand(BYTE *aCommand);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync ComPtr<IDisplaySourceBitmap> &aDisplaySourceBitmap);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync virtual HRESULT notifyScaleFactorChange(ULONG aScreenId,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync // Wrapped IEventListener properties
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync // Wrapped IEventListener methods
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync virtual HRESULT handleEvent(const ComPtr<IEvent> &aEvent);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync // other internal methods
d05e58c15346e272284b3db3adae55a8fb8977davboxsync#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync int i_crViewportNotify(ULONG aScreenId, ULONG x, ULONG y, ULONG width, ULONG height);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void*) i_drvQueryInterface(PPDMIBASE pInterface, const char *pszIID);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(int) i_drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_drvDestruct(PPDMDRVINS pDrvIns);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(int) i_displayResizeCallback(PPDMIDISPLAYCONNECTOR pInterface, uint32_t bpp, void *pvVRAM,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayUpdateCallback(PPDMIDISPLAYCONNECTOR pInterface,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayRefreshCallback(PPDMIDISPLAYCONNECTOR pInterface);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayResetCallback(PPDMIDISPLAYCONNECTOR pInterface);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayLFBModeChangeCallback(PPDMIDISPLAYCONNECTOR pInterface, bool fEnabled);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayProcessAdapterDataCallback(PPDMIDISPLAYCONNECTOR pInterface,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayProcessDisplayDataCallback(PPDMIDISPLAYCONNECTOR pInterface,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(int) i_displayVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCommand);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(int) i_displayCrHgcmCtlSubmit(PPDMIDISPLAYCONNECTOR pInterface,
5964f60ed7fb52a3c4becbe83c9429f9b2f119c2vboxsync static DECLCALLBACK(void) i_displayCrHgcmCtlSubmitCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(int) i_displayVBVAEnable(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync PVBVAHOSTFLAGS pHostFlags, bool fRenderThreadMode);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayVBVADisable(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayVBVAUpdateBegin(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId);
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayVBVAUpdateProcess(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId,
93d83967c7ad57b530ecfa5cfbe82f6b986dd58avboxsync static DECLCALLBACK(void) i_displayVBVAUpdateEnd(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, int32_t x, int32_t y,
333e7ab9cd83b32080826d06ac7b1951c684ccb5vboxsync static DECLCALLBACK(int) i_displayVBVAResize(PPDMIDISPLAYCONNECTOR pInterface, const PVBVAINFOVIEW pView,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(int) i_displayVBVAMousePointerShape(PPDMIDISPLAYCONNECTOR pInterface, bool fVisible, bool fAlpha,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync uint32_t xHot, uint32_t yHot, uint32_t cx, uint32_t cy,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync const void *pvShape);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayVBVAGuestCapabilityUpdate(PPDMIDISPLAYCONNECTOR pInterface, uint32_t fCapabilities);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayVBVAInputMappingUpdate(PPDMIDISPLAYCONNECTOR pInterface, int32_t xOrigin, int32_t yOrigin,
333e7ab9cd83b32080826d06ac7b1951c684ccb5vboxsync#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
333e7ab9cd83b32080826d06ac7b1951c684ccb5vboxsync static DECLCALLBACK(void) i_displayCrVRecScreenshotPerform(void *pvCtx, uint32_t uScreen,
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(bool) i_displayCrVRecScreenshotBegin(void *pvCtx, uint32_t uScreen, uint64_t u64TimeStamp);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayCrVRecScreenshotEnd(void *pvCtx, uint32_t uScreen, uint64_t u64TimeStamp);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(void) i_displayVRecCompletion(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd, int rc, void *pvCompletion);
333e7ab9cd83b32080826d06ac7b1951c684ccb5vboxsync static DECLCALLBACK(void) i_displayCrCmdFree(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd, int rc, void *pvCompletion);
333e7ab9cd83b32080826d06ac7b1951c684ccb5vboxsync static DECLCALLBACK(void) i_displaySSMSaveScreenshot(PSSMHANDLE pSSM, void *pvUser);
333e7ab9cd83b32080826d06ac7b1951c684ccb5vboxsync static DECLCALLBACK(int) i_displaySSMLoadScreenshot(PSSMHANDLE pSSM, void *pvUser, uint32_t uVersion, uint32_t uPass);
333e7ab9cd83b32080826d06ac7b1951c684ccb5vboxsync static DECLCALLBACK(void) i_displaySSMSave(PSSMHANDLE pSSM, void *pvUser);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync static DECLCALLBACK(int) i_displaySSMLoad(PSSMHANDLE pSSM, void *pvUser, uint32_t uVersion, uint32_t uPass);
d05e58c15346e272284b3db3adae55a8fb8977davboxsync /** Pointer to the associated display driver. */
d05e58c15346e272284b3db3adae55a8fb8977davboxsync /** Pointer to the device instance for the VMM Device. */
333e7ab9cd83b32080826d06ac7b1951c684ccb5vboxsync /** Set after the first attempt to find the VMM Device. */
unsigned mcMonitors;
bool mfVMMDevSupportsGraphics;
bool mfSourceBitmapEnabled;
bool volatile fVGAResizing;
bool mfVideoAccelVRDP;
bool mfIsCr3DEnabled;
#ifdef VBOX_WITH_CROGL
bool mfCrOglDataHidden;
#ifdef VBOX_WITH_CRHGSMI
#ifdef VBOX_WITH_CROGL
bool i_VideoAccelAllowed(void);
static int i_displayTakeScreenshotEMT(Display *pDisplay, ULONG aScreenId, uint8_t **ppu8Data, size_t *pcbData,
int i_crCtlSubmit(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd, PFNCRCTLCOMPLETION pfnCompletion, void *pvCompletion);
int i_crCtlSubmitSyncIfHasDataForScreen(uint32_t u32ScreenID, struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd);
static int i_drawToScreenEMT(Display *pDisplay, ULONG aScreenId, BYTE *address, ULONG x, ULONG y, ULONG width, ULONG height);
void i_updateGuestGraphicsFacility(void);
#ifdef VBOX_WITH_HGSMI
#ifdef VBOX_WITH_VPX
bool fVideoAccelEnabled,
bool fVideoAccelVRDP,
unsigned cFBInfos);
/* helper function, code in DisplayResampleImage.cpp */
/* helper function, code in DisplayPNGUtul.cpp */
void FinalRelease();
/* Public initializer/uninitializer for internal purposes only. */
void uninit();
struct Data
unsigned uScreenId;
Data m;