source-engine/materialsystem/shaderapidx9/shaderdevicebase.h
2022-06-05 01:12:32 +03:00

234 lines
7.0 KiB
C++

//========= Copyright 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
//-----------------------------------------------------------------------------
// Uncomment to check for -nulldevice on command line and use D3DDEVTYPE_NULLREF.
//-----------------------------------------------------------------------------
#define ENABLE_NULLREF_DEVICE_SUPPORT
//-----------------------------------------------------------------------------
// The Base implementation of the shader device
//-----------------------------------------------------------------------------
class CShaderDeviceMgrBase : public 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 );
// 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();
// 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 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;
// 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;
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;
uintp 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