diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /materialsystem/shaderapidx9/shaderdevicebase.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'materialsystem/shaderapidx9/shaderdevicebase.h')
| -rw-r--r-- | materialsystem/shaderapidx9/shaderdevicebase.h | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/materialsystem/shaderapidx9/shaderdevicebase.h b/materialsystem/shaderapidx9/shaderdevicebase.h new file mode 100644 index 0000000..37d7cc0 --- /dev/null +++ b/materialsystem/shaderapidx9/shaderdevicebase.h @@ -0,0 +1,234 @@ +//========= 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; + uint32 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
\ No newline at end of file |