You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
4.3 KiB
169 lines
4.3 KiB
5 years ago
|
//========= 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
|