|
|
//========= Copyright � 1996-2006, 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" )
#pragma comment ( lib, "../../dx9sdk/lib/d3dx9" )
#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__
#include "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
//__declspec(dllexport) - undef this to figure out the new decorated name in case you update the direct3d headers
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_D3D_SHADER_MACRO@@PAUID3DInclude@@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; }
|