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 /utils/dx_proxy/dx_proxy.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/dx_proxy/dx_proxy.cpp')
| -rw-r--r-- | utils/dx_proxy/dx_proxy.cpp | 380 |
1 files changed, 380 insertions, 0 deletions
diff --git a/utils/dx_proxy/dx_proxy.cpp b/utils/dx_proxy/dx_proxy.cpp new file mode 100644 index 0000000..d9b4b91 --- /dev/null +++ b/utils/dx_proxy/dx_proxy.cpp @@ -0,0 +1,380 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Proxy for D3DX routines +// +// $NoKeywords: $ +// +//=============================================================================// +// + +#include <windows.h> +#include <vector> + +// Aux function prototype +const char * WINAPI GetDllVersion( void ); + + +#ifdef _DEBUG +#define D3D_DEBUG_INFO 1 +#endif + + +// +// DX9_V00_PC +// +// D3DX static library +// MSFT file version: 5.3.0000001.0904 +// +#ifdef DX9_V00_PC + +#ifdef DX_PROXY_INC_CONFIG +# error "DX9_V00_PC: Multiple DX_PROXY configurations disallowed!" +#endif +#define DX_PROXY_INC_CONFIG +#pragma message ( "Compiling DX_PROXY for DX9_V00_PC" ) + +#if _MSC_VER >= 1900 +#pragma comment ( lib, "../../lib/common/win32/2015/release/d3dx9" ) +#else +#pragma comment ( lib, "../../dx9sdk/lib/d3dx9" ) +#endif +#include "../../dx9sdk/include/d3dx9shader.h" + +#endif // #ifdef DX9_V00_PC + + +// +// DX9_X360 +// +// D3DX win32 static library +// MSFT X360 SDK +// +#ifdef DX9_V00_X360 + +#ifdef DX_PROXY_INC_CONFIG +# error "DX9_V00_X360: Multiple DX_PROXY configurations disallowed!" +#endif +#define DX_PROXY_INC_CONFIG +#pragma message ( "Compiling DX_PROXY for DX9_V00_X360" ) + +// Avoid including XBOX math stuff +#define _NO_XBOXMATH +#define __D3DX9MATH_INL__ + +/*#ifdef _DEBUG +#pragma comment ( lib, "../../x360xdk/lib/win32/vs2005/d3d9d" ) +#pragma comment ( lib, "../../x360xdk/lib/win32/vs2005/d3dx9d" ) +#pragma comment ( lib, "../../x360xdk/lib/win32/vs2005/xgraphicsd" ) +#else*/ +#if _MSC_VER >= 1900 +#pragma comment ( lib, "../../x360xdk/lib/win32/vs2005/d3d9" ) +#pragma comment ( lib, "../../lib/common/win32/2015/release/d3dx9" ) +#else +#pragma comment ( lib, "../../x360xdk/lib/win32/vs2005/d3d9" ) +#pragma comment ( lib, "../../x360xdk/lib/win32/vs2005/d3dx9" ) +#pragma comment ( lib, "../../x360xdk/lib/win32/vs2005/xgraphics" ) +#endif + +#include "../../x360xdk/include/win32/vs2005/d3dx9shader.h" + +#endif // #ifdef DX9_V00_X360 + + +// +// DX9_V30_PC +// +// 1. D3DX static import library +// 2. resource dynamic library d3dx9_33.dll +// +// MSFT file version: 9.16.843.0000 +// Distribution: Dec 2006 DirectX SDK +// +// Implementation note: need to delayload d3dx9_33 +// because the module should be extracted from resources first. +// Make sure "/DELAYLOAD:d3dx9_33.dll" is passed to linker. +// +#ifdef DX9_V30_PC + +#ifdef DX_PROXY_INC_CONFIG +# error "DX9_V30_PC: Multiple DX_PROXY configurations disallowed!" +#endif +#define DX_PROXY_INC_CONFIG +#pragma message ( "Compiling DX_PROXY for DX9_V30_PC" ) + +#pragma comment( lib, "delayimp" ) + +#pragma comment ( lib, "../../dx10sdk/lib/x86/d3dx9" ) +#include "../../dx10sdk/include/d3dx9shader.h" + +#endif // #ifdef DX9_V30_PC + + +// +// DX10_V00_PC +// +// 1. D3DX static import library +// 2. resource dynamic library d3dx10.dll +// +// MSFT file version: 9.16.843.0000 +// Distribution: Dec 2006 DirectX SDK +// +// Implementation note: need to delayload d3dx10 +// because the module should be extracted from resources first. +// Make sure "/DELAYLOAD:d3dx10.dll" is passed to linker. +// +#ifdef DX10_V00_PC + +#ifdef DX_PROXY_INC_CONFIG +# error "DX10_V00_PC: Multiple DX_PROXY configurations disallowed!" +#endif +#define DX_PROXY_INC_CONFIG +#pragma message ( "Compiling DX_PROXY for DX10_V00_PC" ) + +#pragma comment( lib, "delayimp" ) + +#pragma comment ( lib, "../../dx10sdk/lib/x86/d3dx10" ) +#include "../../dx10sdk/include/d3dx10.h" + +typedef D3D10_SHADER_MACRO D3DXMACRO; +typedef LPD3D10INCLUDE LPD3DXINCLUDE; +typedef ID3D10Include ID3DXInclude; +typedef D3D10_INCLUDE_TYPE D3DXINCLUDE_TYPE; +typedef ID3D10Blob* LPD3DXBUFFER; +typedef void* LPD3DXCONSTANTTABLE; + +#endif // #ifdef DX10_V00_PC + + +// +// No DX configuration +#ifndef DX_PROXY_INC_CONFIG +# error "DX9_PC or DX9_X360 must be defined!" +#endif // #ifndef DX_PROXY_INC_CONFIG + + + +// +// ExtractDependencies +// +// Retrieves all the additional required binaries from the resources and +// places them to a temporary location. Then the binaries are mapped into +// the address space of the calling process. +// +static BOOL ExtractDependencies( void ) +{ + return TRUE; +/* + BOOL bResult = TRUE; + char chSyncName[0x30]; + char const *szDllVersion = GetDllVersion(); + sprintf( chSyncName, "%s_MTX", szDllVersion ); + + HANDLE hMutex = ::CreateMutex( NULL, FALSE, chSyncName ); + if ( !hMutex ) + return FALSE; + + DWORD dwWaitResult = ::WaitForSingleObject( hMutex, INFINITE ); + if ( dwWaitResult != WAIT_OBJECT_0 ) + return FALSE; + + // Now we own the mutex + char chExtractPath[0x100] = { 0 }; + if ( char const *pszTemp = getenv( "TEMP" ) ) + sprintf( chExtractPath, "%s\\", pszTemp ); + else if ( char const *pszTmp = getenv( "TMP" ) ) + sprintf( chExtractPath, "%s\\", pszTmp ); + else + bResult = FALSE; + + if ( bResult ) + { + sprintf( chExtractPath + strlen( chExtractPath ), "%s", szDllVersion ); + bResult = ::CreateDirectory( chExtractPath, NULL ); + + if ( bResult ) + { + sprintf( chExtractPath + strlen( chExtractPath ), "\\" ); + + char const * const arrNames[] = { +#ifdef DX9_V33_PC + "d3dx9_33.dll", MAKEINTRESOURCE( 1 ), +#else +#endif + NULL + }; + + // Now loop over the names + for ( int k = 0; k < sizeof( arrNames ) / ( 2 * sizeof( arrNames[0] ) ); ++ k ) + { + char const * const &szName = arrNames[ 2 * k ]; + char const * const &szResource = 1[ &szName ]; + + char chCreateFileName[0x200]; + sprintf( chCreateFileName, "%s%s", chExtractPath, szName ); + + HANDLE hFile = CreateFile( chCreateFileName, FILE_ALL_ACCESS, FILE_SHARE_READ, NULL, CREATE_NEW, + FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_DELETE_ON_CLOSE, NULL ); + #error "This is how you can create temp needed resources" + } + } + } + + ::ReleaseMutex( hMutex ); + ::CloseHandle( hMutex ); + + return bResult; +*/ +} + + +// DLL entry point: DllMain +BOOL WINAPI DllMain( + HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved + ) +{ + /*UNUSED_ALWAYS*/( hinstDLL ); + /*UNUSED_ALWAYS*/( lpvReserved ); + + switch ( fdwReason ) + { + case DLL_PROCESS_ATTACH: + // Process is attaching - make sure it can find the dependencies + return ExtractDependencies(); + } + + return TRUE; +} + + + + +// Obtain DLL version +#pragma comment(linker, "/EXPORT:GetDllVersionLong=?GetDllVersionLong@@YGPBDXZ") +const char * WINAPI GetDllVersionLong( void ) +{ +#if defined( DX9_V00_PC ) && defined( _DEBUG ) + return "{DX_PROXY for DX9_V00_PC DEBUG}"; +#endif + +#if defined( DX9_V00_PC ) && defined( NDEBUG ) + return "{DX_PROXY for DX9_V00_PC RELEASE}"; +#endif + +#if defined( DX9_V00_X360 ) && defined( _DEBUG ) + return "{DX_PROXY for DX9_V00_X360 DEBUG}"; +#endif + +#if defined( DX9_V00_X360 ) && defined( NDEBUG ) + return "{DX_PROXY for DX9_V00_X360 RELEASE}"; +#endif + +#if defined( DX9_V30_PC ) && defined( _DEBUG ) + return "{DX_PROXY for DX9_V30_PC DEBUG}"; +#endif + +#if defined( DX9_V30_PC ) && defined( NDEBUG ) + return "{DX_PROXY for DX9_V30_PC RELEASE}"; +#endif + +#if defined( DX10_V00_PC ) && defined( _DEBUG ) + return "{DX_PROXY for DX10_V00_PC DEBUG}"; +#endif + +#if defined( DX10_V00_PC ) && defined( NDEBUG ) + return "{DX_PROXY for DX10_V00_PC RELEASE}"; +#endif +} + + +#pragma comment(linker, "/EXPORT:GetDllVersion=?GetDllVersion@@YGPBDXZ") +const char * WINAPI GetDllVersion( void ) +{ +#if defined( DX9_V00_PC ) && defined( _DEBUG ) + return "DXPRX_DX9_V00_PC_d"; +#endif + +#if defined( DX9_V00_PC ) && defined( NDEBUG ) + return "DXPRX_DX9_V00_PC_r"; +#endif + +#if defined( DX9_V00_X360 ) && defined( _DEBUG ) + return "DXPRX_DX9_V00_X360_d"; +#endif + +#if defined( DX9_V00_X360 ) && defined( NDEBUG ) + return "DXPRX_DX9_V00_X360_r"; +#endif + +#if defined( DX9_V30_PC ) && defined( _DEBUG ) + return "DXPRX_DX9_V30_PC_d"; +#endif + +#if defined( DX9_V30_PC ) && defined( NDEBUG ) + return "DXPRX_DX9_V30_PC_r"; +#endif + +#if defined( DX10_V00_PC ) && defined( _DEBUG ) + return "DXPRX_DX10_V00_PC_d"; +#endif + +#if defined( DX10_V00_PC ) && defined( NDEBUG ) + return "DXPRX_DX10_V00_PC_r"; +#endif +} + + + +#include "filememcache.h" +#include "dxincludeimpl.h" + +char s_dummyBuffer[ 512 ]; + + +// Proxied routines +HRESULT WINAPI +Proxy_D3DXCompileShaderFromFile( + LPCSTR pSrcFile, + CONST D3DXMACRO* pDefines, + LPD3DXINCLUDE pInclude, + LPCSTR pFunctionName, + LPCSTR pProfile, + DWORD Flags, + LPD3DXBUFFER* ppShader, + LPD3DXBUFFER* ppErrorMsgs, + LPD3DXCONSTANTTABLE* ppConstantTable ) +{ + if ( !pInclude ) + pInclude = &s_incDxImpl; + + // Open the top-level file via our include interface + LPCVOID lpcvData; + UINT numBytes; + HRESULT hr = pInclude->Open( ( D3DXINCLUDE_TYPE ) 0, pSrcFile, NULL, &lpcvData, &numBytes +#if defined( DX9_V00_X360 ) + , s_dummyBuffer, sizeof( s_dummyBuffer ) +#endif + ); + if ( FAILED( hr ) ) + return hr; + + LPCSTR pShaderData = ( LPCSTR ) lpcvData; + +#if defined( DX9_V00_PC ) || defined( DX9_V30_PC ) || defined( DX9_V00_X360 ) + #pragma comment(linker, "/EXPORT:Proxy_D3DXCompileShaderFromFile=?Proxy_D3DXCompileShaderFromFile@@YGJPBDPBU_D3DXMACRO@@PAUID3DXInclude@@00KPAPAUID3DXBuffer@@3PAPAUID3DXConstantTable@@@Z") + hr = D3DXCompileShader( pShaderData, numBytes, pDefines, pInclude, pFunctionName, pProfile, Flags, ppShader, ppErrorMsgs, ppConstantTable ); +#endif + +#if defined( DX10_V00_PC ) + #pragma comment(linker, "/EXPORT:Proxy_D3DXCompileShaderFromFile=?Proxy_D3DXCompileShaderFromFile@@YGJPBDPBU_D3D10_SHADER_MACRO@@PAUID3D10Include@@00KPAPAUID3D10Blob@@3PAPAX@Z") + hr = D3DX10CompileFromMemory( pShaderData, numBytes, pSrcFile, pDefines, pInclude, pFunctionName, pProfile, Flags, 0, NULL, ppShader, ppErrorMsgs, NULL ); +#endif + + // Close the file + pInclude->Close( lpcvData ); + return hr; +} + + + |