//----------------------------------------------------------------------------- // File: D3DSaver.h // // Desc: Framework for screensavers that use Direct3D 8.0. // // Copyright (c) 2000 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. D3DCAPS8 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_IDENTIFIER8 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; IDirect3DDevice8* 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 ); 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(D3DCAPS8* pCaps, DWORD dwBehavior, D3DFORMAT fmtBackBuffer) { return S_OK; } virtual HRESULT ConfirmMode( LPDIRECT3DDEVICE8 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; IDirect3D8* m_pD3D; IDirect3DDevice8* 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