ddhalsrv.cpp
来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C++ 代码 · 共 355 行
CPP
355 行
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995, 1996, 1997, 1998 Microsoft Corporation
Module Name:
Abstract:
Sample MGDI driver (for IGS2010)
Functions:
Notes:
--*/
#include "precomp.h"
typedef unsigned long HGPE;
typedef unsigned long HGPESurf;
#define PGPE(hGPE) (*(GPE **)&hGPE)
#define PGPESURF(hGPESurf) (*(GPESurf **)&hGPESurf)
HGPE DDHAL_GetGPE()
{
DEBUGMSG( GPE_ZONE_INIT,(TEXT("In DDHAL_GetGPE\r\n")));
return (HGPE)GetGPE();
}
void GPE_GetPhysicalVideoMemory(
HGPE pGPE,
unsigned long *pPhysicalBase,
unsigned long *pSize )
{
PGPE(pGPE)->GetPhysicalVideoMemory( pPhysicalBase, pSize );
DEBUGMSG(GPE_ZONE_INIT,(TEXT("GPE_GetPhysicalVideoMemory: physical base: %08x size: %d\r\n"),
*pPhysicalBase, *pSize ));
}
SCODE GPE_AllocVideoSurface
(HGPE pGPE,
HGPESurf *ppSurf,
int width,
int height,
EGPEFormat format,
int *pOffsetInVideoMemory )
{
SCODE rc;
GPESurf *pSurf;
rc = PGPE(pGPE)->AllocSurface( &pSurf, width, height, format, GPE_REQUIRE_VIDEO_MEMORY );
if( !FAILED(rc) )
{
*pOffsetInVideoMemory = pSurf->OffsetInVideoMemory();
DEBUGMSG(GPE_ZONE_INIT,(TEXT("GPE_AllocVideoSurface: offset in video memory: %08x\r\n"),
pSurf->OffsetInVideoMemory() ));
*ppSurf = (HGPESurf)pSurf;
}
return rc;
}
SCODE GPE_WrapSurface
(HGPE pGPE,
HGPESurf *ppSurf,
int width,
int height,
EGPEFormat format,
unsigned char *pBits,
int stride )
{
GPESurf *pSurf = new GPESurf( width, height, pBits, stride, format );
if( !pSurf )
return E_OUTOFMEMORY;
*ppSurf = (HGPESurf)pSurf;
return S_OK;
}
SCODE GPE_BltExpanded
(HGPE pGPE,
HGPESurf pDst,
HGPESurf pSrc,
HGPESurf pPattern,
CONST RECT *prclDst,
CONST RECT *prclSrc,
ULONG solidColor,
ULONG bltFlags,
ULONG rop4)
{
GPEBltParms parms;
SCODE rc;
// if( PGPE(pGPE)->SurfaceBusyFlipping( PGPESURF(pDst) ) )
// {
// if( bltFlags & 0x100 ) // TBD: Review, - need const
// PGPE(pGPE)->WaitForVBlank();
// else
// return DDERR_WASSTILLDRAWING;
// }
memset( (void *)&parms, 0, sizeof(parms) );
parms.pDst = PGPESURF(pDst);
parms.pSrc = PGPESURF(pSrc);
// parms.pMask = (GPESurf *)NULL;
parms.pBrush = PGPESURF(pPattern);
parms.prclDst = (RECTL *)prclDst;
parms.prclSrc = (RECTL *)prclSrc;
// parms.prclClip = (RECTL *)NULL;
parms.solidColor = solidColor;
parms.bltFlags = bltFlags;
parms.rop4 = rop4;
// parms.prclMask = (RECTL *)NULL;
// parms.pptlBrush = (POINTL *)NULL;
// parms.xPositive = 0;
// parms.yPositive = 0;
// parms.pLookup = (unsigned long *)NULL;
// parms.pConvert = (ColorConverter::*)(unsigned long)NULL;
// parms.pColorConverter = (ColorConverter *)NULL;
rc = PGPE(pGPE)->BltPrepare( &parms );
if( FAILED(rc) )
return rc;
rc = (PGPE(pGPE)->*(parms.pBlt))( &parms );
if( FAILED(rc) )
return rc;
return PGPE(pGPE)->BltComplete( &parms );
}
SCODE GPE_SetPalette
(HGPE pGPE,
const PALETTEENTRY *pSrc,
USHORT firstEntry,
USHORT numEntries)
{
PALETTEENTRY *pEntries = (PALETTEENTRY *)pSrc;
return PGPE(pGPE)->SetPalette(pEntries,firstEntry,numEntries);
}
SCODE GPE_GetModeInfo
(HGPE pGPE,
GPEMode *pMode,
int modeNo)
{
return PGPE(pGPE)->GetModeInfo(pMode,modeNo);
}
int GPE_NumModes(HGPE pGPE)
{
return PGPE(pGPE)->NumModes();
}
SCODE GPE_SetMode
(HGPE pGPE,
int modeId)
{
return PGPE(pGPE)->SetMode( modeId, (HPALETTE *)NULL );
}
int GPE_InVBlank(HGPE pGPE)
{
return PGPE(pGPE)->InVBlank();
}
int GPE_GetModeId(HGPE pGPE)
{
return PGPE(pGPE)->GetModeId();
}
int GPE_ScreenHeight(HGPE pGPE)
{
return PGPE(pGPE)->ScreenHeight();
}
int GPE_ScreenWidth(HGPE pGPE)
{
return PGPE(pGPE)->ScreenWidth();
}
HGPESurf GPE_PrimarySurface(HGPE pGPE)
{
return (HGPESurf)(PGPE(pGPE)->PrimarySurface());
}
void GPE_SetVisibleSurface(
HGPE pGPE,
HGPESurf pSurf )
{
PGPE(pGPE)->SetVisibleSurface( PGPESURF(pSurf) );
}
int GPE_FlipInProgress(HGPE pGPE)
{
return PGPE(pGPE)->FlipInProgress();
}
void GPE_WaitForVBlank(HGPE pGPE)
{
PGPE(pGPE)->WaitForVBlank();
}
int GPE_SurfaceBusyFlipping(
HGPE pGPE,
HGPESurf pSurf )
{
return PGPE(pGPE)->SurfaceBusyFlipping( PGPESURF(pSurf) );
}
int GPE_IsBusy( HGPE pGPE )
{
return PGPE(pGPE)->IsBusy();
}
void GPE_WaitForNotBusy( HGPE pGPE )
{
PGPE(pGPE)->WaitForNotBusy();
}
SCODE GPE_ProcessCommandBlock( HGPE pGPE,
unsigned char *pBlock )
{
return PGPE(pGPE)->ProcessCommandBlock( pBlock );
}
int GPESurf_Stride(HGPESurf pSurf)
{
return PGPESURF(pSurf)->Stride();
}
int GPESurf_Format(HGPESurf pSurf)
{
return (int)(PGPESURF(pSurf)->Format());
}
int GPESurf_Width(HGPESurf pSurf)
{
return PGPESURF(pSurf)->Width();
}
int GPESurf_Height(HGPESurf pSurf)
{
return PGPESURF(pSurf)->Height();
}
int GPESurf_InVideoMemory(HGPESurf pSurf)
{
return PGPESURF(pSurf)->InVideoMemory();
}
int GPESurf_Delete(HGPESurf pSurf)
{
delete PGPESURF(pSurf);
return 1;
}
unsigned long GPESurf_OffsetInVideoMemory(HGPESurf pSurf)
{
return PGPESURF(pSurf)->OffsetInVideoMemory();
}
void DDHALNotifyCallback(DWORD cause, DWORD proc, DWORD thread)
{
}
WINGDIAPI DWORD Fn_UnUsed(void) {
return 0;
}
const PFNVOID VTable[] = {
(PFNVOID)DDHALNotifyCallback,
(PFNVOID)Fn_UnUsed, // reserved by kernel
(PFNVOID)DDHAL_GetGPE,
(PFNVOID)GPE_GetPhysicalVideoMemory,
(PFNVOID)GPE_AllocVideoSurface,
(PFNVOID)GPE_WrapSurface,
(PFNVOID)GPE_BltExpanded,
(PFNVOID)GPE_SetPalette,
(PFNVOID)GPE_GetModeInfo,
(PFNVOID)GPE_NumModes,
(PFNVOID)GPE_SetMode,
(PFNVOID)GPE_InVBlank,
(PFNVOID)GPE_GetModeId,
(PFNVOID)GPE_ScreenHeight,
(PFNVOID)GPE_ScreenWidth,
(PFNVOID)GPE_PrimarySurface,
(PFNVOID)GPE_SetVisibleSurface,
(PFNVOID)GPE_FlipInProgress,
(PFNVOID)GPE_WaitForVBlank,
(PFNVOID)GPE_SurfaceBusyFlipping,
(PFNVOID)GPE_IsBusy,
(PFNVOID)GPE_WaitForNotBusy,
(PFNVOID)GPESurf_Stride,
(PFNVOID)GPESurf_Format,
(PFNVOID)GPESurf_Width,
(PFNVOID)GPESurf_Height,
(PFNVOID)GPESurf_InVideoMemory,
(PFNVOID)GPESurf_Delete,
(PFNVOID)GPESurf_OffsetInVideoMemory,
(PFNVOID)GPE_ProcessCommandBlock
};
const DWORD SigTable[] = {
FNSIG3(DW,DW,DW), // (PFNVOID)DDHALNotifyCallback,
FNSIG0(), // (PFNVOID)Fn_UnUsed, // reserved by kernel
FNSIG0(), // (PFNVOID)DDHAL_GetGPE,
FNSIG3(DW,PTR,PTR), // (PFNVOID)GPE_GetPhysicalVideoMemory,
FNSIG6(DW,PTR,DW,DW,DW,PTR), // (PFNVOID)GPE_AllocVideoSurface,
FNSIG7(DW,PTR,DW,DW,DW,PTR,DW), // (PFNVOID)GPE_WrapSurface,
FNSIG9(DW,DW,DW,DW,PTR,PTR,DW,DW,DW),// (PFNVOID)GPE_BltExpanded,
FNSIG4(DW,PTR,DW,DW), // (PFNVOID)GPE_SetPalette,
FNSIG3(DW,PTR,DW), // (PFNVOID)GPE_GetModeInfo,
FNSIG1(DW), // (PFNVOID)GPE_NumModes,
FNSIG2(DW,DW), // (PFNVOID)GPE_SetMode,
FNSIG1(DW), // (PFNVOID)GPE_InVBlank,
FNSIG1(DW), // (PFNVOID)GPE_GETModeId,
FNSIG1(DW), // (PFNVOID)GPE_ScreenHeight,
FNSIG1(DW), // (PFNVOID)GPE_ScreenWidth,
FNSIG1(DW), // (PFNVOID)GPE_PrimarySurface,
FNSIG2(DW,DW), // (PFNVOID)GPE_SetVisibleSurface,
FNSIG1(DW), // (PFNVOID)GPE_FlipInProgress,
FNSIG1(DW), // (PFNVOID)GPE_WaitForVBlank,
FNSIG2(DW,DW), // (PFNVOID)GPE_SurfaceBusyFlipping,
FNSIG1(DW), // (PFNVOID)GPE_IsBusy,
FNSIG1(DW), // (PFNVOID)GPE_WaitForNotBusy,
FNSIG1(DW), // (PFNVOID)GPESurf_Stride,
FNSIG1(DW), // (PFNVOID)GPESurf_Format,
FNSIG1(DW), // (PFNVOID)GPESurf_Width,
FNSIG1(DW), // (PFNVOID)GPESurf_Height,
FNSIG1(DW), // (PFNVOID)GPESurf_InVideoMemory,
FNSIG1(DW), // (PFNVOID)GPESurf_Delete,
FNSIG1(DW), // (PFNVOID)GPESurf_OffsetInVideoMemory
FNSIG2(DW,PTR) // (PFNVOID)GPE_ProcessCommandBlock
};
#define SH_DDHAL 29 // THIS MUST BE MOVED!
#define LENGTH(array) (sizeof(array)/sizeof(array[0]))
void RegisterDDHALAPI()
{
// Register API
// ASSERT(LENGTH(VTable) == LAST_DDHAL_API_INDEX + 1);
// ASSERT(LENGTH(SigTable) == LAST_DDHAL_API_INDEX + 1);
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Creating API Set for DDHAL\r\n")));
HANDLE hDDHALApi = CreateAPISet("DDHAL", LENGTH(VTable), VTable, SigTable);
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Registering API set %d\r\n"),hDDHALApi));
int rc = RegisterAPISet(hDDHALApi, SH_DDHAL);
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Return from RegisterAPISet:%d\r\n"),rc));
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?