initial
This commit is contained in:
239
materialsystem/shaderapidx9/shaderdevicebase.h
Normal file
239
materialsystem/shaderapidx9/shaderdevicebase.h
Normal file
@@ -0,0 +1,239 @@
|
||||
//===== Copyright <20> 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
|
||||
Reference in New Issue
Block a user