ddraw.c

来自「一个类似windows」· C语言 代码 · 共 1,138 行 · 第 1/3 页

C
1,138
字号
/*
 * COPYRIGHT:        See COPYING in the top level directory
 * PROJECT:          ReactOS kernel
 * PURPOSE:          Native DirectDraw implementation
 * FILE:             subsys/win32k/ntddraw/ddraw.c
 * PROGRAMER:        Peter Bajusz (hyp-x@stormregion.com)
 * REVISION HISTORY:
 *       25-10-2003  PB  Created
 */

#include <w32k.h>

#define NDEBUG
#include <debug.h>

/* swtich this off to get rid of all dx debug msg */
#define DX_DEBUG

#define DdHandleTable GdiHandleTable


/************************************************************************/
/* DIRECT DRAW OBJECT                                                   */
/************************************************************************/

BOOL INTERNAL_CALL
DD_Cleanup(PVOID ObjectBody)
{       
	PDD_DIRECTDRAW pDirectDraw = (PDD_DIRECTDRAW) ObjectBody;
#ifdef DX_DEBUG
	DPRINT1("DD_Cleanup\n");
#endif
	
	if (!pDirectDraw)
		return FALSE;
    
    if (pDirectDraw->Global.dhpdev == NULL)
        return FALSE;
        
    if (pDirectDraw->DrvDisableDirectDraw == NULL)
        return FALSE;
        
	pDirectDraw->DrvDisableDirectDraw(pDirectDraw->Global.dhpdev);
	return TRUE;
}

HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
    HDC hdc
)
{
	DD_CALLBACKS callbacks;
	DD_SURFACECALLBACKS surface_callbacks;
	DD_PALETTECALLBACKS palette_callbacks;
    DC *pDC;
    BOOL success;
    HANDLE hDirectDraw;
    PDD_DIRECTDRAW pDirectDraw;
#ifdef DX_DEBUG
	DPRINT1("NtGdiDdCreateDirectDrawObject\n");
#endif

	RtlZeroMemory(&callbacks, sizeof(DD_CALLBACKS));
	callbacks.dwSize = sizeof(DD_CALLBACKS);
	RtlZeroMemory(&surface_callbacks, sizeof(DD_SURFACECALLBACKS));
	surface_callbacks.dwSize = sizeof(DD_SURFACECALLBACKS);
	RtlZeroMemory(&palette_callbacks, sizeof(DD_PALETTECALLBACKS));
	palette_callbacks.dwSize = sizeof(DD_PALETTECALLBACKS);

	/* FIXME hdc can be zero for d3d9 */
    /* we need create it, if in that case */
	if (hdc == NULL)
	{
	    return NULL;
    }
    
	pDC = DC_LockDc(hdc);
	if (!pDC)
		return NULL;

	if (!pDC->DriverFunctions.EnableDirectDraw)
	{
		// Driver doesn't support DirectDraw
		DC_UnlockDc(pDC);
		return NULL;
	}
	
	success = pDC->DriverFunctions.EnableDirectDraw(
		pDC->PDev, &callbacks, &surface_callbacks, &palette_callbacks);

	if (!success)
	{
#ifdef DX_DEBUG
        DPRINT1("DirectDraw creation failed\n"); 
#endif
		// DirectDraw creation failed
		DC_UnlockDc(pDC);
		return NULL;
	}

	hDirectDraw = GDIOBJ_AllocObj(DdHandleTable, GDI_OBJECT_TYPE_DIRECTDRAW);
	if (!hDirectDraw)
	{
		/* No more memmory */
#ifdef DX_DEBUG
		DPRINT1("No more memmory\n"); 
#endif
		DC_UnlockDc(pDC);
		return NULL;
	}

	pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDraw, GDI_OBJECT_TYPE_DIRECTDRAW);
	if (!pDirectDraw)
	{
		/* invalid handle */
#ifdef DX_DEBUG
		DPRINT1("invalid handle\n"); 
#endif
		DC_UnlockDc(pDC);
		return NULL;
	}
	

	pDirectDraw->Global.dhpdev = pDC->PDev;
	pDirectDraw->Local.lpGbl = &pDirectDraw->Global;

	pDirectDraw->DrvGetDirectDrawInfo = pDC->DriverFunctions.GetDirectDrawInfo;
	pDirectDraw->DrvDisableDirectDraw = pDC->DriverFunctions.DisableDirectDraw;

    /* DD_CALLBACKS setup */	
	RtlMoveMemory(&pDirectDraw->DD, &callbacks, sizeof(DD_CALLBACKS));
	
   	/* DD_SURFACECALLBACKS  setup*/	
	RtlMoveMemory(&pDirectDraw->Surf, &surface_callbacks, sizeof(DD_SURFACECALLBACKS));

	/* DD_PALETTECALLBACKS setup*/	
	RtlMoveMemory(&pDirectDraw->Pal, &surface_callbacks, sizeof(DD_PALETTECALLBACKS));
	
	GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
	DC_UnlockDc(pDC);

	return hDirectDraw;
}

BOOL STDCALL NtGdiDdDeleteDirectDrawObject(
    HANDLE hDirectDrawLocal
)
{
#ifdef DX_DEBUG
    DPRINT1("NtGdiDdDeleteDirectDrawObject\n");
#endif
	return GDIOBJ_FreeObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
}

BOOL STDCALL NtGdiDdQueryDirectDrawObject(
    HANDLE hDirectDrawLocal,
    DD_HALINFO  *pHalInfo,
    DWORD *pCallBackFlags,
    LPD3DNTHAL_CALLBACKS puD3dCallbacks,
    LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData,
    PDD_D3DBUFCALLBACKS puD3dBufferCallbacks,
    LPDDSURFACEDESC puD3dTextureFormats,
    DWORD *puNumHeaps,
    VIDEOMEMORY *puvmList,
    DWORD *puNumFourCC,
    DWORD *puFourCC
)
{
#ifdef DX_DEBUG
    PDD_DIRECTDRAW pDirectDraw;
    BOOL success;
    DPRINT1("NtGdiDdQueryDirectDrawObject\n");
#endif

    /* Check for NULL pointer to prevent any one doing a mistake */

    if (hDirectDrawLocal == NULL)
    {
#ifdef DX_DEBUG
       DPRINT1("warning hDirectDraw handler is NULL, the handler is  DDRAWI_DIRECTDRAW_GBL.hDD\n");
       DPRINT1("and it is NtGdiDdCreateDirectDrawObject return value\n");
#endif
       return FALSE;
    }


    if (pHalInfo == NULL)
    {
#ifdef DX_DEBUG
       DPRINT1("warning pHalInfo buffer is NULL \n");
#endif
       return FALSE;
    }

    if ( pCallBackFlags == NULL)
    {
#ifdef DX_DEBUG
       DPRINT1("warning pCallBackFlags s NULL, the size must be 3*DWORD in follow order \n");
       DPRINT1("pCallBackFlags[0] = flags in DD_CALLBACKS\n");
       DPRINT1("pCallBackFlags[1] = flags in DD_SURFACECALLBACKS\n");
       DPRINT1("pCallBackFlags[2] = flags in DD_PALETTECALLBACKS\n");
#endif
       return FALSE;
    }
   
    
	pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
	
	
	if (!pDirectDraw)
	{
        /* Fail to Lock DirectDraw handle */
#ifdef DX_DEBUG
        DPRINT1(" Fail to Lock DirectDraw handle \n");        
#endif
		return FALSE;
    }

	success = pDirectDraw->DrvGetDirectDrawInfo(
		pDirectDraw->Global.dhpdev,
		pHalInfo,
		puNumHeaps,
		puvmList,
		puNumFourCC,
		puFourCC);

	if (!success)
	{
#ifdef DX_DEBUG
        DPRINT1(" Fail to get DirectDraw driver info \n");
#endif
		GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
		return FALSE;
	}

      
    /* rest the flag so we do not need do it later */
    pCallBackFlags[0]=0;
    pCallBackFlags[1]=0;
    pCallBackFlags[2]=0;

	if (pHalInfo)
	{       
      
          {
             DDHALINFO* pHalInfo2 = ((DDHALINFO*) pHalInfo);
#ifdef DX_DEBUG
             DPRINT1("Found DirectDraw CallBack for 2D and 3D Hal\n");
#endif
             RtlMoveMemory(&pDirectDraw->Hal, pHalInfo2, sizeof(DDHALINFO));

             if (pHalInfo2->lpDDExeBufCallbacks)
	         {
#ifdef DX_DEBUG
                 DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer  \n");                                
#endif
                 /* msdn DDHAL_D3DBUFCALLBACKS = DD_D3DBUFCALLBACKS */
                 RtlMoveMemory(puD3dBufferCallbacks, pHalInfo2->lpDDExeBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
             }
              
#ifdef DX_DEBUG               
             DPRINT1("Do not support CallBack for 3D Hal\n");
#endif
             /* FIXME we need D3DHAL be include 

             if (pHalInfo2->lpD3DHALCallbacks )
	         {    
#ifdef DX_DEBUG
                    DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
#endif
		            RtlMoveMemory(puD3dCallbacks, (ULONG *)pHalInfo2->lpD3DHALCallbacks, sizeof( D3DHAL_CALLBACKS ));		
	         } 
             */              


             /* msdn say D3DHAL_GLOBALDRIVERDATA and D3DNTHAL_GLOBALDRIVERDATA are not same 
                but if u compare these in msdn it is exacly same */

	         if (pHalInfo->lpD3DGlobalDriverData)
	         {
#ifdef DX_DEBUG
                   DPRINT1("Found DirectDraw CallBack for 3D Hal Private  \n");
#endif
		           RtlMoveMemory(puD3dDriverData, (ULONG *)pHalInfo2->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
	         }
              
             /* build the flag */
               
             if (pHalInfo2->lpDDCallbacks!=NULL)
             {
#ifdef DX_DEBUG
                    DPRINT1("Dectect DirectDraw lpDDCallbacks for 2D Hal flag = %d\n",pHalInfo2->lpDDCallbacks->dwFlags);
#endif
                    pCallBackFlags[0] = pHalInfo2->lpDDCallbacks->dwFlags;
             }
     
             if (pHalInfo2->lpDDCallbacks!=NULL)
             {
#ifdef DX_DEBUG
                   DPRINT1("Dectect DirectDraw lpDDSurfaceCallbacks for 2D Hal flag = %d\n",pHalInfo2->lpDDSurfaceCallbacks->dwFlags);
#endif
                   pCallBackFlags[1] = pHalInfo2->lpDDSurfaceCallbacks->dwFlags;
             }
       
             if (pHalInfo2->lpDDCallbacks!=NULL)
             {
#ifdef DX_DEBUG
                   DPRINT1("Dectect DirectDraw lpDDCallbacks for 2D Hal flag = %d\n",pHalInfo2->lpDDPaletteCallbacks->dwFlags);
#endif
                   pCallBackFlags[2] = pHalInfo2->lpDDPaletteCallbacks->dwFlags;
             }

          }
             
#ifdef DX_DEBUG
          DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
#endif
          RtlMoveMemory(&pDirectDraw->Hal, pHalInfo, sizeof(DD_HALINFO));

          if (pHalInfo->lpD3DBufCallbacks)
	      {
#ifdef DX_DEBUG
                   DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer  \n");
#endif
		           RtlMoveMemory(puD3dBufferCallbacks, pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
	      }

          if (pHalInfo->lpD3DHALCallbacks)
	      {
#ifdef DX_DEBUG
                   DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
#endif
		           RtlMoveMemory(puD3dCallbacks, pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS));		
	      }

	      if (pHalInfo->lpD3DGlobalDriverData)
	      {
#ifdef DX_DEBUG
                   DPRINT1("Found DirectDraw CallBack for 3D Hal Private  \n");
#endif
		           RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
	      }
          
#ifdef DX_DEBUG
          DPRINT1("Unkown DirectX driver interface\n");
#endif
                            	   	          	   	                           	   	
	   }

#ifdef DX_DEBUG
     else
	 {
	   DPRINT1("No DirectDraw Hal info have been found, it did not fail, it did gather some other info \n");
    }
#endif
        
	GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);

	return TRUE;
}


DWORD STDCALL NtGdiDdGetDriverInfo(
    HANDLE hDirectDrawLocal,
    PDD_GETDRIVERINFODATA puGetDriverInfoData)

{
	DWORD  ddRVal = 0;

	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
#ifdef DX_DEBUG
	DPRINT1("NtGdiDdGetDriverInfo\n");
#endif
	
	if (pDirectDraw == NULL) 
	{
#ifdef DX_DEBUG
        DPRINT1("Can not lock DirectDraw handle \n");
#endif
		return DDHAL_DRIVER_NOTHANDLED;
    }

⌨️ 快捷键说明

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