You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
5.7 KiB
202 lines
5.7 KiB
/******************************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 */
|
|
|