//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// // // Purpose: // // $NoKeywords: $ // //===========================================================================// #ifndef SHADERDEVICEBASE_H #define SHADERDEVICEBASE_H #ifdef _WIN32 #pragma once #endif #include "togl/rendermechanism.h" #include "shaderapi/IShaderDevice.h" #include "IHardwareConfigInternal.h" #include "bitmap/imageformat.h" #include "materialsystem/imaterialsystem.h" #include "hardwareconfig.h" //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- class KeyValues; //----------------------------------------------------------------------------- // define this if you want to run with NVPERFHUD //----------------------------------------------------------------------------- //#define NVPERFHUD 1 //----------------------------------------------------------------------------- // Uncomment this to activate the reference rasterizer //----------------------------------------------------------------------------- //#define USE_REFERENCE_RASTERIZER 1 //----------------------------------------------------------------------------- // The Base implementation of the shader device //----------------------------------------------------------------------------- class CShaderDeviceMgrBase : public CBaseAppSystem< IShaderDeviceMgr > { public: // constructor, destructor CShaderDeviceMgrBase(); virtual ~CShaderDeviceMgrBase(); // Methods of IAppSystem virtual bool Connect( CreateInterfaceFn factory ); virtual void Disconnect(); virtual void *QueryInterface( const char *pInterfaceName ); // Methods of IShaderDeviceMgr virtual bool GetRecommendedConfigurationInfo( int nAdapter, int nDXLevel, KeyValues *pCongifuration ); virtual void AddModeChangeCallback( ShaderModeChangeCallbackFunc_t func ); virtual void RemoveModeChangeCallback( ShaderModeChangeCallbackFunc_t func ); virtual bool GetRecommendedVideoConfig( int nAdapter, KeyValues *pConfiguration ); virtual void AddDeviceDependentObject( IShaderDeviceDependentObject *pObject ); virtual void RemoveDeviceDependentObject( IShaderDeviceDependentObject *pObject ); virtual void InvokeDeviceLostNotifications( void ); virtual void InvokeDeviceResetNotifications( IDirect3DDevice9 *pDevice, D3DPRESENT_PARAMETERS *pPresentParameters, void *pHWnd ); // Reads in the hardware caps from the dxsupport.cfg file void ReadHardwareCaps( HardwareCaps_t &caps, int nDxLevel ); // Reads in the max + preferred DX support level void ReadDXSupportLevels( HardwareCaps_t &caps ); // Returns the hardware caps for a particular adapter const HardwareCaps_t& GetHardwareCaps( int nAdapter ) const; // Invokes mode change callbacks void InvokeModeChangeCallbacks( int screenWidth, int screenHeight ); // Factory to return from SetMode static void* ShaderInterfaceFactory( const char *pInterfaceName, int *pReturnCode ); // Returns only valid dx levels int GetClosestActualDXLevel( int nDxLevel ) const; protected: struct AdapterInfo_t { HardwareCaps_t m_ActualCaps; }; private: // Reads in the dxsupport.cfg keyvalues KeyValues *ReadDXSupportKeyValues(); // Reads in ConVars + config variables void LoadConfig( KeyValues *pKeyValues, KeyValues *pConfiguration ); // Loads the hardware caps, for cases in which the D3D caps lie or where we need to augment the caps void LoadHardwareCaps( KeyValues *pGroup, HardwareCaps_t &caps ); // Gets the recommended configuration associated with a particular dx level bool GetRecommendedVideoConfig( int nAdapter, int nVendorID, int nDeviceID, KeyValues *pConfiguration ); bool GetRecommendedConfigurationInfo( int nAdapter, int nDXLevel, int nVendorID, int nDeviceID, KeyValues *pConfiguration ); // Returns the amount of video memory in bytes for a particular adapter virtual int GetVidMemBytes( int nAdapter ) const = 0; // Returns the physical screen desktop resolution virtual void GetDesktopResolution( int *pWidth, int *pHeight, int nAdapter ) const = 0; // Looks for override keyvalues in the dxsupport cfg keyvalues KeyValues *FindDXLevelSpecificConfig( KeyValues *pKeyValues, int nDxLevel ); KeyValues *FindDXLevelAndVendorSpecificConfig( KeyValues *pKeyValues, int nDxLevel, int nVendorID ); KeyValues *FindCPUSpecificConfig( KeyValues *pKeyValues, int nCPUMhz, bool bAMD ); KeyValues *FindMemorySpecificConfig( KeyValues *pKeyValues, int nSystemRamMB ); KeyValues *FindVidMemSpecificConfig( KeyValues *pKeyValues, int nVideoRamMB ); KeyValues *FindCardSpecificConfig( KeyValues *pKeyValues, int nVendorID, int nDeviceID ); protected: // Stores adapter info for all adapters CUtlVector m_Adapters; // Installed mode change callbacks CUtlVector< ShaderModeChangeCallbackFunc_t > m_ModeChangeCallbacks; CUtlVector< IShaderDeviceDependentObject* > m_DeviceDependentObjects; KeyValues *m_pDXSupport; }; //----------------------------------------------------------------------------- // The Base implementation of the shader device //----------------------------------------------------------------------------- class CShaderDeviceBase : public IShaderDevice { public: enum IPCMessage_t { RELEASE_MESSAGE = 0x5E740DE0, REACQUIRE_MESSAGE = 0x5E740DE1, EVICT_MESSAGE = 0x5E740DE2, }; // Methods of IShaderDevice public: virtual ImageFormat GetBackBufferFormat() const; virtual int StencilBufferBits() const; virtual bool IsAAEnabled() const; virtual bool AddView( void* hWnd ); virtual void RemoveView( void* hWnd ); virtual void SetView( void* hWnd ); virtual void GetWindowSize( int& nWidth, int& nHeight ) const; // Methods exposed to the rest of shader api virtual bool InitDevice( void *hWnd, int nAdapter, const ShaderDeviceInfo_t& mode ) = 0; virtual void ShutdownDevice() = 0; virtual bool IsDeactivated() const = 0; public: // constructor, destructor CShaderDeviceBase(); virtual ~CShaderDeviceBase(); virtual void OtherAppInitializing( bool initializing ) {} virtual void EvictManagedResourcesInternal() {} void* GetIPCHWnd(); void SendIPCMessage( IPCMessage_t message ); protected: // IPC communication for multiple shaderapi apps void InstallWindowHook( void *hWnd ); void RemoveWindowHook( void *hWnd ); void SetCurrentThreadAsOwner(); void RemoveThreadOwner(); bool ThreadOwnsDevice(); // Finds a child window int FindView( void* hWnd ) const; int m_nAdapter; void *m_hWnd; void* m_hWndCookie; bool m_bInitialized : 1; bool m_bIsMinimized : 1; // The current view hwnd void* m_ViewHWnd; int m_nWindowWidth; int m_nWindowHeight; ThreadId_t m_dwThreadId; }; //----------------------------------------------------------------------------- // Inline methods //----------------------------------------------------------------------------- inline void* CShaderDeviceBase::GetIPCHWnd() { return m_hWndCookie; } //----------------------------------------------------------------------------- // Helper class to reduce code related to shader buffers //----------------------------------------------------------------------------- template< class T > class CShaderBuffer : public IShaderBuffer { public: CShaderBuffer( T *pBlob ) : m_pBlob( pBlob ) {} virtual size_t GetSize() const { return m_pBlob ? m_pBlob->GetBufferSize() : 0; } virtual const void* GetBits() const { return m_pBlob ? m_pBlob->GetBufferPointer() : NULL; } virtual void Release() { if ( m_pBlob ) { m_pBlob->Release(); } delete this; } private: T *m_pBlob; }; #endif // SHADERDEVICEBASE_H