9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox XPDM Display driver interface functions related to DirectDraw
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#include "VBoxDisp.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxDispDDraw.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void VBoxDispGetDDHalInfo(PVBOXDISPDEV pDev, DD_HALINFO *pHalInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pHalInfo, 0, sizeof(DD_HALINFO));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->dwSize = sizeof(DD_HALINFO);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* memory info */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
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
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwSize = sizeof(DDPIXELFORMAT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwFlags = DDPF_RGB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDev->surface.ulFormat == BMF_8BPP)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.ddpfDisplay.dwFlags |= DDPF_PALETTEINDEXED8;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
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
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.dwOffscreenAlign = 4;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.dwTextureAlign = 4;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.dwZBufferAlign = 4;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.dwOverlayAlign = 4;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->vmiData.pvPrimary = pDev->memInfo.FrameBufferBase;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* caps */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwSize = sizeof(DDNTCORECAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwCaps2 = DDCAPS2_WIDESURFACES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwVidMemTotal = pDev->layout.cbDDrawHeap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwVidMemFree = pDev->layout.cbDDrawHeap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called to get supported DirectDraw caps */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL APIENTRY
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsyncVBoxDispDrvGetDirectDrawInfo(DHPDEV dhpdev, DD_HALINFO *pHalInfo, DWORD *pdwNumHeaps,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VIDEOMEMORY *pvmList, DWORD *pdwNumFourCCCodes, DWORD *pdwFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispGetDDHalInfo(pDev, pHalInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pvmList && !pdwFourCC) /* first call */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VBoxDispVHWAInitHostInfo1(pDev);
537fd29f53a2dbf9a93091bb52a3ddb7f16ba97evboxsync VBOX_WARNRC_NOBP(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDev->vhwa.bEnabled)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VBoxDispVHWAUpdateDDHalInfo(pDev, pHalInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOX_WARNRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.bEnabled = RT_SUCCESS(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* we could only have 1 heap, so it's not really a list */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pvmList && pDev->layout.cbDDrawHeap>0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvmList->dwFlags = VIDMEM_ISLINEAR;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvmList->fpStart = pDev->layout.offDDrawHeap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvmList->fpEnd = pDev->layout.offDDrawHeap + pDev->layout.cbDDrawHeap - 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDev->vhwa.bEnabled)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvmList->ddsCaps.dwCaps = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvmList->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pvmList->ddsCapsAlt.dwCaps = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Always report number of heaps and supported FourCC's*/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *pdwNumHeaps = (pDev->layout.cbDDrawHeap>0) ? 1:0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifndef VBOX_WITH_VIDEOHWACCEL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *pdwNumFourCCCodes = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDev->vhwa.bEnabled)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *pdwNumFourCCCodes = pDev->vhwa.numFourCC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pdwFourCC && pDev->vhwa.numFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VBoxDispVHWAInitHostInfo2(pDev, pdwFourCC);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOX_WARNRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *pdwNumFourCCCodes = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.numFourCC = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->GetDriverInfo = VBoxDispDDGetDriverInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->dwFlags |= DDHALINFO_GETDRIVERINFOSET;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL APIENTRY
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVBoxDispDrvEnableDirectDraw(DHPDEV dhpdev, DD_CALLBACKS *pCallBacks, DD_SURFACECALLBACKS *pSurfaceCallBacks,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_PALETTECALLBACKS *pPaletteCallBacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallBacks->dwSize = sizeof(DD_CALLBACKS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallBacks->CreateSurface = VBoxDispDDCreateSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallBacks->CanCreateSurface = VBoxDispDDCanCreateSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallBacks->MapMemory = VBoxDispDDMapMemory;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallBacks->dwFlags = DDHAL_CB32_CREATESURFACE|DDHAL_CB32_CANCREATESURFACE|DDHAL_CB32_MAPMEMORY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->dwSize = sizeof(DD_SURFACECALLBACKS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->Lock = VBoxDispDDLock;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->Unlock = VBoxDispDDUnlock;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->dwFlags = DDHAL_SURFCB32_LOCK|DDHAL_SURFCB32_UNLOCK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPaletteCallBacks->dwSize = sizeof(DD_PALETTECALLBACKS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPaletteCallBacks->dwFlags = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDev->vhwa.bEnabled)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->DestroySurface = VBoxDispDDDestroySurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->Flip = VBoxDispDDFlip;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->GetFlipStatus = VBoxDispDDGetFlipStatus;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->Blt = VBoxDispDDBlt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->GetBltStatus = VBoxDispDDGetBltStatus;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->SetColorKey = VBoxDispDDSetColorKey;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDHAL_SURFCB32_FLIP|DDHAL_SURFCB32_GETFLIPSTATUS|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDHAL_SURFCB32_BLT|DDHAL_SURFCB32_GETBLTSTATUS|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDHAL_SURFCB32_SETCOLORKEY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDev->vhwa.caps & VBOXVHWA_CAPS_OVERLAY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->UpdateOverlay = VBoxDispDDUpdateOverlay;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->SetOverlayPosition = VBoxDispDDSetOverlayPosition;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurfaceCallBacks->dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY|DDHAL_SURFCB32_SETOVERLAYPOSITION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVOID APIENTRY VBoxDispDrvDisableDirectDraw(DHPDEV dhpdev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHBITMAP APIENTRY VBoxDispDrvDeriveSurface(DD_DIRECTDRAW_GLOBAL *pDirectDraw, DD_SURFACE_LOCAL *pSurface)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)pDirectDraw->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSurface->ddsCaps.dwCaps & DDSCAPS_NONLOCALVIDMEM)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Can't derive surface DDSCAPS_NONLOCALVIDMEM"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSurface->lpSurfMore->ddsCapsEx.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Can't derive surface DDSCAPS2_TEXTUREMANAGE"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSurface->lpGbl->ddpfSurface.dwRGBBitCount != pDev->mode.ulBitsPerPel)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Can't derive surface with different bpp"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pDev->surface.hSurface);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Create GDI managed bitmap, which resides in our DDraw heap memory */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HBITMAP hBitmap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync SIZEL size;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync size.cx = pDev->mode.ulWidth;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync size.cy = pDev->mode.ulHeight;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hBitmap = EngCreateBitmap(size, pSurface->lpGbl->lPitch, pDev->surface.ulFormat,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->mode.lScanlineStride>0 ? BMF_TOPDOWN:0,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync (PBYTE)pDev->memInfo.VideoRamBase + pSurface->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!hBitmap)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("EngCreateBitmap failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSurface->lpGbl->fpVidMem == 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
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).
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync SURFOBJ *pso;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3135ff35e81a82e504a4c0b8078e5ac50310f26avboxsync if (!EngAssociateSurface((HSURF)hBitmap, pDev->hDevGDI, pDev->flDrawingHooks))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
3135ff35e81a82e504a4c0b8078e5ac50310f26avboxsync WARN(("EngAssociateSurface failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync EngDeleteSurface((HSURF)hBitmap);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pso = EngLockSurface((HSURF)hBitmap);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pso)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("EngLockSurface failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync EngDeleteSurface((HSURF)hBitmap);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pso->dhpdev = (DHPDEV)pDev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync EngUnlockSurface(pso);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return hBitmap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}