9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox XPDM Display driver, internal header
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Copyright (C) 2011 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifndef VBOXDISPINTERNAL_H
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPINTERNAL_H
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/cdefs.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define LOG_GROUP LOG_GROUP_DRV_DISPLAY
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/log.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/err.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/assert.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <windef.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <wingdi.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <winddi.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <ntddvdeo.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#undef CO_E_NOTINITIALIZED
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <winerror.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <devioctl.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_VIDEO_LOG_NAME "VBoxDisp"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "common/VBoxVideoLog.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "common/xpdm/VBoxVideoPortAPI.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "common/xpdm/VBoxVideoIOCTL.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/HGSMI/HGSMI.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/VBoxVideo.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/VBoxVideoGuest.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBoxDisplay.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct _VBOXDISPDEV *PVBOXDISPDEV;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include "VBoxDispVHWA.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* 4bytes tag passed to EngAllocMem.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Note: chars are reverse order.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define MEM_ALLOC_TAG 'bvDD'
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Helper macros */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_WARN_WINERR(_winerr) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ((_winerr) != NO_ERROR) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("winerr(%#x)!=NO_ERROR", _winerr)); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_CHECK_WINERR_RETRC(_winerr, _rc) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ((_winerr) != NO_ERROR) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("winerr(%#x)!=NO_ERROR", _winerr)); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return (_rc); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_WARNRC_RETV(_rc, _ret) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(_rc)) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("RT_FAILURE rc(%#x)", _rc)); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return (_ret); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_WARNRC_RETRC(_rc) VBOX_WARNRC_RETV(_rc, _rc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_WARNRC(_rc) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(_rc)) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("RT_FAILURE rc(%#x)", _rc)); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync#define VBOX_WARNRC_NOBP(_rc) \
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync do { \
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync if (RT_FAILURE(_rc)) \
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync { \
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync WARN_NOBP(("RT_FAILURE rc(%#x)", _rc)); \
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync } \
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync } while (0)
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_WARN_IOCTLCB_RETRC(_ioctl, _cbreturned, _cbexpected, _rc) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ((_cbreturned)!=(_cbexpected)) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN((_ioctl " returned %d, expected %d bytes!", _cbreturned, _cbexpected)); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return (_rc); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define abs(_v) ( ((_v)>0) ? (_v) : (-(_v)) )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct _CLIPRECTS {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG c;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL arcl[64];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} CLIPRECTS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct _VRDPCLIPRECTS
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL rclDstOrig; /* Original bounding rectangle. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL rclDst; /* Bounding rectangle of all rects. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CLIPRECTS rects; /* Rectangles to update. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VRDPCLIPRECTS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Mouse pointer related functions */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispInitPointerCaps(PVBOXDISPDEV pDev, DEVINFO *pDevInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispInitPointerAttrs(PVBOXDISPDEV pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Palette related functions */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispInitPalette(PVBOXDISPDEV pDev, DEVINFO *pDevInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispDestroyPalette(PVBOXDISPDEV pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispSetPalette8BPP(PVBOXDISPDEV pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* VBVA related */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispVBVAInit(PVBOXDISPDEV pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVBVAHostCommandComplete(PVBOXDISPDEV pDev, VBVAHOSTCMD *pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpReportDirtyRect(PVBOXDISPDEV pDev, RECTL *prcl);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vbvaReportDirtyRect(PVBOXDISPDEV pDev, RECTL *prcl);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_VBVA_ADJUST_RECT
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpAdjustRect (SURFOBJ *pso, RECTL *prcl);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL vbvaFindChangedRect(SURFOBJ *psoDest, SURFOBJ *psoSrc, RECTL *prclDest, POINTL *pptlSrc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif /* VBOX_VBVA_ADJUST_RECT */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VRDP_TEXT_MAX_GLYPH_SIZE 0x100
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VRDP_TEXT_MAX_GLYPHS 0xfe
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL vrdpReportText(PVBOXDISPDEV pDev, VRDPCLIPRECTS *pClipRects, STROBJ *pstro, FONTOBJ *pfo,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL *prclOpaque, ULONG ulForeRGB, ULONG ulBackRGB);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL vrdpReportOrderGeneric(PVBOXDISPDEV pDev, const VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const void *pvOrder, unsigned cbOrder, unsigned code);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL VBoxDispIsScreenSurface(SURFOBJ *pso);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispDumpPSO(SURFOBJ *pso, char *s);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL vrdpDrvRealizeBrush(BRUSHOBJ *pbo, SURFOBJ *psoTarget, SURFOBJ *psoPattern, SURFOBJ *psoMask,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync XLATEOBJ *pxlo, ULONG iHatch);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpReset(PVBOXDISPDEV pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(int) format2BytesPerPixel(const SURFOBJ *pso)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (pso->iBitmapFormat)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case BMF_16BPP: return 2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case BMF_24BPP: return 3;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case BMF_32BPP: return 4;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif /*VBOXDISPINTERNAL_H*/