/******************************Module*Header**********************************\ * * ************************** * * DirectDraw SAMPLE CODE * * ************************** * * Module Name: ddenable.c * * Content: * * Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved. * Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved. \*****************************************************************************/ #include "precomp.h" #include "directx.h" #include "dd.h" //----------------------------------------------------------------------------- // // SetDdPixelFormat // // fill a DDPIXELFORMAT structure based with the current mode info // //----------------------------------------------------------------------------- VOID SetDdPixelFormat(PPDev ppdev, LPDDPIXELFORMAT pdpf ) { pdpf->dwSize = sizeof( DDPIXELFORMAT ); pdpf->dwFourCC = 0; pdpf->dwFlags = DDPF_RGB; pdpf->dwRBitMask = ppdev->flRed; pdpf->dwGBitMask = ppdev->flGreen; pdpf->dwBBitMask = ppdev->flBlue; // Calculate some bitdepth dependent stuff switch (ppdev->iBitmapFormat) { case BMF_8BPP: pdpf->dwRGBAlphaBitMask = 0; pdpf->dwRGBBitCount=8; pdpf->dwFlags |= DDPF_PALETTEINDEXED8; break; case BMF_16BPP: pdpf->dwRGBBitCount=16; switch(ppdev->flRed) { case 0x7C00: pdpf->dwRGBAlphaBitMask = 0x8000L; break; default: pdpf->dwRGBAlphaBitMask = 0x0L; } break; case BMF_24BPP: pdpf->dwRGBAlphaBitMask = 0x00000000L; pdpf->dwRGBBitCount=24; break; case BMF_32BPP: pdpf->dwRGBAlphaBitMask = 0xff000000L; pdpf->dwRGBBitCount=32; break; default: ASSERTDD(FALSE,"trying to build unknown pixelformat"); break; } } // buildPixelFormat //----------------------------------------------------------------------------- // // SetupDDData // // Called to fill in DirectDraw specific information in the ppdev. // //----------------------------------------------------------------------------- VOID SetupDDData(PPDev ppdev) { DBG_DD((7, "SetupDDData")); SetDdPixelFormat(ppdev, &ppdev->ddpfDisplay); // // Setup the display size information // cxMemory = Pixels across for one scanline // (not necessarily the same as the screen width) // cyMemory = Scanline height of the memory // ppdev->cxMemory = ppdev->cxScreen; ppdev->cyMemory = ppdev->FrameBufferLength / (ppdev->cxScreen << ppdev->bPixShift); // reset some DDraw specific vars ppdev->bDdStereoMode=FALSE; ppdev->dwNewDDSurfaceOffset=0xffffffff; // Reset the GART copies. ppdev->dwGARTLin = 0; ppdev->dwGARTDev = 0; }// SetupDDData() //----------------------------------------------------------------------------- // // DrvEnableDirectDraw // // This function is called by GDI at start of day or after a mode switch // to enable DirectDraw // //----------------------------------------------------------------------------- BOOL DrvEnableDirectDraw(DHPDEV dhpdev, DD_CALLBACKS* pCallBacks, DD_SURFACECALLBACKS* pSurfaceCallBacks, DD_PALETTECALLBACKS* pPaletteCallBacks) { PPDev ppdev = (PDev*)dhpdev; DBG_DD((7,"DrvEnableDirectDraw called")); ppdev->pDDContext = P2AllocateNewContext(ppdev, (PULONG)P2DisableAllUnits, 0, P2CtxtUserFunc); if ( ppdev->pDDContext == NULL ) { DBG_DD((0, "DrvEnableDirectDraw: ERROR: " "failed to allocate DDRAW context")); // // Since we have already got the ppdev->pvmList, pointer to video memory // heap list, in DrvGetDirectDrawInfo(), we better NULL it out here. // The reason is that we can't enable DirectDraw. So the system won't // initialize the DDRAW heap manager for us. Then we won't be able to // use the video memory heap at all. // ppdev->pvmList = NULL; return(FALSE); } DBG_DD((7," Created DD Register context: 0x%p", ppdev->pDDContext)); // // setup some DirectDraw/D3D specific data in ppdev // SetupDDData(ppdev); InitDDHAL(ppdev); // // Fill in the function pointers at start of day. // We copy these from the Initialisation done in InitDDHAL32Bit. // memcpy(pCallBacks, &ppdev->DDHALCallbacks, sizeof(DD_CALLBACKS)); memcpy(pSurfaceCallBacks, &ppdev->DDSurfCallbacks, sizeof(DD_SURFACECALLBACKS)); return(TRUE); } // DrvEnableDirectDraw() //----------------------------------------------------------------------------- // // DrvDisableDirectDraw // // This function is called by GDI at end of day or after a mode switch // //----------------------------------------------------------------------------- VOID DrvDisableDirectDraw( DHPDEV dhpdev) { PPDev ppdev; DBG_DD((0, "DrvDisableDirectDraw(%lx)", dhpdev)); ppdev = (PDev*) dhpdev; P2FreeContext (ppdev, ppdev->pDDContext); ppdev->pDDContext = NULL; ppdev->pvmList = NULL; MEMTRACKERDEBUGCHK(); DBG_DD((3," freed Register context: 0x%x", ppdev->pDDContext)); } /* DrvDisableDirectDraw */