enable.c revision 383c24a5b199735003fdfadc6c19c92273278cc5
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher/******************************Module*Header*******************************\
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* *******************
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* * GDI SAMPLE CODE *
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* *******************
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* This module contains the functions that enable and disable the
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* driver, the pdev, and the surface.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* Copyright (c) 1992-1998 Microsoft Corporation
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher\**************************************************************************/
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// The driver function table with all function index/address pairs
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Hook functions to track dirty rectangles and generate RDP orders.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// NT4 functions
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvEnablePDEV, (PFN) DrvEnablePDEV }, // 0
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV }, // 1
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvDisablePDEV, (PFN) DrvDisablePDEV }, // 2
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvEnableSurface, (PFN) DrvEnableSurface }, // 3
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek { INDEX_DrvDisableSurface, (PFN) DrvDisableSurface }, // 4
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek { INDEX_DrvAssertMode, (PFN) DrvAssertMode }, // 5
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl { INDEX_DrvDisableDriver, (PFN) DrvDisableDriver }, // 8
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl { INDEX_DrvCreateDeviceBitmap, (PFN) DrvCreateDeviceBitmap }, // 10
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvDeleteDeviceBitmap, (PFN) DrvDeleteDeviceBitmap }, // 11
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek { INDEX_DrvRealizeBrush, (PFN) DrvRealizeBrush }, // 12
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce { INDEX_DrvDitherColor, (PFN) DrvDitherColor }, // 13
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozek { INDEX_DrvStrokePath, (PFN) DrvStrokePath }, // 14
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvFillPath, (PFN) DrvFillPath }, // 15
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek { INDEX_DrvCopyBits, (PFN) DrvCopyBits }, // 19
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek { INDEX_DrvStretchBlt, (PFN) DrvStretchBlt, }, // 20
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvSetPalette, (PFN) DrvSetPalette }, // 22
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvSetPointerShape, (PFN) DrvSetPointerShape }, // 29
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvMovePointer, (PFN) DrvMovePointer }, // 30
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvSynchronize, (PFN) DrvSynchronize }, // 38
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvSaveScreenBits, (PFN) DrvSaveScreenBits }, // 40
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvGetDirectDrawInfo, (PFN) DrvGetDirectDrawInfo }, // 59 0x3b
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvEnableDirectDraw, (PFN) DrvEnableDirectDraw }, // 60 0x3c
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvDisableDirectDraw, (PFN) DrvDisableDirectDraw }, // 61 0x3d
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose/* Experimental begin */
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit BoseBOOL APIENTRY DrvResetPDEV(DHPDEV dhpdevOld, DHPDEV dhpdevNew)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, dhpdevOld, dhpdevNew));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit BoseBOOL DrvNineGrid (PVOID x1, PVOID x2, PVOID x3, PVOID x4, PVOID x5, PVOID x6, PVOID x7, PVOID x8, PVOID x9)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "Experimental %s: %p, %p, %p, %p, %p, %p, %p, %p, %p\n", __FUNCTION__, x1, x2, x3, x4, x5, x6, x7, x8, x9));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "Experimental %s: %p\n", __FUNCTION__, pfo));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit BoseULONG APIENTRY DrvEscape(SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "%s: %p, %p, %p, %p, %p, %p\n", __FUNCTION__, pso, iEsc, cjIn, pvIn, cjOut, pvOut));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "OPENGL_GETINFO invalid size %d\n", cjOut)); /* It doesn't matter that we fail here. Opengl32 will fall back to software rendering when this escape is not supported. */
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose if (ppdev->pInfo && vboxHwBufferBeginUpdate (ppdev))
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek && lpRgnData->rdh.dwSize == sizeof(RGNDATAHEADER)
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek && cjIn == lpRgnData->rdh.nCount * sizeof(RECT) + sizeof(RGNDATAHEADER))
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek pRTRect = (PRTRECT) EngAllocMem(0, lpRgnData->rdh.nCount*sizeof(RTRECT), ALLOC_TAG);
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik DISPDBG((0, "New visible rectangle (%d,%d) (%d,%d)\n", pRect[i].left, pRect[i].bottom, pRect[i].right, pRect[i].top));
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik DISPDBG((0, "DISP DrvAssertMode failed IOCTL_VIDEO_VBOX_SETVISIBLEREGION\n"));
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DISPDBG((0, "DISP IOCTL_VIDEO_VBOX_SETVISIBLEREGION successful\n"));
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DISPDBG((0, "check failed rdh.dwSize=%x iType=%d size=%d expected size=%d\n", lpRgnData->rdh.dwSize, lpRgnData->rdh.iType, cjIn, lpRgnData->rdh.nCount * sizeof(RECT) + sizeof(RGNDATAHEADER)));
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DISPDBG((0, "QUERYESCSUPPORT %d unsupported\n", nEscapeQuery));
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DISPDBG((0, "QUERYESCSUPPORT invalid size %d\n", cjOut));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Unsupported Escape %d\n", iEsc));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvConnect (PVOID x1, PVOID x2, PVOID x3, PVOID x4)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p, %p, %p\n", __FUNCTION__, x1, x2, x3, x4));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, x1, x2));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, x1, x2));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, x1, x2));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvShadowDisconnect (PVOID x1, PVOID x2)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, x1, x2));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher/* Experimental end */
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// W2K,XP functions
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvEnablePDEV, (PFN) DrvEnablePDEV }, // 0 0x0
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV }, // 1 0x1
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvDisablePDEV, (PFN) DrvDisablePDEV }, // 2 0x2
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvEnableSurface, (PFN) DrvEnableSurface }, // 3 0x3
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvDisableSurface, (PFN) DrvDisableSurface }, // 4 0x4
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvAssertMode, (PFN) DrvAssertMode }, // 5 0x5
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvDisableDriver, (PFN) DrvDisableDriver }, // 8 0x8
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvCreateDeviceBitmap, (PFN) DrvCreateDeviceBitmap }, // 10
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvDeleteDeviceBitmap, (PFN) DrvDeleteDeviceBitmap }, // 11
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvRealizeBrush, (PFN) DrvRealizeBrush }, // 12 0xc
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvDitherColor, (PFN) DrvDitherColor }, // 13 0xd
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvStrokePath, (PFN) DrvStrokePath }, // 14 0xe
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvFillPath, (PFN) DrvFillPath }, // 15 0xf
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvPaint, (PFN) DrvPaint }, // 17 0x11
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvBitBlt, (PFN) DrvBitBlt }, // 18 0x12
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvCopyBits, (PFN) DrvCopyBits }, // 19 0x13
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvStretchBlt, (PFN) DrvStretchBlt, }, // 20 0x14
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvSetPalette, (PFN) DrvSetPalette }, // 22 0x16
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvTextOut, (PFN) DrvTextOut }, // 23 0x17
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvEscape, (PFN) DrvEscape }, // 24 0x18
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvSetPointerShape, (PFN) DrvSetPointerShape }, // 29 0x1d
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvMovePointer, (PFN) DrvMovePointer }, // 30 0x1e
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvLineTo, (PFN) DrvLineTo }, // 31 0x1f
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvSynchronize, (PFN) DrvSynchronize }, // 38 0x26
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvSaveScreenBits, (PFN) DrvSaveScreenBits }, // 40 0x28
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvGetModes, (PFN) DrvGetModes }, // 41 0x29
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvGetDirectDrawInfo, (PFN) DrvGetDirectDrawInfo }, // 59 0x3b
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvEnableDirectDraw, (PFN) DrvEnableDirectDraw }, // 60 0x3c
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvDisableDirectDraw, (PFN) DrvDisableDirectDraw }, // 61 0x3d
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher//// { INDEX_DrvDeriveSurface, (PFN) DrvDeriveSurface }, // 85
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher { INDEX_DrvNotify, (PFN) DrvNotify }, // 87 0x57
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// /* Experimental. */
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x7, (PFN) DrvResetPDEV }, // 0x7
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x5b, (PFN) DrvNineGrid }, // 0x5b
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x2b, (PFN) DrvDestroyFont }, // 0x2b
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x18, (PFN) DrvEscape }, // 0x18
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x4d, (PFN) DrvConnect }, // 0x4d
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x4e, (PFN) DrvDisconnect }, // 0x4e
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x4f, (PFN) DrvReconnect }, // 0x4f
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x50, (PFN) DrvShadowConnect }, // 0x50
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// { 0x51, (PFN) DrvShadowDisconnect }, // 0x51
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Required hook bits will be set up according to DDI version
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher BOOL g_bOnNT40 = TRUE; /* assume NT4 guest by default */
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher/******************************Public*Routine******************************\
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* DrvEnableDriver
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* Enables the driver by retrieving the drivers function table and version.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher\**************************************************************************/
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvEnableDriver(ULONG iEngineVersion, ULONG cj, PDRVENABLEDATA pded)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Engine Version is passed down so future drivers can support previous
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// engine versions. A next generation driver can support both the old
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// and new engine conventions if told what version of engine it is
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// working with. For the first version the driver does nothing with it.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "VBoxDisp::DrvEnableDriver called. iEngine version = %08X\n", iEngineVersion));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // Set up hook flags to intercept all functions which can generate VRDP orders
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher gflHooks = HOOK_BITBLT | HOOK_TEXTOUT | HOOK_FILLPATH |
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher HOOK_COPYBITS | HOOK_STROKEPATH | HOOK_LINETO |
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher HOOK_PAINT | HOOK_STRETCHBLT | HOOK_SYNCHRONIZE;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher HOOK_PAINT | HOOK_STRETCHBLT | HOOK_SYNCHRONIZEACCESS;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // Set up g_bOnNT40 based on the value in iEngineVersion
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher if(iEngineVersion >= DDI_DRIVER_VERSION_NT5)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Fill in as much as we can.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher pded->pdrvfn = (iEngineVersion >= DDI_DRIVER_VERSION_NT5)?
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher pded->c = (iEngineVersion >= DDI_DRIVER_VERSION_NT5)?
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// DDI version this driver was targeted for is passed back to engine.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Future graphic's engine may break calls down to old driver format.
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher pded->iDriverVersion = (iEngineVersion >= DDI_DRIVER_VERSION_NT5)?
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher/******************************Public*Routine******************************\
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* DrvDisableDriver
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* Tells the driver it is being disabled. Release any resources allocated in
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* DrvEnableDriver.
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher\**************************************************************************/
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DISPDBG((0, "VBoxDisp::DrvDisableDriver called.\n"));
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher/******************************Public*Routine******************************\
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* DrvEnablePDEV
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* DDI function, Enables the Physical Device.
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* Return Value: device handle to pdev.
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher\**************************************************************************/
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherHSURF *ahsurfPatterns, // return standard patterns
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherULONG cjGdiInfo, // Length of memory pointed to by pGdiInfo
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherULONG *pGdiInfo, // Pointer to GdiInfo structure
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherULONG cjDevInfo, // Length of following PDEVINFO structure
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherDEVINFO *pDevInfo, // physical device information structure
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherPWSTR pwszDeviceName, // DeviceName - not used
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DISPDBG((0, "VBoxDisp::DrvEnablePDEV called\n"));
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher RtlZeroMemory(&DevInfo, sizeof (DEVINFO));
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher RtlZeroMemory(&GdiInfo, sizeof (GDIINFO));
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek // Allocate a physical device structure.
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek ppdev = (PPDEV) EngAllocMem(0, sizeof(PDEV), ALLOC_TAG);
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek DISPDBG((0, "DISP DrvEnablePDEV failed EngAllocMem\n"));
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek // Save the screen handle in the PDEV.
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek // Get the current screen mode information. Set up device caps and devinfo.
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek if (!bInitPDEV(ppdev, pDevmode, &GdiInfo, &DevInfo))
58dee4047788964ed4b0f6c5d6512967f390ac21Lukas Slebodnik // Initialize the cursor information.
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose // Not a fatal error...
58dee4047788964ed4b0f6c5d6512967f390ac21Lukas Slebodnik DISPDBG((0, "DrvEnablePDEV failed bInitPointer\n"));
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher // Initialize palette information.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "DrvEnablePDEV failed bInitPalette\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// // Start a thread that will process notifications from VMMDev
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// if (!bInitNotificationThread(ppdev))
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// DISPDBG((0, "DrvEnablePDEV failed bInitNotificationThread\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// goto error_free;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek // Copy the devinfo into the engine buffer.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvEnablePDEV: sizeof(DEVINFO) = %d, cjDevInfo = %d, alpha = %d\n", sizeof(DEVINFO), cjDevInfo, DevInfo.flGraphicsCaps2 & GCAPS2_ALPHACURSOR));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// @todo seems to be not necessary. these bits are initialized in screen.c DevInfo.flGraphicsCaps |= GCAPS_OPAQUERECT |
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// GCAPS_DITHERONREALIZE |
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// GCAPS_PALMANAGED |
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// GCAPS_ALTERNATEFILL |
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// GCAPS_WINDINGFILL |
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// GCAPS_MONO_DITHER |
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// GCAPS_COLOR_DITHER |
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// GCAPS_ASYNCMOVE;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// DevInfo.flGraphicsCaps |= GCAPS_DITHERONREALIZE;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DevInfo.flGraphicsCaps2 |= GCAPS2_RESERVED1; /* @todo figure out what is this. */
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek memcpy(pDevInfo, &DevInfo, min(sizeof(DEVINFO), cjDevInfo));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek // Set the pdevCaps with GdiInfo we have prepared to the list of caps for this
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek memcpy(pGdiInfo, &GdiInfo, min(cjGdiInfo, sizeof(GDIINFO)));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvEnablePDEV completed\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek // Error case for failure.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek/******************************Public*Routine******************************\
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* DrvCompletePDEV
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* Store the HPDEV, the engines handle for this PDEV, in the DHPDEV.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek\**************************************************************************/
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvCompletePDEV called\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek/******************************Public*Routine******************************\
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* DrvDisablePDEV
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* Release the resources allocated in DrvEnablePDEV. If a surface has been
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* enabled DrvDisableSurface will have already been called.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek\**************************************************************************/
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvDisablePDEV called\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// vStopNotificationThread ((PPDEV) dhpdev);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek /* Free the driver's VBVA resources. */
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek/******************************Public*Routine******************************\
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* VOID DrvOffset
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* DescriptionText
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce\**************************************************************************/
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo SorceBOOL DrvOffset(SURFOBJ *pso, LONG x, LONG y, FLONG flReserved)
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce DISPDBG((0, "VBoxDisp::DrvOffset %x %x %x\n", x, y, flReserved));
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce // Add back last offset that we subtracted. I could combine the next
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce // two statements, but I thought this was more clear. It's not
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce // performance critical anyway.
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce ppdev->pjScreen += ((ppdev->ptlOrg.y * ppdev->lDeltaScreen) +
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce (ppdev->ptlOrg.x * ((ppdev->ulBitCount+1) >> 3)));
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce // Subtract out new offset
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce/******************************Public*Routine******************************\
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce* DrvEnableSurface
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce* Enable the surface for the device. Hook the calls this driver supports.
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce* Return: Handle to the surface if successful, 0 for failure.
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce\**************************************************************************/
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface called\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // Create engine bitmap around frame buffer.
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed bInitSURF\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface bInitSURF success\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed to init the 8bpp palette\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek psurf = (PVBOXSURF)EngAllocMem(0, sizeof(VBOXSURF), ALLOC_TAG);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed pdsurf memory allocation\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // On NT4.0 we create a GDI managed bitmap as the primay surface. But
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // on NT5.0 we create a device managed primary.
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // On NT4.0 we still use our driver's accleration capabilities by
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // doing a trick with EngLockSurface on the GDI managed primary.
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek hsurf = (HSURF)EngCreateDeviceSurface((DHSURF)psurf, sizl,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed EngCreateDeviceBitmap\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // On NT5.0 we call EngModifSurface to expose our device surface to
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // GDI. We cant do this on NT4.0 hence we call EngAssociateSurface.
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // We have to associate the surface we just created with our physical
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // device so that GDI can get information related to the PDEV when
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // it's drawing to the surface (such as, for example, the length of
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // styles on the device when simulating styled lines).
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek // On NT4.0 we dont want to be called to Synchronize Access
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (!EngAssociateSurface(hsurf, ppdev->hdevEng, myflHooks))
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed EngAssociateSurface\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // Jam in the value of dhsurf into screen SURFOBJ. We do this to
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek // make sure the driver acclerates Drv calls we hook and not
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // punt them back to GDI as the SURFOBJ's dhsurf = 0.
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->psoScreenBitmap = EngLockSurface(hsurf);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed EngLockSurface\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->psoScreenBitmap->dhsurf = (DHSURF)hsurf;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // Tell GDI about the screen surface. This will enable GDI to render
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // directly to the screen.
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed EngModifySurface"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed EngCreateBitmap\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (!EngAssociateSurface(hsurf, ppdev->hdevEng, 0))
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed EngAssociateSurface for ScreenBitmap.\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek hsurf = (HSURF) EngCreateDeviceSurface((DHSURF)pso,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed EngCreateDeviceSurface\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek /* Must set dhsurf to make sure GDI doesn't ignore our hooks */
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->psoScreenBitmap->dhsurf = (DHSURF)hsurf;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek if (!EngAssociateSurface(hsurf, ppdev->hdevEng, flHooks))
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DISPDBG((0, "DISP DrvEnableSurface failed EngAssociateSurface for Screen.\n"));
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek#endif /* VBOX_NEW_SURFACE_CODE */
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek/******************************Public*Routine******************************\
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek* DrvDisableSurface
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek* Free resources allocated by DrvEnableSurface. Release the surface.
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek\**************************************************************************/
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DISPDBG((0, "VBoxDisp::DrvDisableSurface called\n"));
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek/******************************Public*Routine******************************\
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek* DrvAssertMode
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek* This asks the device to reset itself to the mode of the pdev passed in.
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek\**************************************************************************/
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DISPDBG((0, "DISP DrvAssertMode called bEnable = %d\n", bEnable));
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DISPDBG((0, "DISP DrvAssertMode failed bInitSURF\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode Screen pointer has changed!!!\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode failed EngCreateBitmap\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (!EngAssociateSurface(ppdev->hsurfScreenBitmap, ppdev->hdevEng, 0))
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode failed EngAssociateSurface for ScreenBitmap.\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (!EngAssociateSurface(ppdev->hsurfScreen, ppdev->hdevEng, ppdev->flHooks))
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode failed EngAssociateSurface for Screen.\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek // We must give up the display.
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek // Call the kernel driver to reset the device to a known state.
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode failed IOCTL\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek/******************************Public*Routine**********************************\
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * HBITMAP DrvCreateDeviceBitmap
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * Function called by GDI to create a device-format-bitmap (DFB). We will
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * always try to allocate the bitmap in off-screen; if we can't, we simply
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * fail the call and GDI will create and manage the bitmap itself.
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * Note: We do not have to zero the bitmap bits. GDI will automatically
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * call us via DrvBitBlt to zero the bits (which is a security
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * consideration).
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek\******************************************************************************/
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvCreateDeviceBitmap %x (%d,%d) %x\n", dhpdev, sizl.cx, sizl.cy, iFormat));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek /* Let GDI manage the bitmap */
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek/******************************Public*Routine**********************************\
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * VOID DrvDeleteDeviceBitmap
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * Deletes a DFB.
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek\******************************************************************************/
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvDeleteDeviceBitmap %x", dhsurf));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek/******************************Public*Routine******************************\
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek* DrvGetModes
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina* Returns the list of available modes for the device.
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina\**************************************************************************/
abac0f3ec2baa597d8e21a8744de6f33506299cePavel BřezinaULONG DrvGetModes(HANDLE hDriver, ULONG cjSize, DEVMODEW *pdm)
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina PVIDEO_MODE_INFORMATION pVideoModeInformation, pVideoTemp;
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina DWORD cOutputModes = cjSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina (PVIDEO_MODE_INFORMATION *) &pVideoModeInformation,
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina DISPDBG((0, "DrvGetModes failed to get mode information"));
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek cbOutputSize = cModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek // Now copy the information for the supported modes back into the output
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl // Zero the entire structure to start off with.
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl // Set the name of the device to the name of the DLL.
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl memcpy(pdm->dmDeviceName, DLL_NAME, sizeof(DLL_NAME));
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmBitsPerPel = pVideoTemp->NumberOfPlanes *
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmPelsHeight = pVideoTemp->VisScreenHeight;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmDisplayFrequency = pVideoTemp->Frequency;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl // Go to the next DEVMODE entry in the buffer.
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm = (LPDEVMODEW) ( ((ULONG_PTR)pdm) + sizeof(DEVMODEW)
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl cbOutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
4139a7a731f2831963a42b26aac111422be28792Jakub HrozekVOID DrvSynchronize(IN DHPDEV dhpdev,IN RECTL *prcl)
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DISPDBG((0, "VBoxDisp::DrvSynchronize\n"));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose/******************************Public*Routine******************************\
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek* Called by GDI to notify us of certain "interesting" events
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina* DN_DEVICE_ORIGIN is used to communicate the X/Y offsets of individual monitors
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek* when DualView is in effect.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher\**************************************************************************/
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce DISPDBG((3, "DN_DEVICE_ORIGIN: %d, %d (PSO = %p, pInfo = %p)\n", ppdev->ptlDevOrg.x,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->pInfo->screen.xOrigin = ppdev->ptlDevOrg.x;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->pInfo->screen.yOrigin = ppdev->ptlDevOrg.y;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((3, "DN_DRAWING_BEGIN (PSO = %p)\n", pso));
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl//--------------------------Public Routine-------------------------------------
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// HBITMAP DrvDeriveSurface
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek// This function derives and creates a GDI surface from the specified
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl// DirectDraw surface.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// pDirectDraw-----Points to a DD_DIRECTDRAW_GLOBAL structure that describes
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// the DirectDraw object.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// pSurface--------Points to a DD_SURFACE_LOCAL structure that describes the
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// DirectDraw surface around which to wrap a GDI surface.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Return Value
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// DrvDeriveSurface returns a handle to the created GDI surface upon success.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// It returns NULL if the call fails or if the driver cannot accelerate GDI
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// drawing to the specified DirectDraw surface.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// DrvDeriveSurface allows the driver to create a GDI surface around a
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// DirectDraw video memory or AGP surface object in order to allow accelerated
daa53f46d3ddcba0cbe2d23251c250794e576cf1Sumit Bose// GDI drawing to the surface. If the driver does not hook this call, all GDI
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// drawing to DirectDraw surfaces is done in software using the DIB engine.
89caf5edcc99f5731e89bd51e6ffaad3ec11c304Pavel Březina// GDI calls DrvDeriveSurface with RGB surfaces only.
89caf5edcc99f5731e89bd51e6ffaad3ec11c304Pavel Březina// The driver should call DrvCreateDeviceBitmap to create a GDI surface of the
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// same size and format as that of the DirectDraw surface. Space for the
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// actual pixels need not be allocated since it already exists.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher//-----------------------------------------------------------------------------
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherHBITMAP DrvDeriveSurface(DD_DIRECTDRAW_GLOBAL* pDirectDraw, DD_SURFACE_LOCAL* pSurface)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "%s: %p\n", __FUNCTION__, pDev));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // GDI should never call us for a non-RGB surface, but let's assert just
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // to make sure they're doing their job properly.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher AssertMsg(!(pSurfaceGlobal->ddpfSurface.dwFlags & DDPF_FOURCC), ("GDI called us with a non-RGB surface!"));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // The GDI driver does not accelerate surfaces in AGP memory,
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // thus we fail the call
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher if (pSurface->ddsCaps.dwCaps & DDSCAPS_NONLOCALVIDMEM)
if (hbmDevice)
NULL) )
return(hbmDevice);
DISPDBG((0, "pSurfaceGlobal->ddpfSurface.dwRGBBitCount = %d, lPitch =%ld\n", pSurfaceGlobal->ddpfSurface.dwRGBBitCount,pSurfaceGlobal->lPitch));