⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 halcaps.cpp

📁 SM501基于ARMV4/ARMV4I平台
💻 CPP
📖 第 1 页 / 共 2 页
字号:


EXTERN_C void buildDDHALInfo( LPDDHALINFO lpddhi, DWORD modeidx )
{
	//RETAILMSG(1, (TEXT(" SMI: Build DirectDraw Info\r\n")));
	memset( lpddhi, 0, sizeof(DDHALINFO) );		// Clear the DDHALINFO structure

	SMI *pGPE = (SMI *) g_pGPE;
	DDHALMODEINFO *pModeTable = &g_ModeInfo;
	/*
	DDHALMODEINFO * pModeTable = NULL;
	
  	pModeTable = new DDHALMODEINFO();
	if (!pModeTable) {
	    DEBUGMSG( GPE_ZONE_INIT,(TEXT("Unable to allocate mode table!\r\n")) );
    	return;
	}
	*/

	pModeTable->dwWidth = pGPE->m_pMode->width;
	pModeTable->dwHeight = pGPE->m_pMode->height;
	pModeTable->dwBPP = pGPE->m_pMode->Bpp;
	if (pModeTable->dwBPP <= 8)
    	pModeTable->wFlags = DDMODEINFO_PALETTIZED;
	else
    	pModeTable->wFlags = 0;

	pModeTable->wRefreshRate = pGPE->m_pMode->frequency;
  	pModeTable->lPitch = pGPE->m_pModeEx->lPitch;
	pModeTable->dwRBitMask = pGPE->m_pModeEx->dwRBitMask;
	pModeTable->dwGBitMask = pGPE->m_pModeEx->dwGBitMask;
	pModeTable->dwBBitMask = pGPE->m_pModeEx->dwBBitMask;
	pModeTable->dwAlphaBitMask = pGPE->m_pModeEx->dwAlphaBitMask;

	if( !g_pVideoMemory )	// in case this is called more than once...
	{
		// g_pGPE and g_pDDrawPrimarySurface were already set up by HalInit

		unsigned long physicalVideoMemoryStart;
		g_pGPE->GetPhysicalVideoMemory( &physicalVideoMemoryStart, &g_nVideoMemorySize );
		DEBUGMSG( GPE_ZONE_INIT,(TEXT("GetPhysicalVideoMemory returned phys=0x%08x size=%d\r\n"),
			physicalVideoMemoryStart, g_nVideoMemorySize));

		g_pVideoMemory = (BYTE*)physicalVideoMemoryStart;

		DEBUGMSG( GPE_ZONE_INIT,(TEXT("gpVidMem=%08x\r\n"), g_pVideoMemory ));

	}

	// Populate the rest of the DDHALINFO structure:
    lpddhi->dwSize = sizeof(DDHALINFO);
    lpddhi->lpDDCallbacks = &cbDDCallbacks;
    lpddhi->lpDDSurfaceCallbacks = &cbDDSurfaceCallbacks;
    lpddhi->lpDDPaletteCallbacks = &cbDDPaletteCallbacks;
	lpddhi->lpDDExeBufCallbacks = &cbDDExeBufCallbacks;
	lpddhi->GetDriverInfo = HalGetDriverInfo;

    lpddhi->vmiData.fpPrimary = (unsigned long)(g_pVideoMemory) + g_pDDrawPrimarySurface->OffsetInVideoMemory();	// pointer to primary surface

    lpddhi->vmiData.dwFlags = 0;						// flags
    lpddhi->vmiData.dwDisplayWidth = SCREEN_WIDTH;		// current display width
    lpddhi->vmiData.dwDisplayHeight = SCREEN_HEIGHT;	// current display height
    lpddhi->vmiData.lDisplayPitch = pModeTable->lPitch;	// current display pitch
    lpddhi->vmiData.ddpfDisplay.dwSize = sizeof(DDPIXELFORMAT);
    													// ... = 8bit/pixel palettized
    lpddhi->vmiData.ddpfDisplay.dwFourCC = 0;			// (FOURCC code)

 	if (pModeTable->wFlags & DDMODEINFO_PALETTIZED)
	    lpddhi->vmiData.ddpfDisplay.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
	else
	    lpddhi->vmiData.ddpfDisplay.dwFlags = DDPF_RGB;

	lpddhi->vmiData.ddpfDisplay.dwRBitMask = pModeTable->dwRBitMask;
	lpddhi->vmiData.ddpfDisplay.dwGBitMask = pModeTable->dwGBitMask;
	lpddhi->vmiData.ddpfDisplay.dwBBitMask = pModeTable->dwBBitMask;
	lpddhi->vmiData.ddpfDisplay.dwRGBBitCount = pModeTable->dwBPP;
												// how many bits per pixel (BD_4,8,16,24,32)
    lpddhi->vmiData.dwOffscreenAlign = 16;		// byte alignment for offscreen surfaces
    lpddhi->vmiData.dwOverlayAlign = 16;			// byte alignment for overlays
    lpddhi->vmiData.dwTextureAlign = 128;			// byte alignment for textures
    lpddhi->vmiData.dwZBufferAlign = 16;			// byte alignment for z buffers
    lpddhi->vmiData.dwAlphaAlign = 16;			// byte alignment for alpha
    lpddhi->vmiData.dwNumHeaps = 0;				// number of memory heaps in vmList
    lpddhi->vmiData.pvmList = (LPVIDMEM)NULL;	// array of heaps
    // hw specific caps:
   	lpddhi->ddCaps.dwSize = sizeof(DDCAPS);		// size of the DDDRIVERCAPS structure

	lpddhi->ddCaps.dwCaps =						// driver specific capabilities
		// DDCAPS_3D |                       	// Display hardware has 3D acceleration
		DDCAPS_BLT |                      		// Display hardware is capable of blt operations
		//DDCAPS_BLTQUEUE |                		// Display hardware is capable of asynchronous blt operations
		//DDCAPS_BLTFOURCC |                	// Display hardware is capable of color space conversions during the blt operation
		//DDCAPS_BLTSTRETCH |               	// Display hardware is capable of stretching during blt operations
		DDCAPS_GDI |							// Display hardware is shared with GDI
#ifdef SMI_ENABLEBACKENDVIDEO
	    DDCAPS_OVERLAY |                  		// Display hardware can overlay
		DDCAPS_OVERLAYCANTCLIP |          		// Set if display hardware supports overlays but can not clip them
		DDCAPS_OVERLAYFOURCC |            		// overlay hardware is capable of color space conversions
		DDCAPS_OVERLAYSTRETCH |           		// Indicates that stretching can be done by the overlay hardware
#endif
		// DDCAPS_PALETTE |                  	// unique DirectDrawPalettes can be created for DirectDrawSurfaces
		// DDCAPS_PALETTEVSYNC |             	// palette changes can be syncd with the vertical
		DDCAPS_READSCANLINE |             	// Display hardware can return the current scan line
		// DDCAPS_STEREOVIEW |               	// Display hardware has stereo vision capabilities
		// DDaCAPS_VBI |                      		// Display hardware is capable of generating a vertical blank interrupt
		// DDCAPS_ZBLTS |                  		// Supports the use of z buffers with blt operations
		// DDCAPS_ZOVERLAYS |              		// Supports Z Ordering of overlays
		DDCAPS_COLORKEY |                 		// Supports color key
		// DDCAPS_ALPHA |                    	// Supports alpha surfaces
		// DDCAPS_COLORKEYHWASSIST |         	// colorkey is hardware assisted
		// DDCAPS_NOHARDWARE |               	// no hardware support at all
		DDCAPS_BLTCOLORFILL |             		// Display hardware is capable of color fill with bltter
		// DDCAPS_BANKSWITCHED |             	// Display hardware is bank switched
		// DDCAPS_BLTDEPTHFILL |             	// Display hardware is capable of depth filling Z-buffers with bltter
		// DDCAPS_CANCLIP |                  	// Display hardware is capable of clipping while bltting
		// DDCAPS_CANCLIPSTRETCHED |         	// Display hardware is capable of clipping while stretch bltting
		// DDCAPS_CANBLTSYSMEM |		    	// Display hardware is capable of bltting to or from system memory
		0;

	if (!pGPE->m_SMISettings.m_bOverlayDisabled)
	{
		lpddhi->ddCaps.dwCaps =						// driver specific capabilities
			lpddhi->ddCaps.dwCaps |
		    DDCAPS_OVERLAY |                  		// Display hardware can overlay
			DDCAPS_OVERLAYCANTCLIP |          		// Set if display hardware supports overlays but can not clip them
			DDCAPS_OVERLAYFOURCC |            		// overlay hardware is capable of color space conversions
			DDCAPS_OVERLAYSTRETCH |           		// Indicates that stretching can be done by the overlay hardware
			0;
	}

	if (!pGPE->m_SMISettings.m_bCSCDisabled)
	{
		lpddhi->ddCaps.dwCaps =						// driver specific capabilities
			lpddhi->ddCaps.dwCaps |
			DDCAPS_BLTFOURCC |                	// Display hardware is capable of color space conversions during the blt operation
			DDCAPS_BLTSTRETCH |               	// Display hardware is capable of stretching during blt operations
			0;
	}

	lpddhi->ddCaps.dwCKeyCaps =					// color key capabilities of the surface
		//DDCKEYCAPS_DESTBLT					|		// Supports transparent blitting with a color key that identifies the replaceable bits of the destination surface for RGB colors.  
		DDCKEYCAPS_DESTOVERLAYONEACTIVE  	|		// Supports only one active destination color key value for visible overlay surfaces.  
		DDCKEYCAPS_DESTOVERLAYYUV			|		// Supports overlaying using color keying of the replaceable bits of the destination surface being overlaid for YUV colors.  
		DDCKEYCAPS_DESTOVERLAY  			|		// Supports overlaying with color keying of the replaceable bits of the destination surface being overlaid for RGB colors.  
		DDCKEYCAPS_SRCBLT  					|		// Supports transparent blitting using the color key for the source with this surface for RGB colors.  
		// DDCKEYCAPS_DESTBLTCLRSPACE			|		// Supports transparent blitting with a color space that identifies the replaceable bits of the destination surface for RGB colors.  
		// DDCKEYCAPS_DESTBLTCLRSPACEYUV		|		// Supports transparent blitting with a color space that identifies the replaceable bits of the destination surface for YUV colors.  
		// DDCKEYCAPS_DESTBLTYUV  				|		// Supports transparent blitting with a color key that identifies the replaceable bits of the destination surface for YUV colors.  
		// DDCKEYCAPS_DESTOVERLAYCLRSPACE  	|		// Supports a color space as the color key for the destination of RGB colors.  
		// DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV	|	  	// Supports a color space as the color key for the destination of YUV colors.  
		// DDCKEYCAPS_NOCOSTOVERLAY  			|		// Indicates there are no bandwidth trade-offs for using the color key with an overlay.  
		// DDCKEYCAPS_SRCBLTCLRSPACE  			|		// Supports transparent blitting using a color space for the source with this surface for RGB colors.  
		// DDCKEYCAPS_SRCBLTCLRSPACEYUV  		|		// Supports transparent blitting using a color space for the source with this surface for YUV colors.  
		// DDCKEYCAPS_SRCBLTYUV  				|		// Supports transparent blitting using the color key for the source with this surface for YUV colors.  
		DDCKEYCAPS_SRCOVERLAY  				|		// Supports overlaying using the color key for the source with this overlay surface for RGB colors.  
		// DDCKEYCAPS_SRCOVERLAYCLRSPACE  		|		// Supports overlaying using a color space as the source color key for the overlay surface for RGB colors.  
		// DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV  	|		// Supports overlaying using a color space as the source color key for the overlay surface for YUV colors.  
		// DDCKEYCAPS_SRCOVERLAYONEACTIVE  	|		// Supports only one active source color key value for visible overlay surfaces.  
		// DDCKEYCAPS_SRCOVERLAYYUV 			|		// Supports overlaying using the color key for the source with this overlay surface for YUV colors. 
		0;

	lpddhi->ddCaps.dwFXCaps=					// driver specific stretching and effects capabilites
		//DDFXCAPS_BLTMIRRORUPDOWN |			// Supports vertical inversion Blts
		DDFXCAPS_BLTSTRETCHY 			|		// Supports stretch blts in the Y-direction
		DDFXCAPS_BLTSHRINKY 			|		// Supports shrink blts in the Y-direction
		DDFXCAPS_BLTSTRETCHX 			|		// Supports stretch blts in the X-direction
		DDFXCAPS_BLTSHRINKX 			|		// Supports shrink blts in the X-direction
		DDFXCAPS_BLTARITHSTRETCHY		|
		DDFXCAPS_BLTARITHSTRETCHYN 		|
		DDFXCAPS_OVERLAYSTRETCHX		|
		DDFXCAPS_OVERLAYSTRETCHXN		|
		DDFXCAPS_OVERLAYSTRETCHY		|
		DDFXCAPS_OVERLAYSTRETCHYN		|
		DDFXCAPS_OVERLAYARITHSTRETCHYN	|
		DDFXCAPS_OVERLAYARITHSTRETCHY	|
		DDFXCAPS_OVERLAYSHRINKX 		|
		DDFXCAPS_OVERLAYSHRINKXN 		|
		DDFXCAPS_OVERLAYSHRINKY 		|
		DDFXCAPS_OVERLAYSHRINKYN 		|
		//DDFXCAPS_OVERLAYALPHA			|
		0;

    lpddhi->ddCaps.dwCaps2 =                    // more driver specific capabilities
		// DDCAPS2_CERTIFIED					// Display hardware is certified
		DDCAPS2_NO2DDURING3DSCENE |				// Driver cannot interleave 2D & 3D operations
		DDCAPS2_VIDEOPORT |					// Display hardware contains a video port
		DDCAPS2_AUTOFLIPOVERLAY |			// automatic doubled buffered display of video port
		DDCAPS2_CANBOBINTERLEAVED |			// Overlay can display each field of interlaced data
		DDCAPS2_CANBOBNONINTERLEAVED |		// As above but for non-interleaved data
		DDCAPS2_CANFLIPODDEVEN |				// Driver supports bob without using a video port
		// DDCAPS2_COLORCONTROLOVERLAY |		// The overlay surface contains color controls
		// DDCAPS2_COLORCONTROLPRIMARY |		// The primary surface contains color controls
		// DDCAPS2_CANDROPZ16BIT |				// RGBZ -> RGB supported for 16:16 RGB:Z
		// DDCAPS2_NONLOCALVIDMEM |				// Driver supports non-local video memory
		// DDCAPS2_NONLOCALVIDMEMCAPS |			// Dirver supports non-local video memory but has different capabilities
		// DDCAPS2_NOPAGELOCKREQUIRED |			// Driver neither requires nor prefers surfaces to be pagelocked
		DDCAPS2_WIDESURFACES |					// Driver can create surfaces which are wider than the primary surface
		// DDCAPS2_CANBOBHARDWARE |				// Driver supports bob using hardware
		// DDCAPS2_COPYFOURCC |					// Driver supports bltting any FOURCC surface to another surface of the same FOURCC
		DDCAPS2_FLIPNOVSYNC |					// Driver respond to FLIP_NOVSYNC request
		0 ;

	if (pGPE->m_nScreenBpp <= 8)
	{
	lpddhi->ddCaps.dwPalCaps = 					// palette capabilities
		// DDPCAPS_1BIT |							// Simple 1-bit palette
		// DDPCAPS_2BIT |							// Simple 2-bit palette
		// DDPCAPS_4BIT |							// Simple 4-bit palette
		// DDPCAPS_8BITENTRIES |				// Palette indexes into 8 bit target
		DDPCAPS_8BIT |							// Simple 8-bit palette
		DDPCAPS_INITIALIZE |					// DDraw should initalize palette
												//   ..from lpDDColorArray
		DDPCAPS_PRIMARYSURFACE |				// Palette is attached to primary surface
		// DDPCAPS_PRIMARYSURFACELEFT |			// Palette is attached to left-eye primary surface
		DDPCAPS_ALLOW256 |						// All 256 entries may be set
		0;
	}
	else
	{
		lpddhi->ddCaps.dwPalCaps = 					// palette capabilities
			0;
	}

	lpddhi->ddCaps.dwSVCaps=0;					// Stereo vision capabilities (none)
	lpddhi->ddCaps.dwAlphaBltConstBitDepths = 0;// No Alpha Blt's
	lpddhi->ddCaps.dwAlphaBltPixelBitDepths = 0;
	lpddhi->ddCaps.dwAlphaBltSurfaceBitDepths = 0;
	lpddhi->ddCaps.dwZBufferBitDepths=0;		// No z buffer
	lpddhi->ddCaps.dwVidMemTotal = g_nVideoMemorySize;	// total amount of video memory
	lpddhi->ddCaps.dwVidMemFree = g_nVideoMemorySize;	// amount of free video memory

	lpddhi->ddCaps.dwMaxVisibleOverlays=1;	  	// maximum number of visible overlays
	lpddhi->ddCaps.dwCurrVisibleOverlays = 0;	// current number of visible overlays
	lpddhi->ddCaps.dwMinOverlayStretch=1;		// Min Overlay Stretch factor
	lpddhi->ddCaps.dwMaxOverlayStretch=((SCREEN_HEIGHT < 256)?128:256)*1000; 	// Max Overlay Stretch factor

	lpddhi->ddCaps.dwNumFourCCCodes = MAX_FOURCC; 	// number of four cc codes
	lpddhi->ddCaps.dwAlignBoundarySrc = 0;		// source rectangle alignment
	lpddhi->ddCaps.dwAlignSizeSrc = 0;			// source rectangle byte size
	lpddhi->ddCaps.dwAlignStrideAlign = 0;		// stride alignment
	lpddhi->ddCaps.ddsCaps.dwCaps=				// DDSCAPS structure has all the general capabilities
		// DDSCAPS_ALPHA |							// Can create alpha-only surfaces
		DDSCAPS_BACKBUFFER |						// Can create backbuffer surfaces
		DDSCAPS_COMPLEX |							// Can create complex surfaces
		DDSCAPS_FLIP |								// Can flip between surfaces
		DDSCAPS_FRONTBUFFER |						// Can create front-buffer surfaces
		DDSCAPS_OFFSCREENPLAIN |					// Can create off-screen bitmaps
		DDSCAPS_OVERLAY |							// Can create overlay surfaces
		DDSCAPS_PALETTE |							// Has one palette ???
		DDSCAPS_PRIMARYSURFACE |					// Has a primary surface
		// DDSCAPS_PRIMARYSURFACELEFT |				// Has a left-eye primary surface
		// DDSCAPS_TEXTURE |						// Supports texture surrfaces
		// DDSCAPS_SYSTEMMEMORY |					// Surfaces are in system memory
		DDSCAPS_VIDEOMEMORY |						// Surfaces are in video memory
		DDSCAPS_VISIBLE |							// Changes are instant ???
		// DDSCAPS_ZBUFFER |						// Can create (pseudo) Z buffer
		// DDSCAPS_EXECUTEBUFFER |					// Can create execute buffer
		// DDSCAPS_3DDEVICE |						// Surfaces can be 3d targets
		// DDSCAPS_WRITEONLY |						// Can create write-only surfaces
		// DDSCAPS_ALLOCONLOAD |					// Can create alloconload surfaces
		// DDSCAPS_MIPMAP |							// Can create mipmap
		0;

	SETROPBIT(lpddhi->ddCaps.dwRops,SRCCOPY);	// Set bits for ROPS supported
	SETROPBIT(lpddhi->ddCaps.dwRops,PATCOPY);
	SETROPBIT(lpddhi->ddCaps.dwRops,BLACKNESS);
	SETROPBIT(lpddhi->ddCaps.dwRops,WHITENESS);

#ifdef ENABLE_DIRECT3D
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x00); // 0
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x88); // DSa
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xA0); // DPa
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x44); // SDna
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x50); // PDna
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xCC); // S
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xF0); // P
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x0A); // DPna
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x22); // DSna
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xAA); // D
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x5A); // DPx
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x66); // DSx
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xEE); // DSo
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xFA); // DPo
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x05); // DPon
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x11); // DSon
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x99); // DSxn
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xA5); // DPxn
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x55); // Dn
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xDD); // SDno
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xF5); // PDno
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x0F); // Pn
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x33); // Sn
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xAF); // DPno
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xBB); // DSno
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x5F); // DPan
	SETROPBIT(lpddhi->ddCaps.dwRops, 0x77); // DSan
	SETROPBIT(lpddhi->ddCaps.dwRops, 0xFF); // 1
#endif

    // caps for system to video blts
    lpddhi->ddCaps.dwSVBCaps =          // driver specific capabilities
        //DDCAPS_BLT |                    // Display hardware is capable of
                                        // blt operations
        //DDCAPS_COLORKEY |               // Supports color key
        //DDCAPS_COLORKEYHWASSIST |       // colorkey is hardware assisted
        //DDCAPS_BLTCOLORFILL |           // Display hardware is capable of
                                        // color fill with bltter
        0;
    lpddhi->ddCaps.dwSVBCKeyCaps =      // color key capabilities of the surface
        //DDCKEYCAPS_SRCBLT |             // Hardware can use colorkey (cf source
                                        // only) ..for transparent blts
        0;
    lpddhi->ddCaps.dwSVBFXCaps=         // driver specific stretching and
                                        // effects capabilites
        0;


    lpddhi->dwMonitorFrequency = pModeTable->wRefreshRate;
    											// monitor frequency in current mode (60 field/sec)
    lpddhi->dwModeIndex = 0; // g_nMode;		// current mode: index into array
    lpddhi->lpdwFourCC = SMIFourCC;				// fourcc codes supported
    lpddhi->dwNumModes = 1; 					// number of modes supported
	lpddhi->lpModeInfo = pModeTable;			   	// mode information
    lpddhi->dwFlags =
					DDHALINFO_MODEXILLEGAL |	// create flags
					DDHALINFO_GETDRIVERINFOSET |
					0;
    lpddhi->lpPDevice = (LPVOID)0;				// physical device ptr
    lpddhi->hInstance = (DWORD)0;				// instance handle of driver

	lpddhi->ddCaps.dwMaxVideoPorts	= 1;
	lpddhi->ddCaps.dwCurrVideoPorts= 0;

#ifdef ENABLE_DIRECT3D
    init_D3D_caps(lpddhi);
#endif //ENABLE_DIRECT3D
}

#endif	// DD_ENABLE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -