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.
363 lines
8.9 KiB
363 lines
8.9 KiB
//========= 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;
|
|
}
|
|
|
|
|
|
|