DisplayImpl.h revision b80ab4eb3844fa4a810de4e66291059f09773eea
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync/** @file
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync *
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * VirtualBox COM class implementation
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync */
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync/*
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * Copyright (C) 2006 InnoTek Systemberatung GmbH
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync *
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * available from http://www.virtualbox.org. This file is free software;
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * you can redistribute it and/or modify it under the terms of the GNU
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * General Public License as published by the Free Software Foundation,
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync *
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * If you received this file as part of a commercial VirtualBox
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * distribution, then only the terms of your commercial VirtualBox
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync * license agreement apply instead of the previous paragraph.
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync */
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync#ifndef ____H_DISPLAYIMPL
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync#define ____H_DISPLAYIMPL
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync#include "VirtualBoxBase.h"
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync#include <iprt/semaphore.h>
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync#include <VBox/pdm.h>
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync#include <VBox/VBoxGuest.h>
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsyncclass Console;
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsyncclass ATL_NO_VTABLE Display :
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync public IConsoleCallback,
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync public VirtualBoxSupportErrorInfoImpl <Display, IDisplay>,
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync public VirtualBoxSupportTranslation <Display>,
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync public VirtualBoxBase,
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync public IDisplay
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync{
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsyncpublic:
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync DECLARE_NOT_AGGREGATABLE(Display)
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync BEGIN_COM_MAP(Display)
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync COM_INTERFACE_ENTRY(ISupportErrorInfo)
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync COM_INTERFACE_ENTRY(IDisplay)
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync END_COM_MAP()
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync NS_DECL_ISUPPORTS
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync HRESULT FinalConstruct();
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync void FinalRelease();
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync // public initializer/uninitializer for internal purposes only
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync HRESULT init (Console *parent);
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync void uninit();
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync // public methods only for internal purposes
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync int handleDisplayResize (uint32_t bpp, void *pvVRAM, uint32_t cbLine, int w, int h);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync void handleDisplayUpdate (int x, int y, int cx, int cy);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync IFramebuffer *getFramebuffer()
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync {
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync return mFramebuffer;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync }
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync int VideoAccelEnable (bool fEnable, VBVAMEMORY *pVbvaMemory);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync void VideoAccelFlush (void);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync bool VideoAccelAllowed (void);
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync#ifdef VBOX_VRDP
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync#ifdef VRDP_MC
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync void VideoAccelVRDP (bool fEnable);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync#else
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync void VideoAccelVRDP (bool fEnable, uint32_t fu32SupportedOrders);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync#endif /* VRDP_MC */
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync#endif /* VBOX_VRDP */
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync // IConsoleCallback methods
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(OnMousePointerShapeChange)(BOOL visible, BOOL alpha, ULONG xHot, ULONG yHot,
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync ULONG width, ULONG height, BYTE *shape)
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync {
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync return S_OK;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync }
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(OnMouseCapabilityChange)(BOOL supportsAbsolute, BOOL needsHostCursor)
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync {
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync return S_OK;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync }
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync STDMETHOD(OnStateChange)(MachineState_T machineState);
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync STDMETHOD(OnAdditionsStateChange)()
8867771015571c5542d39e393d7fe6304421a928vboxsync {
8867771015571c5542d39e393d7fe6304421a928vboxsync return S_OK;
8867771015571c5542d39e393d7fe6304421a928vboxsync }
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync STDMETHOD(OnKeyboardLedsChange)(BOOL fNumLock, BOOL fCapsLock, BOOL fScrollLock)
8867771015571c5542d39e393d7fe6304421a928vboxsync {
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync return S_OK;
8867771015571c5542d39e393d7fe6304421a928vboxsync }
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync STDMETHOD(OnRuntimeError)(BOOL fatal, INPTR BSTR id, INPTR BSTR message)
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync {
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync return S_OK;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync }
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
f5edc444546b57af847ae33f2bd1e10442496e47vboxsync // IDisplay properties
f5edc444546b57af847ae33f2bd1e10442496e47vboxsync STDMETHOD(COMGETTER(Width)) (ULONG *width);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(COMGETTER(Height)) (ULONG *height);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync STDMETHOD(COMGETTER(ColorDepth)) (ULONG *colorDepth);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync // IDisplay methods
8867771015571c5542d39e393d7fe6304421a928vboxsync STDMETHOD(SetupInternalFramebuffer)(ULONG depth);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(LockFramebuffer)(BYTE **address);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(UnlockFramebuffer)();
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(RegisterExternalFramebuffer)(IFramebuffer *frameBuf);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(SetVideoModeHint)(ULONG width, ULONG height, ULONG colorDepth);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(TakeScreenShot)(BYTE *address, ULONG width, ULONG height);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(DrawToScreen)(BYTE *address, ULONG x, ULONG y, ULONG width, ULONG height);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync STDMETHOD(InvalidateAndUpdate)();
4c464a0800535c29782d7ab5bcd7820bc7115cd7vboxsync STDMETHOD(ResizeCompleted)();
4c464a0800535c29782d7ab5bcd7820bc7115cd7vboxsync STDMETHOD(UpdateCompleted)();
4c464a0800535c29782d7ab5bcd7820bc7115cd7vboxsync
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync // for VirtualBoxSupportErrorInfoImpl
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync static const wchar_t *getComponentName() { return L"Display"; }
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync static const PDMDRVREG DrvReg;
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsyncprivate:
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync void updateDisplayData (bool aCheckParams = false);
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync static DECLCALLBACK(int) changeFramebuffer (Display *that, IFramebuffer *aFB,
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync bool aInternal);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync static DECLCALLBACK(void*) drvQueryInterface(PPDMIBASE pInterface, PDMINTERFACE enmInterface);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync static DECLCALLBACK(int) drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync static DECLCALLBACK(void) drvDestruct(PPDMDRVINS pDrvIns);
4c464a0800535c29782d7ab5bcd7820bc7115cd7vboxsync static DECLCALLBACK(int) displayResizeCallback(PPDMIDISPLAYCONNECTOR pInterface, uint32_t bpp, void *pvVRAM, uint32_t cbLine, uint32_t cx, uint32_t cy);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync static DECLCALLBACK(void) displayUpdateCallback(PPDMIDISPLAYCONNECTOR pInterface,
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync uint32_t x, uint32_t y, uint32_t cx, uint32_t cy);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync static DECLCALLBACK(void) displayRefreshCallback(PPDMIDISPLAYCONNECTOR pInterface);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync static DECLCALLBACK(void) displayResetCallback(PPDMIDISPLAYCONNECTOR pInterface);
8867771015571c5542d39e393d7fe6304421a928vboxsync static DECLCALLBACK(void) displayLFBModeChangeCallback(PPDMIDISPLAYCONNECTOR pInterface, bool fEnabled);
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync ComObjPtr <Console, ComWeakRef> mParent;
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync /** Pointer to the associated display driver. */
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync struct DRVMAINDISPLAY *mpDrv;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync /** Pointer to the device instance for the VMM Device. */
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync PPDMDEVINS mpVMMDev;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync /** Set after the first attempt to find the VMM Device. */
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync bool mfVMMDevInited;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync bool mInternalFramebuffer;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync ComPtr<IFramebuffer> mFramebuffer;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync bool mFramebufferOpened;
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync /** bitmask of acceleration operations supported by current framebuffer */
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync ULONG mSupportedAccelOps;
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync RTSEMEVENTMULTI mUpdateSem;
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync /* arguments of the last handleDisplayResize() call */
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync void *mLastAddress;
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync uint32_t mLastLineSize;
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync uint32_t mLastColorDepth;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync int mLastWidth;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync int mLastHeight;
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync VBVAMEMORY *mpVbvaMemory;
8867771015571c5542d39e393d7fe6304421a928vboxsync bool mfVideoAccelEnabled;
8867771015571c5542d39e393d7fe6304421a928vboxsync bool mfVideoAccelVRDP;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync uint32_t mfu32SupportedOrders;
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync int32_t volatile mcVideoAccelVRDPRefs;
8867771015571c5542d39e393d7fe6304421a928vboxsync
8867771015571c5542d39e393d7fe6304421a928vboxsync VBVAMEMORY *mpPendingVbvaMemory;
8867771015571c5542d39e393d7fe6304421a928vboxsync bool mfPendingVideoAccelEnable;
8867771015571c5542d39e393d7fe6304421a928vboxsync bool mfMachineRunning;
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync uint8_t *mpu8VbvaPartial;
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync uint32_t mcbVbvaPartial;
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync bool vbvaFetchCmd (VBVACMDHDR **ppHdr, uint32_t *pcbCmd);
c1b4529a269091edd0274bd98d35b75663fd66c0vboxsync void vbvaReleaseCmd (VBVACMDHDR *pHdr, int32_t cbCmd);
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync void handleResizeCompletedEMT (void);
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync volatile uint32_t mu32ResizeStatus;
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync enum {
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync ResizeStatus_Void,
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync ResizeStatus_InProgress,
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync ResizeStatus_UpdateDisplayData
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync };
9de47c4ec7b0fc9a384e4b815153de399da7b8devboxsync};
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync
fe14fe6d46ce87a9b25cbdacb3a20b1f87bf34c7vboxsync#endif // ____H_DISPLAYIMPL
8867771015571c5542d39e393d7fe6304421a928vboxsync