summaryrefslogtreecommitdiff
path: root/common/dx_proxy/dx_proxy.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/dx_proxy/dx_proxy.h')
-rw-r--r--common/dx_proxy/dx_proxy.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/common/dx_proxy/dx_proxy.h b/common/dx_proxy/dx_proxy.h
new file mode 100644
index 0000000..2dd9122
--- /dev/null
+++ b/common/dx_proxy/dx_proxy.h
@@ -0,0 +1,168 @@
+//========= 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