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.
380 lines
9.4 KiB
380 lines
9.4 KiB
//========= 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; |
|
} |
|
|
|
|
|
|
|
|