enable.c revision 383c24a5b199735003fdfadc6c19c92273278cc5
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher/******************************Module*Header*******************************\
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher*
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* *******************
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* * GDI SAMPLE CODE *
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* *******************
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher*
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* Module Name: enable.c
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher*
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* This module contains the functions that enable and disable the
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* driver, the pdev, and the surface.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher*
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* Copyright (c) 1992-1998 Microsoft Corporation
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher\**************************************************************************/
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#include "driver.h"
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#include "dd.h"
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#include <VBoxDisplay.h>
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// The driver function table with all function index/address pairs
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Hook functions to track dirty rectangles and generate RDP orders.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// NT4 functions
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherDRVFN gadrvfn_nt4[] = {
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
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek { INDEX_DrvOffset, (PFN) DrvOffset }, // 6
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_DrvPaint, (PFN) DrvPaint }, // 17
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek { INDEX_DrvBitBlt, (PFN) DrvBitBlt }, // 18
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek { INDEX_DrvCopyBits, (PFN) DrvCopyBits }, // 19
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek { INDEX_DrvStretchBlt, (PFN) DrvStretchBlt, }, // 20
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvSetPalette, (PFN) DrvSetPalette }, // 22
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvTextOut, (PFN) DrvTextOut }, // 23
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvEscape, (PFN) DrvEscape }, // 24
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvSetPointerShape, (PFN) DrvSetPointerShape }, // 29
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvMovePointer, (PFN) DrvMovePointer }, // 30
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvLineTo, (PFN) DrvLineTo }, // 31
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvSynchronize, (PFN) DrvSynchronize }, // 38
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvSaveScreenBits, (PFN) DrvSaveScreenBits }, // 40
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose { INDEX_DrvGetModes, (PFN) DrvGetModes }, // 41
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose#ifdef VBOX_WITH_DDRAW
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#endif
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose};
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose/* Experimental begin */
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit BoseBOOL APIENTRY DrvResetPDEV(DHPDEV dhpdevOld, DHPDEV dhpdevNew)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose{
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, dhpdevOld, dhpdevNew));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose return TRUE;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose}
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit BoseBOOL DrvNineGrid (PVOID x1, PVOID x2, PVOID x3, PVOID x4, PVOID x5, PVOID x6, PVOID x7, PVOID x8, PVOID x9)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose{
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 return FALSE;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose}
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit BoseVOID APIENTRY DrvDestroyFont(FONTOBJ *pfo)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose{
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "Experimental %s: %p\n", __FUNCTION__, pfo));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose}
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit BoseULONG APIENTRY DrvEscape(SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose{
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose PDEV* ppdev = (PDEV*) pso->dhpdev;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "%s: %p, %p, %p, %p, %p, %p\n", __FUNCTION__, pso, iEsc, cjIn, pvIn, cjOut, pvOut));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose switch(iEsc)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose {
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose#ifdef VBOX_WITH_OPENGL
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose case OPENGL_GETINFO:
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose {
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose if ( cjOut >= sizeof(OPENGL_INFO)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose && pvOut)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose {
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose POPENGL_INFO pInfo = (POPENGL_INFO)pvOut;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->dwVersion = 2;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->dwDriverVersion = 1;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->szDriverName[0] = 'V';
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->szDriverName[1] = 'B';
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->szDriverName[2] = 'o';
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->szDriverName[3] = 'x';
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->szDriverName[4] = 'O';
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->szDriverName[5] = 'G';
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->szDriverName[6] = 'L';
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose pInfo->szDriverName[7] = 0;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose DISPDBG((0, "OPENGL_GETINFO\n"));
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose return cjOut;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose }
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose else
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 break;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose }
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose#endif
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose case VBOXESC_ISVRDPACTIVE:
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose {
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose ULONG ret = 0;
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose if (ppdev->pInfo && vboxHwBufferBeginUpdate (ppdev))
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose {
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose if (ppdev->vbva.pVbvaMemory->fu32ModeFlags
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose & VBVA_F_MODE_VRDP)
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose {
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek ret = 1;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek vboxHwBufferEndUpdate (ppdev);
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek return ret;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek case VBOXESC_SETVISIBLEREGION:
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek {
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek LPRGNDATA lpRgnData = (LPRGNDATA)pvIn;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DISPDBG((0, "VBOXESC_SETVISIBLEREGION\n"));
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek if ( cjIn >= sizeof(RGNDATAHEADER)
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek && pvIn
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek && lpRgnData->rdh.dwSize == sizeof(RGNDATAHEADER)
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek && lpRgnData->rdh.iType == RDH_RECTANGLES
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek && cjIn == lpRgnData->rdh.nCount * sizeof(RECT) + sizeof(RGNDATAHEADER))
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek {
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DWORD ulReturn, i;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek PRTRECT pRTRect;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek RECT *pRect = (RECT *)&lpRgnData->Buffer;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek pRTRect = (PRTRECT) EngAllocMem(0, lpRgnData->rdh.nCount*sizeof(RTRECT), ALLOC_TAG);
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek for (i=0;i<lpRgnData->rdh.nCount;i++)
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek {
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 pRTRect[i].xLeft = pRect[i].left;
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik pRTRect[i].yBottom = pRect[i].bottom;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek pRTRect[i].xRight = pRect[i].right;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek pRTRect[i].yTop = pRect[i].top;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek if (EngDeviceIoControl(ppdev->hDriver,
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek IOCTL_VIDEO_VBOX_SETVISIBLEREGION,
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek pRTRect,
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik lpRgnData->rdh.nCount*sizeof(RTRECT),
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek NULL,
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik 0,
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik &ulReturn))
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik {
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik DISPDBG((0, "DISP DrvAssertMode failed IOCTL_VIDEO_VBOX_SETVISIBLEREGION\n"));
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik return 0;
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek else
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek {
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DISPDBG((0, "DISP IOCTL_VIDEO_VBOX_SETVISIBLEREGION successful\n"));
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek return 1;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik }
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik else
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek {
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek if (pvIn)
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 }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek break;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek }
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik case QUERYESCSUPPORT:
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik if ( cjIn == sizeof(DWORD)
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik && pvIn)
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik {
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik DWORD nEscapeQuery = *(DWORD *)pvIn;
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik switch(nEscapeQuery)
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik {
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik#ifdef VBOX_WITH_OPENGL
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik case OPENGL_GETINFO:
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik return 1;
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik#endif
852722ecb5dc09fc80cd3c837edb1cf6db529210Lukas Slebodnik default:
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DISPDBG((0, "QUERYESCSUPPORT %d unsupported\n", nEscapeQuery));
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek break;
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek }
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek else
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek DISPDBG((0, "QUERYESCSUPPORT invalid size %d\n", cjOut));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher break;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher default:
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Unsupported Escape %d\n", iEsc));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher break;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher }
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher return 0;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher}
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvConnect (PVOID x1, PVOID x2, PVOID x3, PVOID x4)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher{
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p, %p, %p\n", __FUNCTION__, x1, x2, x3, x4));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher return TRUE;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher}
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvDisconnect (PVOID x1, PVOID x2)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher{
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, x1, x2));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher return FALSE;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher}
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvReconnect (PVOID x1, PVOID x2)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher{
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, x1, x2));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher return FALSE;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher}
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvShadowConnect (PVOID x1, PVOID x2)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher{
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, x1, x2));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher return FALSE;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher}
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvShadowDisconnect (PVOID x1, PVOID x2)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher{
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "Experimental %s: %p, %p\n", __FUNCTION__, x1, x2));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher return FALSE;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher}
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher/* Experimental end */
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// W2K,XP functions
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherDRVFN gadrvfn_nt5[] = {
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#ifdef VBOX_WITH_DDRAW
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 /** @todo */
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher//// { INDEX_DrvDeriveSurface, (PFN) DrvDeriveSurface }, // 85
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#endif
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
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher};
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Required hook bits will be set up according to DDI version
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagherstatic ULONG gflHooks = 0;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher BOOL g_bOnNT40 = TRUE; /* assume NT4 guest by default */
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#define HOOKS_BMF8BPP gflHooks
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#define HOOKS_BMF16BPP gflHooks
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#define HOOKS_BMF24BPP gflHooks
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#define HOOKS_BMF32BPP gflHooks
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherHSEMAPHORE ghsemHwBuffer = 0;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher/******************************Public*Routine******************************\
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* DrvEnableDriver
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher*
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher* Enables the driver by retrieving the drivers function table and version.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher*
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher\**************************************************************************/
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherBOOL DrvEnableDriver(ULONG iEngineVersion, ULONG cj, PDRVENABLEDATA pded)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher{
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
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "VBoxDisp::DrvEnableDriver called. iEngine version = %08X\n", iEngineVersion));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
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#ifdef VBOX_NEW_SURFACE_CODE
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher HOOK_PAINT | HOOK_STRETCHBLT | HOOK_SYNCHRONIZE;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#else
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher HOOK_PAINT | HOOK_STRETCHBLT | HOOK_SYNCHRONIZEACCESS;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher#endif
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // Set up g_bOnNT40 based on the value in iEngineVersion
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher if(iEngineVersion >= DDI_DRIVER_VERSION_NT5)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher g_bOnNT40 = FALSE;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Fill in as much as we can.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher if (cj >= sizeof(DRVENABLEDATA))
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher pded->pdrvfn = (iEngineVersion >= DDI_DRIVER_VERSION_NT5)?
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher gadrvfn_nt5:
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher gadrvfn_nt4;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher if (cj >= (sizeof(ULONG) * 2))
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher pded->c = (iEngineVersion >= DDI_DRIVER_VERSION_NT5)?
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher sizeof(gadrvfn_nt5) / sizeof(DRVFN):
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher sizeof(gadrvfn_nt4) / sizeof(DRVFN);
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
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.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher if (cj >= sizeof(ULONG))
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher pded->iDriverVersion = (iEngineVersion >= DDI_DRIVER_VERSION_NT5)?
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DDI_DRIVER_VERSION_NT5:
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DDI_DRIVER_VERSION_NT4;
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher if (!ghsemHwBuffer)
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher {
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher ghsemHwBuffer = EngCreateSemaphore ();
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher }
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher return(TRUE);
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher}
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher/******************************Public*Routine******************************\
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* DrvDisableDriver
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher*
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* Tells the driver it is being disabled. Release any resources allocated in
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* DrvEnableDriver.
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher*
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher\**************************************************************************/
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherVOID DrvDisableDriver(VOID)
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher{
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DISPDBG((0, "VBoxDisp::DrvDisableDriver called.\n"));
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher if (ghsemHwBuffer)
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher {
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher EngDeleteSemaphore (ghsemHwBuffer);
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher ghsemHwBuffer = NULL;
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher }
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher return;
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher}
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher/******************************Public*Routine******************************\
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* DrvEnablePDEV
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher*
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* DDI function, Enables the Physical Device.
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher*
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher* Return Value: device handle to pdev.
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher*
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher\**************************************************************************/
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherDHPDEV DrvEnablePDEV(
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherDEVMODEW *pDevmode, // Pointer to DEVMODE
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherPWSTR pwszLogAddress, // Logical address
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherULONG cPatterns, // number of patterns
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 GallagherHDEV hdev, // HDEV, used for callbacks
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherPWSTR pwszDeviceName, // DeviceName - not used
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen GallagherHANDLE hDriver) // Handle to base driver
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher{
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher GDIINFO GdiInfo;
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DEVINFO DevInfo;
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher PPDEV ppdev = (PPDEV) NULL;
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DISPDBG((0, "VBoxDisp::DrvEnablePDEV called\n"));
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher UNREFERENCED_PARAMETER(pwszLogAddress);
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher UNREFERENCED_PARAMETER(pwszDeviceName);
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher RtlZeroMemory(&DevInfo, sizeof (DEVINFO));
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher RtlZeroMemory(&GdiInfo, sizeof (GDIINFO));
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek // Allocate a physical device structure.
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek ppdev = (PPDEV) EngAllocMem(0, sizeof(PDEV), ALLOC_TAG);
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek if (ppdev == (PPDEV) NULL)
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek {
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek DISPDBG((0, "DISP DrvEnablePDEV failed EngAllocMem\n"));
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek return((DHPDEV) 0);
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek }
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek memset(ppdev, 0, sizeof(PDEV));
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek // Save the screen handle in the PDEV.
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek ppdev->hDriver = hDriver;
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek // Get the current screen mode information. Set up device caps and devinfo.
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek if (!bInitPDEV(ppdev, pDevmode, &GdiInfo, &DevInfo))
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose {
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose DISPDBG((0,"DISP DrvEnablePDEV failed\n"));
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose goto error_free;
58dee4047788964ed4b0f6c5d6512967f390ac21Lukas Slebodnik }
58dee4047788964ed4b0f6c5d6512967f390ac21Lukas Slebodnik
58dee4047788964ed4b0f6c5d6512967f390ac21Lukas Slebodnik // Initialize the cursor information.
58dee4047788964ed4b0f6c5d6512967f390ac21Lukas Slebodnik
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose if (!bInitPointer(ppdev, &DevInfo))
58dee4047788964ed4b0f6c5d6512967f390ac21Lukas Slebodnik {
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose // Not a fatal error...
58dee4047788964ed4b0f6c5d6512967f390ac21Lukas Slebodnik DISPDBG((0, "DrvEnablePDEV failed bInitPointer\n"));
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose }
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher // Initialize palette information.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek if (!bInitPaletteInfo(ppdev, &DevInfo))
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek {
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "DrvEnablePDEV failed bInitPalette\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek goto error_free;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek }
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// // Start a thread that will process notifications from VMMDev
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// if (!bInitNotificationThread(ppdev))
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// {
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// DISPDBG((0, "DrvEnablePDEV failed bInitNotificationThread\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// goto error_free;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// }
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek // Copy the devinfo into the engine buffer.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvEnablePDEV: sizeof(DEVINFO) = %d, cjDevInfo = %d, alpha = %d\n", sizeof(DEVINFO), cjDevInfo, DevInfo.flGraphicsCaps2 & GCAPS2_ALPHACURSOR));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
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//
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// DevInfo.flGraphicsCaps |= GCAPS_DITHERONREALIZE;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DevInfo.flGraphicsCaps2 |= GCAPS2_RESERVED1; /* @todo figure out what is this. */
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek memcpy(pDevInfo, &DevInfo, min(sizeof(DEVINFO), cjDevInfo));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek // Set the pdevCaps with GdiInfo we have prepared to the list of caps for this
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek // pdev.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek memcpy(pGdiInfo, &GdiInfo, min(cjGdiInfo, sizeof(GDIINFO)));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvEnablePDEV completed\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek return((DHPDEV) ppdev);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek // Error case for failure.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozekerror_free:
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek EngFreeMem(ppdev);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek return((DHPDEV) 0);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek}
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek/******************************Public*Routine******************************\
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* DrvCompletePDEV
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek*
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* Store the HPDEV, the engines handle for this PDEV, in the DHPDEV.
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek*
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek\**************************************************************************/
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub HrozekVOID DrvCompletePDEV(DHPDEV dhpdev, HDEV hdev)
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek{
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvCompletePDEV called\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek ((PPDEV) dhpdev)->hdevEng = hdev;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek}
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek/******************************Public*Routine******************************\
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* DrvDisablePDEV
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek*
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\**************************************************************************/
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub HrozekVOID DrvDisablePDEV(DHPDEV dhpdev)
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek{
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvDisablePDEV called\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// vStopNotificationThread ((PPDEV) dhpdev);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek vDisablePalette((PPDEV) dhpdev);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek /* Free the driver's VBVA resources. */
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek vboxVbvaDisable ((PPDEV) dhpdev);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek EngFreeMem(dhpdev);
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek}
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek/******************************Public*Routine******************************\
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* VOID DrvOffset
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek*
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek* DescriptionText
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce*
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce\**************************************************************************/
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo SorceBOOL DrvOffset(SURFOBJ *pso, LONG x, LONG y, FLONG flReserved)
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce{
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce PDEV* ppdev = (PDEV*) pso->dhpdev;
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce DISPDBG((0, "VBoxDisp::DrvOffset %x %x %x\n", x, y, flReserved));
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce
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
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce ppdev->pjScreen += ((ppdev->ptlOrg.y * ppdev->lDeltaScreen) +
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce (ppdev->ptlOrg.x * ((ppdev->ulBitCount+1) >> 3)));
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce // Subtract out new offset
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce ppdev->pjScreen -= ((y * ppdev->lDeltaScreen) +
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce (x * ((ppdev->ulBitCount+1) >> 3)));
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce ppdev->ptlOrg.x = x;
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce ppdev->ptlOrg.y = y;
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce return(TRUE);
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce}
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce/******************************Public*Routine******************************\
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce* DrvEnableSurface
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce*
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce* Enable the surface for the device. Hook the calls this driver supports.
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce*
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce* Return: Handle to the surface if successful, 0 for failure.
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce*
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce\**************************************************************************/
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce
8df169fdffb564ec932fede4216a123a71f1cc9aSimo SorceHSURF DrvEnableSurface(DHPDEV dhpdev)
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce{
2aa96da5f3a9485d598e345e183a59a4b8e80abbLukas Slebodnik PPDEV ppdev;
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce HSURF hsurf;
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce SIZEL sizl;
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce ULONG ulBitmapType;
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce FLONG flHooks;
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce#ifdef VBOX_NEW_SURFACE_CODE
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce PVBOXSURF psurf;
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce#endif
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface called\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // Create engine bitmap around frame buffer.
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev = (PPDEV) dhpdev;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->ptlOrg.x = 0;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->ptlOrg.y = 0;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (!bInitSURF(ppdev, TRUE))
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed bInitSURF\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek return(FALSE);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface bInitSURF success\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek sizl.cx = ppdev->cxScreen;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek sizl.cy = ppdev->cyScreen;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (ppdev->ulBitCount == 8)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (!bInit256ColorPalette(ppdev)) {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed to init the 8bpp palette\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek return(FALSE);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ulBitmapType = BMF_8BPP;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek flHooks = HOOKS_BMF8BPP;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek else if (ppdev->ulBitCount == 16)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ulBitmapType = BMF_16BPP;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek flHooks = HOOKS_BMF16BPP;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek else if (ppdev->ulBitCount == 24)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ulBitmapType = BMF_24BPP;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek flHooks = HOOKS_BMF24BPP;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek else
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ulBitmapType = BMF_32BPP;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek flHooks = HOOKS_BMF32BPP;
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek#ifdef VBOX_NEW_SURFACE_CODE
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek psurf = (PVBOXSURF)EngAllocMem(0, sizeof(VBOXSURF), ALLOC_TAG);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (psurf == NULL)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed pdsurf memory allocation\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek goto l_Failure;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->pdsurfScreen = psurf;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek psurf->ppdev = ppdev;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
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 //
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 //
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if(g_bOnNT40)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek hsurf = (HSURF) EngCreateBitmap(sizl,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->lDeltaScreen,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ulBitmapType,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek (ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek (PVOID)(ppdev->pjScreen));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek else
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek hsurf = (HSURF)EngCreateDeviceSurface((DHSURF)psurf, sizl,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ulBitmapType);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if ( hsurf == 0 )
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed EngCreateDeviceBitmap\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek goto l_Failure;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
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 //
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if(g_bOnNT40)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
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).
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek // On NT4.0 we dont want to be called to Synchronize Access
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek LONG myflHooks = flHooks;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek myflHooks &= ~HOOK_SYNCHRONIZE;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (!EngAssociateSurface(hsurf, ppdev->hdevEng, myflHooks))
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed EngAssociateSurface\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek goto l_Failure;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
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 //
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->psoScreenBitmap = EngLockSurface(hsurf);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if(ppdev->psoScreenBitmap == 0)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed EngLockSurface\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek goto l_Failure;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->psoScreenBitmap->dhsurf = (DHSURF)hsurf;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek else
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // Tell GDI about the screen surface. This will enable GDI to render
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek // directly to the screen.
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek //
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if ( !EngModifySurface(hsurf,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->hdevEng,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek flHooks,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek MS_NOTSYSTEMMEMORY,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek (DHSURF)psurf,
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek ppdev->pjScreen,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->lDeltaScreen,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek NULL))
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DrvEnableSurface: failed EngModifySurface"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek goto l_Failure;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->hsurfScreen = hsurf;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->flHooks = flHooks;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->ulBitmapType = ulBitmapType;
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek#else
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek hsurf = (HSURF) EngCreateBitmap(sizl,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->lDeltaScreen,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ulBitmapType,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek (ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek (PVOID) (ppdev->pjScreen));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (hsurf == (HSURF) 0)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed EngCreateBitmap\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek goto l_Failure;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek else
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->hsurfScreenBitmap = hsurf;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (!EngAssociateSurface(hsurf, ppdev->hdevEng, 0))
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed EngAssociateSurface for ScreenBitmap.\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek goto l_Failure;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek else
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek SURFOBJ *pso = EngLockSurface(hsurf);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->psoScreenBitmap = pso;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek hsurf = (HSURF) EngCreateDeviceSurface((DHSURF)pso,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek sizl,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ulBitmapType);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek
9959c512ac3ba36f7a0db7614f0357ce0bae748fJakub Hrozek if (hsurf == (HSURF) 0)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((0, "DISP DrvEnableSurface failed EngCreateDeviceSurface\n"));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek goto l_Failure;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek else
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->hsurfScreen = hsurf;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek /* Must set dhsurf to make sure GDI doesn't ignore our hooks */
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->psoScreenBitmap->dhsurf = (DHSURF)hsurf;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek if (!EngAssociateSurface(hsurf, ppdev->hdevEng, flHooks))
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DISPDBG((0, "DISP DrvEnableSurface failed EngAssociateSurface for Screen.\n"));
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek goto l_Failure;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek else
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ppdev->flHooks = flHooks;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ppdev->ulBitmapType = ulBitmapType;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek#endif /* VBOX_NEW_SURFACE_CODE */
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek return ppdev->hsurfScreen;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidekl_Failure:
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DrvDisableSurface(dhpdev);
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek return((HSURF)0);
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek}
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek/******************************Public*Routine******************************\
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek* DrvDisableSurface
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek*
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek* Free resources allocated by DrvEnableSurface. Release the surface.
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek*
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek\**************************************************************************/
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal ZidekVOID DrvDisableSurface(DHPDEV dhpdev)
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek{
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek PPDEV ppdev = (PPDEV)dhpdev;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DISPDBG((0, "VBoxDisp::DrvDisableSurface called\n"));
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek if (ppdev->psoScreenBitmap)
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek EngUnlockSurface (ppdev->psoScreenBitmap);
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ppdev->psoScreenBitmap = NULL;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek if (ppdev->hsurfScreen)
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek EngDeleteSurface(ppdev->hsurfScreen);
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ppdev->hsurfScreen = (HSURF)0;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek#ifdef VBOX_NEW_SURFACE_CODE
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek if (ppdev->pdsurfScreen)
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek EngFreeMem(ppdev->pdsurfScreen);
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ppdev->pdsurfScreen = NULL;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek#else
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek if (ppdev->hsurfScreenBitmap)
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek EngDeleteSurface(ppdev->hsurfScreenBitmap);
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ppdev->hsurfScreenBitmap = (HSURF)0;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek#endif
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek vDisableSURF(ppdev);
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek}
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek/******************************Public*Routine******************************\
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek* DrvAssertMode
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek*
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek* This asks the device to reset itself to the mode of the pdev passed in.
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek*
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek\**************************************************************************/
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal ZidekBOOL DrvAssertMode(DHPDEV dhpdev, BOOL bEnable)
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek{
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek PPDEV ppdev = (PPDEV) dhpdev;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ULONG ulReturn;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek PBYTE pjScreen;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DISPDBG((0, "DISP DrvAssertMode called bEnable = %d\n", bEnable));
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek if (bEnable)
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek pjScreen = ppdev->pjScreen;
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek if (!bInitSURF(ppdev, FALSE))
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek DISPDBG((0, "DISP DrvAssertMode failed bInitSURF\n"));
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek return (FALSE);
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek }
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek#ifdef VBOX_NEW_SURFACE_CODE
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek todo
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek#endif
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (pjScreen != ppdev->pjScreen)
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek HSURF hsurf;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek SIZEL sizl;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek SURFOBJ *pso;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode Screen pointer has changed!!!\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek sizl.cx = ppdev->cxScreen;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek sizl.cy = ppdev->cyScreen;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek hsurf = (HSURF) EngCreateBitmap(sizl,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek ppdev->lDeltaScreen,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek ppdev->ulBitmapType,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek (ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek (PVOID) (ppdev->pjScreen));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (hsurf == (HSURF) 0)
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode failed EngCreateBitmap\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek return FALSE;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek pso = EngLockSurface(hsurf);
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (ppdev->psoScreenBitmap)
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek EngUnlockSurface (ppdev->psoScreenBitmap);
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek ppdev->psoScreenBitmap = NULL;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (ppdev->hsurfScreenBitmap)
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek EngDeleteSurface(ppdev->hsurfScreenBitmap);
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek ppdev->hsurfScreenBitmap = (HSURF)0;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek ppdev->hsurfScreenBitmap = hsurf;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek ppdev->psoScreenBitmap = pso;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (!EngAssociateSurface(ppdev->hsurfScreenBitmap, ppdev->hdevEng, 0))
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode failed EngAssociateSurface for ScreenBitmap.\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek return FALSE;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (!EngAssociateSurface(ppdev->hsurfScreen, ppdev->hdevEng, ppdev->flHooks))
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode failed EngAssociateSurface for Screen.\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek return FALSE;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek return TRUE;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek else
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek //
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek // We must give up the display.
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek // Call the kernel driver to reset the device to a known state.
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek //
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek if (EngDeviceIoControl(ppdev->hDriver,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek IOCTL_VIDEO_RESET_DEVICE,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek NULL,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek 0,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek NULL,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek 0,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek &ulReturn))
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvAssertMode failed IOCTL\n"));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek return FALSE;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek else
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek {
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek return TRUE;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek }
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek}
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek/******************************Public*Routine**********************************\
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * HBITMAP DrvCreateDeviceBitmap
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek *
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 *
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\******************************************************************************/
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal ZidekHBITMAP
2e57e339798f47ad84cae9121559d19192b79146Michal ZidekDrvCreateDeviceBitmap(
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DHPDEV dhpdev,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek SIZEL sizl,
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek ULONG iFormat)
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 return (HBITMAP)0;
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek}
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek/******************************Public*Routine**********************************\
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * VOID DrvDeleteDeviceBitmap
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek *
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek * Deletes a DFB.
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek *
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek\******************************************************************************/
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal ZidekVOID
2e57e339798f47ad84cae9121559d19192b79146Michal ZidekDrvDeleteDeviceBitmap(
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DHSURF dhsurf)
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek{
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek DISPDBG((0, "DISP DrvDeleteDeviceBitmap %x", dhsurf));
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek}
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek/******************************Public*Routine******************************\
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek* DrvGetModes
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek*
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina* Returns the list of available modes for the device.
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina*
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina\**************************************************************************/
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina
abac0f3ec2baa597d8e21a8744de6f33506299cePavel BřezinaULONG DrvGetModes(HANDLE hDriver, ULONG cjSize, DEVMODEW *pdm)
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina{
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina DWORD cModes;
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina DWORD cbOutputSize;
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina PVIDEO_MODE_INFORMATION pVideoModeInformation, pVideoTemp;
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina DWORD cOutputModes = cjSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina DWORD cbModeSize;
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina DISPDBG((3, "DrvGetModes\n"));
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina cModes = getAvailableModes(hDriver,
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina (PVIDEO_MODE_INFORMATION *) &pVideoModeInformation,
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina &cbModeSize);
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina if (cModes == 0)
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina {
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina DISPDBG((0, "DrvGetModes failed to get mode information"));
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina return 0;
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina }
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina if (pdm == NULL)
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina {
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek cbOutputSize = cModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek }
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek else
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek {
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek //
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek // Now copy the information for the supported modes back into the output
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek // buffer
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek //
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek cbOutputSize = 0;
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek pVideoTemp = pVideoModeInformation;
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek do
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek {
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek if (pVideoTemp->Length != 0)
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek {
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek if (cOutputModes == 0)
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek {
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek break;
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek }
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl //
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl // Zero the entire structure to start off with.
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl //
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl memset(pdm, 0, sizeof(DEVMODEW));
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl //
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl // Set the name of the device to the name of the DLL.
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl //
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl memcpy(pdm->dmDeviceName, DLL_NAME, sizeof(DLL_NAME));
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmSpecVersion = DM_SPECVERSION;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmDriverVersion = DM_SPECVERSION;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmSize = sizeof(DEVMODEW);
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmDriverExtra = DRIVER_EXTRA_SIZE;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmBitsPerPel = pVideoTemp->NumberOfPlanes *
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pVideoTemp->BitsPerPlane;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmPelsWidth = pVideoTemp->VisScreenWidth;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmPelsHeight = pVideoTemp->VisScreenHeight;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmDisplayFrequency = pVideoTemp->Frequency;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmDisplayFlags = 0;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm->dmFields = DM_BITSPERPEL |
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl DM_PELSWIDTH |
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl DM_PELSHEIGHT |
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl DM_DISPLAYFREQUENCY |
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl DM_DISPLAYFLAGS ;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl //
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl // Go to the next DEVMODE entry in the buffer.
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl //
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl cOutputModes--;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pdm = (LPDEVMODEW) ( ((ULONG_PTR)pdm) + sizeof(DEVMODEW)
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl + DRIVER_EXTRA_SIZE);
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl cbOutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl }
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl pVideoTemp = (PVIDEO_MODE_INFORMATION)
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl (((PUCHAR)pVideoTemp) + cbModeSize);
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl } while (--cModes);
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher }
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher EngFreeMem(pVideoModeInformation);
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher return cbOutputSize;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose}
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozek
4139a7a731f2831963a42b26aac111422be28792Jakub HrozekVOID DrvSynchronize(IN DHPDEV dhpdev,IN RECTL *prcl)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher{
ca92350db6ad6ac344181f7b8ec695eda29da675Stephen Gallagher DISPDBG((0, "VBoxDisp::DrvSynchronize\n"));
f15683b4b100351e24e305d25bd4785c79ac8f55Sumit Bose}
9873e54960fcbd65fd2f6c7d3404f8a1256ae759Jakub Hrozek
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose/******************************Public*Routine******************************\
032d0980dfe5a27a5954f44f9d519e03fc7d1cedSumit Bose* DrvNotify
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek*
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek* Called by GDI to notify us of certain "interesting" events
2e57e339798f47ad84cae9121559d19192b79146Michal Zidek*
abac0f3ec2baa597d8e21a8744de6f33506299cePavel Březina* DN_DEVICE_ORIGIN is used to communicate the X/Y offsets of individual monitors
5246ab9134aa2c8b977b3b1f7b0929cfbbaf951fJakub Hrozek* when DualView is in effect.
f3d91181d4ee9da3f8bbf4ddf8782951c0ae46c1Jakub Hrozek*
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher\**************************************************************************/
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbea04f585a30d001b574317c068cd03a4fa332bJakub HrozekVOID DrvNotify(
e5ea29f68a2fa08754c7685ef73dbf91ec9b581bSimo SorceSURFOBJ *pso,
e5ea29f68a2fa08754c7685ef73dbf91ec9b581bSimo SorceULONG iType,
e5ea29f68a2fa08754c7685ef73dbf91ec9b581bSimo SorcePVOID pvData)
e5ea29f68a2fa08754c7685ef73dbf91ec9b581bSimo Sorce{
e5ea29f68a2fa08754c7685ef73dbf91ec9b581bSimo Sorce PDEV* ppdev = (PDEV*) pso->dhpdev;
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek DISPDBG((0, "VBoxDisp::DrvNotify called.\n"));
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce switch(iType)
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce {
8df169fdffb564ec932fede4216a123a71f1cc9aSimo Sorce case DN_DEVICE_ORIGIN:
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce ppdev->ptlDevOrg = *(PPOINTL)pvData;
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce DISPDBG((3, "DN_DEVICE_ORIGIN: %d, %d (PSO = %p, pInfo = %p)\n", ppdev->ptlDevOrg.x,
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->ptlDevOrg.y, pso, ppdev->pInfo));
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek if (ppdev->pInfo)
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek {
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->pInfo->screen.xOrigin = ppdev->ptlDevOrg.x;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek ppdev->pInfo->screen.yOrigin = ppdev->ptlDevOrg.y;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek VBoxProcessDisplayInfo(ppdev);
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek }
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek break;
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek case DN_DRAWING_BEGIN:
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek DISPDBG((3, "DN_DRAWING_BEGIN (PSO = %p)\n", pso));
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl break;
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl }
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl}
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl#ifdef VBOX_WITH_DDRAW
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl//--------------------------Public Routine-------------------------------------
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher//
dbea04f585a30d001b574317c068cd03a4fa332bJakub Hrozek// HBITMAP DrvDeriveSurface
5a70b84cb66fb8c7a3fce0e3f2e4b61e0b2ea9d4Simo Sorce//
e3c99ae355408933b03357220f3db09423bd40ddJakub Hrozek// This function derives and creates a GDI surface from the specified
5a5c5cdeb92f4012fc75fd717bfea06598f68f12Pavel Reichl// DirectDraw surface.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher//
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Parameters
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//
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//
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher// Comments
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.
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher//
89caf5edcc99f5731e89bd51e6ffaad3ec11c304Pavel Březina// GDI calls DrvDeriveSurface with RGB surfaces only.
89caf5edcc99f5731e89bd51e6ffaad3ec11c304Pavel Březina//
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 Gallagher//-----------------------------------------------------------------------------
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen GallagherHBITMAP DrvDeriveSurface(DD_DIRECTDRAW_GLOBAL* pDirectDraw, DD_SURFACE_LOCAL* pSurface)
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher{
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher PPDEV pDev = (PPDEV)pDirectDraw->dhpdev;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher HBITMAP hbmDevice;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DD_SURFACE_GLOBAL* pSurfaceGlobal;
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher DISPDBG((0, "%s: %p\n", __FUNCTION__, pDev));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
6b57784f0f175275fd900eca21c77415e3a5ea52Jakub Hrozek pSurfaceGlobal = pSurface->lpGbl;
99dd40a885ed3d42af4bbbde7ee2fc98830544d0Pavel Březina
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher //
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 //
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher AssertMsg(!(pSurfaceGlobal->ddpfSurface.dwFlags & DDPF_FOURCC), ("GDI called us with a non-RGB surface!"));
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // The GDI driver does not accelerate surfaces in AGP memory,
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher // thus we fail the call
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher
dbd09f5703d721a58210e490609cfacb7eb56fcfStephen Gallagher if (pSurface->ddsCaps.dwCaps & DDSCAPS_NONLOCALVIDMEM)
{
DISPDBG((0, "DrvDeriveSurface return NULL, surface in AGP memory"));
return 0;
}
// The GDI driver does not accelerate managed surface,
// thus we fail the call
if (pSurface->lpSurfMore->ddsCapsEx.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)
{
DISPDBG((0, "DrvDeriveSurface return NULL, surface is managed"));
return 0;
}
//
// The rest of our driver expects GDI calls to come in with the same
// format as the primary surface. So we'd better not wrap a device
// bitmap around an RGB format that the rest of our driver doesn't
// understand. Also, we must check to see that it is not a surface
// whose pitch does not match the primary surface.
//
// NOTE: Most surfaces created by this driver are allocated as 2D surfaces
// whose lPitch's are equal to the screen pitch. However, overlay surfaces
// are allocated such that there lPitch's are usually different then the
// screen pitch. The hardware can not accelerate drawing operations to
// these surfaces and thus we fail to derive these surfaces.
//
if ( (pSurfaceGlobal->ddpfSurface.dwRGBBitCount == pDev->ulBitCount) )
{
SIZEL sizel;
DWORD ulBitmapType, flHooks;
sizel.cx = pSurfaceGlobal->wWidth;
sizel.cy = pSurfaceGlobal->wHeight;
if (pDev->ulBitCount == 8)
{
ulBitmapType = BMF_8BPP;
flHooks = HOOKS_BMF8BPP;
}
else if (pDev->ulBitCount == 16)
{
ulBitmapType = BMF_16BPP;
flHooks = HOOKS_BMF16BPP;
}
else if (pDev->ulBitCount == 24)
{
ulBitmapType = BMF_24BPP;
flHooks = HOOKS_BMF24BPP;
}
else
{
ulBitmapType = BMF_32BPP;
flHooks = HOOKS_BMF32BPP;
}
hbmDevice = EngCreateBitmap(sizel,
pDev->lDeltaScreen,
ulBitmapType,
(pDev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0,
(PVOID) (pDev->pjScreen));
if (hbmDevice)
{
VOID* pvScan0 = pDev->pjScreen + pSurfaceGlobal->fpVidMem;
//
// Note that HOOK_SYNCHRONIZE must always be hooked when we
// give GDI a pointer to the bitmap bits. We don't need to
// do it here since HOOK_SYNCHRONIZE is always set in our
// pdev->flHooks
//
ULONG flags = MS_NOTSYSTEMMEMORY;
if ( EngModifySurface((HSURF)hbmDevice,
pDev->hdevEng,
pDev->flHooks,
flags,
(DHSURF)hbmDevice,
pvScan0,
pSurfaceGlobal->lPitch,
NULL) )
{
SURFOBJ* surfobj = EngLockSurface((HSURF) hbmDevice);
AssertMsg(surfobj->iType == STYPE_BITMAP, ("expected STYPE_BITMAP"));
surfobj->iType = STYPE_DEVBITMAP;
EngUnlockSurface(surfobj);
DISPDBG((0, "DrvDeriveSurface return succeed\n"));
return(hbmDevice);
}
DISPDBG((0, "DrvDeriveSurface: EngModifySurface failed\n"));
EngDeleteSurface((HSURF)hbmDevice);
}
}
DISPDBG((0, "DrvDeriveSurface return NULL\n"));
DISPDBG((0, "pSurfaceGlobal->ddpfSurface.dwRGBBitCount = %d, lPitch =%ld\n", pSurfaceGlobal->ddpfSurface.dwRGBBitCount,pSurfaceGlobal->lPitch));
return(0);
}
#endif /* VBOX_WITH_DDRAW */