9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox XPDM Display driver interface functions related to DirectDraw
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Copyright (C) 2011 Oracle Corporation
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.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void VBoxDispGetDDHalInfo(PVBOXDISPDEV pDev, DD_HALINFO *pHalInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* memory info */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.fpPrimary = pDev->layout.offFramebuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*pHalInfo->vmiData.dwFlags /*unused*/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.dwDisplayWidth = pDev->mode.ulWidth;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.dwDisplayHeight = pDev->mode.ulHeight;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.lDisplayPitch = pDev->mode.lScanlineStride;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwSize = sizeof(DDPIXELFORMAT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwFlags |= DDPF_PALETTEINDEXED8;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwRGBBitCount = pDev->mode.ulBitsPerPel;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwRBitMask = pDev->mode.flMaskR;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwGBitMask = pDev->mode.flMaskG;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwBBitMask = pDev->mode.flMaskB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.pvPrimary = pDev->memInfo.FrameBufferBase;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwVidMemTotal = pDev->layout.cbDDrawHeap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwVidMemFree = pDev->layout.cbDDrawHeap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called to get supported DirectDraw caps */
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsyncVBoxDispDrvGetDirectDrawInfo(DHPDEV dhpdev, DD_HALINFO *pHalInfo, DWORD *pdwNumHeaps,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VIDEOMEMORY *pvmList, DWORD *pdwNumFourCCCodes, DWORD *pdwFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* we could only have 1 heap, so it's not really a list */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvmList->fpEnd = pDev->layout.offDDrawHeap + pDev->layout.cbDDrawHeap - 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Always report number of heaps and supported FourCC's*/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVBoxDispDrvEnableDirectDraw(DHPDEV dhpdev, DD_CALLBACKS *pCallBacks, DD_SURFACECALLBACKS *pSurfaceCallBacks,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallBacks->CreateSurface = VBoxDispDDCreateSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallBacks->CanCreateSurface = VBoxDispDDCanCreateSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallBacks->dwFlags = DDHAL_CB32_CREATESURFACE|DDHAL_CB32_CANCREATESURFACE|DDHAL_CB32_MAPMEMORY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->dwSize = sizeof(DD_SURFACECALLBACKS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->dwFlags = DDHAL_SURFCB32_LOCK|DDHAL_SURFCB32_UNLOCK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPaletteCallBacks->dwSize = sizeof(DD_PALETTECALLBACKS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->DestroySurface = VBoxDispDDDestroySurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->GetFlipStatus = VBoxDispDDGetFlipStatus;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->GetBltStatus = VBoxDispDDGetBltStatus;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->SetColorKey = VBoxDispDDSetColorKey;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->UpdateOverlay = VBoxDispDDUpdateOverlay;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->SetOverlayPosition = VBoxDispDDSetOverlayPosition;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY|DDHAL_SURFCB32_SETOVERLAYPOSITION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVOID APIENTRY VBoxDispDrvDisableDirectDraw(DHPDEV dhpdev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHBITMAP APIENTRY VBoxDispDrvDeriveSurface(DD_DIRECTDRAW_GLOBAL *pDirectDraw, DD_SURFACE_LOCAL *pSurface)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)pDirectDraw->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSurface->ddsCaps.dwCaps & DDSCAPS_NONLOCALVIDMEM)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Can't derive surface DDSCAPS_NONLOCALVIDMEM"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSurface->lpSurfMore->ddsCapsEx.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Can't derive surface DDSCAPS2_TEXTUREMANAGE"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSurface->lpGbl->ddpfSurface.dwRGBBitCount != pDev->mode.ulBitsPerPel)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Create GDI managed bitmap, which resides in our DDraw heap memory */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hBitmap = EngCreateBitmap(size, pSurface->lpGbl->lPitch, pDev->surface.ulFormat,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync (PBYTE)pDev->memInfo.VideoRamBase + pSurface->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Screen surface, mark it so it will be recognized by the driver.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * so the driver will be called on any operations on the surface
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * (required for VBVA and VRDP).