|
|
//===== 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<AdapterInfo_t> 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
|