www.pudn.com > Win32DirectX9.rar > d3dsaver.h


//----------------------------------------------------------------------------- 
// File: D3DSaver.h 
// 
// Desc: Framework for screensavers that use Direct3D 9.0. 
// 
// Copyright (c) Microsoft Corporation. All rights reserved. 
//----------------------------------------------------------------------------- 
#ifndef _D3DSAVER_H 
#define _D3DSAVER_H 
 
 
//----------------------------------------------------------------------------- 
// Error codes 
//----------------------------------------------------------------------------- 
enum APPMSGTYPE { MSG_NONE, MSGERR_APPMUSTEXIT, MSGWARN_SWITCHEDTOREF }; 
 
#define D3DAPPERR_NODIRECT3D          0x82000001 
#define D3DAPPERR_NOWINDOW            0x82000002 
#define D3DAPPERR_NOCOMPATIBLEDEVICES 0x82000003 
#define D3DAPPERR_NOWINDOWABLEDEVICES 0x82000004 
#define D3DAPPERR_NOHARDWAREDEVICE    0x82000005 
#define D3DAPPERR_HALNOTCOMPATIBLE    0x82000006 
#define D3DAPPERR_NOWINDOWEDHAL       0x82000007 
#define D3DAPPERR_NODESKTOPHAL        0x82000008 
#define D3DAPPERR_NOHALTHISMODE       0x82000009 
#define D3DAPPERR_NONZEROREFCOUNT     0x8200000a 
#define D3DAPPERR_MEDIANOTFOUND       0x8200000b 
#define D3DAPPERR_RESIZEFAILED        0x8200000c 
#define D3DAPPERR_INITDEVICEOBJECTSFAILED 0x8200000d 
#define D3DAPPERR_CREATEDEVICEFAILED  0x8200000e 
#define D3DAPPERR_NOPREVIEW           0x8200000f 
 
 
//----------------------------------------------------------------------------- 
// Constants 
//----------------------------------------------------------------------------- 
#define MAX_DISPLAYS 9 
#define NO_ADAPTER 0xffffffff 
#define NO_MONITOR 0xffffffff 
 
 
//*************************************************************************************** 
// Modes of operation for screensaver 
enum SaverMode 
{ 
    sm_config,         // Config dialog box 
    sm_preview,        // Mini preview window in Display Properties dialog 
    sm_full,           // Full-on screensaver mode 
    sm_test,           // Test mode 
    sm_passwordchange  // Change password 
}; 
 
 
// Prototype for VerifyScreenSavePwd() in password.cpl, used on Win9x 
typedef BOOL (PASCAL * VERIFYPWDPROC) (HWND); 
 
 
//----------------------------------------------------------------------------- 
// Name: struct D3DModeInfo 
// Desc: Structure for holding information about a display mode 
//----------------------------------------------------------------------------- 
struct D3DModeInfo 
{ 
    DWORD      Width;      // Screen width in this mode 
    DWORD      Height;     // Screen height in this mode 
    D3DFORMAT  Format;     // Pixel format in this mode 
    DWORD      dwBehavior; // Hardware / Software / Mixed vertex processing 
    D3DFORMAT  DepthStencilFormat; // Which depth/stencil format to use with this mode 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: struct D3DWindowedModeInfo 
// Desc: Structure for holding information about a display mode 
//----------------------------------------------------------------------------- 
struct D3DWindowedModeInfo 
{ 
    D3DFORMAT  DisplayFormat; 
    D3DFORMAT  BackBufferFormat; 
    DWORD      dwBehavior; // Hardware / Software / Mixed vertex processing 
    D3DFORMAT  DepthStencilFormat; // Which depth/stencil format to use with this mode 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: struct D3DDeviceInfo 
// Desc: Structure for holding information about a Direct3D device, including 
//       a list of modes compatible with this device 
//----------------------------------------------------------------------------- 
struct D3DDeviceInfo 
{ 
    // Device data 
    D3DDEVTYPE   DeviceType;      // Reference, HAL, etc. 
    D3DCAPS9     d3dCaps;         // Capabilities of this device 
    const TCHAR* strDesc;         // Name of this device 
    BOOL         bCanDoWindowed;  // Whether this device can work in windowed mode 
 
    // Modes for this device 
    DWORD        dwNumModes; 
    D3DModeInfo  modes[150]; 
 
    // Current state 
    DWORD        dwCurrentMode; 
    BOOL         bWindowed; 
    D3DMULTISAMPLE_TYPE MultiSampleType; 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: struct D3DAdapterInfo 
// Desc: Structure for holding information about an adapter, including a list 
//       of devices available on this adapter 
//----------------------------------------------------------------------------- 
struct D3DAdapterInfo 
{ 
    // Adapter data 
    DWORD          iMonitor; // Which MonitorInfo corresponds to this adapter 
    D3DADAPTER_IDENTIFIER9 d3dAdapterIdentifier; 
    D3DDISPLAYMODE d3ddmDesktop;      // Desktop display mode for this adapter 
 
    // Devices for this adapter 
    DWORD          dwNumDevices; 
    D3DDeviceInfo  devices[3]; 
    BOOL           bHasHAL; 
    BOOL           bHasAppCompatHAL; 
    BOOL           bHasSW; 
    BOOL           bHasAppCompatSW; 
 
    // User's preferred mode settings for this adapter 
    DWORD          dwUserPrefWidth; 
    DWORD          dwUserPrefHeight; 
    D3DFORMAT      d3dfmtUserPrefFormat; 
    BOOL           bLeaveBlack;  // If TRUE, don't render to this display 
    BOOL           bDisableHW;   // If TRUE, don't use HAL on this display 
 
    // Current state 
    DWORD          dwCurrentDevice; 
    HWND           hWndDevice; 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: struct MonitorInfo 
// Desc: Structure for holding information about a monitor 
//----------------------------------------------------------------------------- 
struct MonitorInfo 
{ 
    TCHAR          strDeviceName[128]; 
    TCHAR          strMonitorName[128]; 
    HMONITOR       hMonitor; 
    RECT           rcScreen; 
    DWORD          iAdapter; // Which D3DAdapterInfo corresponds to this monitor 
    HWND           hWnd; 
 
    // Error message state 
    FLOAT          xError; 
    FLOAT          yError; 
    FLOAT          widthError; 
    FLOAT          heightError; 
    FLOAT          xVelError; 
    FLOAT          yVelError; 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: struct RenderUnit 
// Desc:  
//----------------------------------------------------------------------------- 
struct RenderUnit 
{ 
    UINT                  iAdapter; 
    UINT                  iMonitor; 
    D3DDEVTYPE            DeviceType;      // Reference, HAL, etc. 
    DWORD                 dwBehavior; 
    IDirect3DDevice9*     pd3dDevice; 
    D3DPRESENT_PARAMETERS d3dpp; 
    BOOL                  bDeviceObjectsInited; // InitDeviceObjects was called 
    BOOL                  bDeviceObjectsRestored; // RestoreDeviceObjects was called 
    TCHAR                 strDeviceStats[90];// String to hold D3D device stats 
    TCHAR                 strFrameStats[40]; // String to hold frame stats 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: class CD3DScreensaver 
// Desc: D3D screensaver class 
//----------------------------------------------------------------------------- 
class CD3DScreensaver 
{ 
public: 
                    CD3DScreensaver(); 
 
    virtual HRESULT Create( HINSTANCE hInstance ); 
    virtual INT     Run(); 
    HRESULT         DisplayErrorMsg( HRESULT hr, DWORD dwType = 0 ); 
 
protected: 
    SaverMode       ParseCommandLine( TCHAR* pstrCommandLine ); 
    VOID            ChangePassword(); 
    HRESULT         DoSaver(); 
 
    virtual VOID    DoConfig() { } 
    virtual VOID    ReadSettings() {}; 
    VOID            ReadScreenSettings( HKEY hkeyParent ); 
    VOID            WriteScreenSettings( HKEY hkeyParent ); 
 
    virtual VOID    DoPaint( HWND hwnd, HDC hdc ); 
    HRESULT         Initialize3DEnvironment(); 
    VOID            Cleanup3DEnvironment(); 
    HRESULT         Render3DEnvironment(); 
    static LRESULT CALLBACK SaverProcStub( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
    virtual LRESULT SaverProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
    VOID            InterruptSaver(); 
    VOID            ShutdownSaver(); 
    VOID            DoScreenSettingsDialog( HWND hwndParent ); 
    static INT_PTR CALLBACK ScreenSettingsDlgProcStub( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
    INT_PTR         ScreenSettingsDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
    VOID            SetupAdapterPage(HWND hWnd); 
 
    HRESULT         CreateSaverWindow(); 
    HRESULT         BuildDeviceList(); 
    BOOL            FindDepthStencilFormat( UINT iAdapter, D3DDEVTYPE DeviceType, 
                        D3DFORMAT TargetFormat, D3DFORMAT* pDepthStencilFormat ); 
    HRESULT         CheckWindowedFormat( UINT iAdapter, D3DWindowedModeInfo* pD3DWindowedModeInfo ); 
    HRESULT         CreateFullscreenRenderUnit( RenderUnit* pRenderUnit ); 
    HRESULT         CreateWindowedRenderUnit( RenderUnit* pRenderUnit ); 
    BOOL            FindNextLowerMode( D3DDeviceInfo* pD3DDeviceInfo ); 
    VOID            SwitchToRenderUnit( UINT iRenderUnit ); 
    VOID            BuildProjectionMatrix( FLOAT fNear, FLOAT fFar, D3DXMATRIX* pMatrix ); 
    HRESULT         SetProjectionMatrix( FLOAT fNear, FLOAT fFar ); 
    virtual VOID    UpdateDeviceStats(); 
    virtual VOID    UpdateFrameStats(); 
    virtual BOOL    GetTextForError( HRESULT hr, TCHAR* pszError, DWORD dwNumChars ); 
    VOID            UpdateErrorBox(); 
    VOID            EnumMonitors( VOID ); 
    BOOL            GetBestAdapter( DWORD* piAdapter ); 
 
    virtual VOID    SetDevice( UINT iDevice )                  { } 
    virtual HRESULT RegisterSoftwareDevice()                   { return S_OK; } 
    virtual HRESULT ConfirmDevice(D3DCAPS9* pCaps, DWORD dwBehavior,  
                                  D3DFORMAT fmtBackBuffer)     { return S_OK; } 
    virtual HRESULT ConfirmMode( LPDIRECT3DDEVICE9 pd3dDev )   { return S_OK; } 
    virtual HRESULT OneTimeSceneInit()                         { return S_OK; } 
    virtual HRESULT InitDeviceObjects()                        { return S_OK; } 
    virtual HRESULT RestoreDeviceObjects()                     { return S_OK; } 
    virtual HRESULT FrameMove()                                { return S_OK; } 
    virtual HRESULT Render()                                   { return S_OK; } 
    virtual HRESULT InvalidateDeviceObjects()                  { return S_OK; } 
    virtual HRESULT DeleteDeviceObjects()                      { return S_OK; } 
    virtual HRESULT FinalCleanup()                             { return S_OK; } 
 
protected: 
    SaverMode       m_SaverMode;         // sm_config, sm_full, sm_preview, etc. 
    BOOL            m_bAllScreensSame;   // If TRUE, show same image on all screens 
    HWND            m_hWnd;              // Focus window and device window on primary 
    HWND            m_hWndParent; 
    HINSTANCE       m_hInstance; 
    BOOL            m_bWaitForInputIdle;  // Used to pause when preview starts 
    DWORD           m_dwSaverMouseMoveCount; 
    BOOL            m_bIs9x; 
    HINSTANCE       m_hPasswordDLL; 
    VERIFYPWDPROC   m_VerifySaverPassword; 
    BOOL            m_bCheckingSaverPassword; 
    BOOL            m_bWindowed; 
 
    // Variables for non-fatal error management 
    BOOL            m_bErrorMode;        // Whether to display an error 
    HRESULT         m_hrError;           // Error code to display 
    TCHAR           m_szError[400];      // Error message text 
 
    MonitorInfo     m_Monitors[MAX_DISPLAYS]; 
    DWORD           m_dwNumMonitors; 
    RenderUnit      m_RenderUnits[MAX_DISPLAYS]; 
    DWORD           m_dwNumRenderUnits; 
    D3DAdapterInfo* m_Adapters[MAX_DISPLAYS]; 
    DWORD           m_dwNumAdapters; 
    IDirect3D9*     m_pD3D; 
    IDirect3DDevice9* m_pd3dDevice;      // Current D3D device 
    RECT            m_rcRenderTotal;     // Rect of entire area to be rendered 
    RECT            m_rcRenderCurDevice; // Rect of render area of current device 
    D3DSURFACE_DESC m_d3dsdBackBuffer;   // Info on back buffer for current device 
 
    TCHAR           m_strWindowTitle[200]; // Title for the app's window 
    BOOL            m_bAllowRef;         // Whether to allow REF D3D device 
    BOOL            m_bUseDepthBuffer;   // Whether to autocreate depthbuffer 
    BOOL            m_bMultithreaded;    // Whether to make D3D thread-safe 
    BOOL            m_bOneScreenOnly;    // Only ever show screensaver on one screen 
    TCHAR           m_strRegPath[200];   // Where to store registry info 
    DWORD           m_dwMinDepthBits;    // Minimum number of bits needed in depth buffer 
    DWORD           m_dwMinStencilBits;  // Minimum number of bits needed in stencil buffer 
    D3DSWAPEFFECT   m_SwapEffectFullscreen; // SwapEffect to use in fullscreen Present() 
    D3DSWAPEFFECT   m_SwapEffectWindowed; // SwapEffect to use in windowed Present() 
 
    // Variables for timing 
    FLOAT           m_fTime;             // Current time in seconds 
    FLOAT           m_fElapsedTime;      // Time elapsed since last frame 
    FLOAT           m_fFPS;              // Instanteous frame rate 
    TCHAR           m_strDeviceStats[90];// D3D device stats for current device 
    TCHAR           m_strFrameStats[40]; // Frame stats for current device 
}; 
 
#endif