source-engine/common/dx_proxy/dx_proxy.h

169 lines
4.3 KiB
C
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Make dynamic loading of dx_proxy.dll and methods acquisition easier.
//
// $NoKeywords: $
//
//=============================================================================//
#ifndef DX_PROXY_H
#define DX_PROXY_H
#ifdef _WIN32
#pragma once
#endif
/*
class DxProxyModule
Uses a lazy-load technique to load the dx_proxy.dll module and acquire the
function pointers.
The dx_proxy.dll module is automatically unloaded during desctruction.
*/
class DxProxyModule
{
public:
/// Construction
DxProxyModule( void );
/// Destruction
~DxProxyModule( void );
private: // Prevent copying via copy constructor or assignment
DxProxyModule( const DxProxyModule & );
DxProxyModule & operator = ( const DxProxyModule & );
public:
/// Loads the module and acquires function pointers, returns if the module was
/// loaded successfully.
/// If the module was already loaded the call has no effect and returns TRUE.
BOOL Load( void );
/// Frees the loaded module.
void Free( void );
private:
enum Func {
fnD3DXCompileShaderFromFile = 0,
fnTotal
};
HMODULE m_hModule; //!< The handle of the loaded dx_proxy.dll
FARPROC m_arrFuncs[fnTotal]; //!< The array of loaded function pointers
///
/// Interface functions calling into DirectX proxy
///
public:
HRESULT D3DXCompileShaderFromFile(
LPCSTR pSrcFile,
CONST D3DXMACRO* pDefines,
LPD3DXINCLUDE pInclude,
LPCSTR pFunctionName,
LPCSTR pProfile,
DWORD Flags,
LPD3DXBUFFER* ppShader,
LPD3DXBUFFER* ppErrorMsgs,
LPD3DXCONSTANTTABLE* ppConstantTable );
};
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
// IMPLEMENTATION
//
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
inline DxProxyModule::DxProxyModule( void )
{
m_hModule = NULL;
ZeroMemory( m_arrFuncs, sizeof( m_arrFuncs ) );
}
inline DxProxyModule::~DxProxyModule( void )
{
Free();
}
inline BOOL DxProxyModule::Load( void )
{
if ( (m_hModule == NULL) &&
( m_hModule = ::LoadLibrary( "dx_proxy.dll" ) ) != NULL )
{
// Requested function names array
LPCSTR const arrFuncNames[fnTotal] = {
"Proxy_D3DXCompileShaderFromFile"
};
// Acquire the functions
for ( int k = 0; k < fnTotal; ++ k )
{
m_arrFuncs[k] = ::GetProcAddress( m_hModule, arrFuncNames[k] );
}
}
return !!m_hModule;
}
inline void DxProxyModule::Free( void )
{
if ( m_hModule )
{
::FreeLibrary( m_hModule );
m_hModule = NULL;
ZeroMemory( m_arrFuncs, sizeof( m_arrFuncs ) );
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
// INTERFACE FUNCTIONS IMPLEMENTATION
//
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
inline HRESULT DxProxyModule::D3DXCompileShaderFromFile(
LPCSTR pSrcFile,
CONST D3DXMACRO* pDefines,
LPD3DXINCLUDE pInclude,
LPCSTR pFunctionName,
LPCSTR pProfile,
DWORD Flags,
LPD3DXBUFFER* ppShader,
LPD3DXBUFFER* ppErrorMsgs,
LPD3DXCONSTANTTABLE* ppConstantTable )
{
if ( !Load() )
return MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 1 );
if ( !m_arrFuncs[fnD3DXCompileShaderFromFile] )
return MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 2 );
return
( *
( HRESULT (WINAPI *)
( LPCSTR, CONST D3DXMACRO*, LPD3DXINCLUDE,
LPCSTR, LPCSTR, DWORD, LPD3DXBUFFER*,
LPD3DXBUFFER*, LPD3DXCONSTANTTABLE* )
)
m_arrFuncs[fnD3DXCompileShaderFromFile]
)
( pSrcFile, pDefines, pInclude, pFunctionName, pProfile, Flags, ppShader, ppErrorMsgs, ppConstantTable );
}
#endif // #ifndef DX_PROXY_H