205 lines
6.1 KiB
C++
205 lines
6.1 KiB
C++
//====== Copyright © , Valve Corporation, All rights reserved. =======//
|
|
#ifndef SCECGC_PROXY_HDR
|
|
#define SCECGC_PROXY_HDR
|
|
|
|
#include "cg/cgc.h"
|
|
|
|
class SceCgcProxyModule
|
|
{
|
|
public:
|
|
SceCgcProxyModule();
|
|
~SceCgcProxyModule();
|
|
|
|
/// 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:
|
|
// see C:\usr\local\cell\host-win32\Cg\include\cgc.h for the function signatures
|
|
enum Func {
|
|
sceCgcCapCalcHash_Fletcher32,
|
|
sceCgcCapCalcHash_Fletcher32_Enhanced,
|
|
sceCgcCapCalcHash_MD5,
|
|
sceCgcCapGetShaderHash,
|
|
sceCgcCapGetShaderHash_header,
|
|
compile_program_from_string,
|
|
free_compiled_program,
|
|
sceCgcCompileFile,
|
|
sceCgcCompileString,
|
|
sceCgcDebugTraceBin,
|
|
sceCgcDeleteBin,
|
|
sceCgcDeleteContext,
|
|
sceCgcGetBinData,
|
|
sceCgcGetBinSize,
|
|
sceCgcNewBin,
|
|
sceCgcNewContext,
|
|
sceCgcStoreBinData,
|
|
fnTotal
|
|
};
|
|
HMODULE m_hModule; //!< The handle of the loaded dx_proxy.dll
|
|
FARPROC m_arrFuncs[fnTotal]; //!< The array of loaded function pointers
|
|
|
|
typedef CGCcontext* (*sceCgcNewContext_t)( CGCmem* pool );
|
|
typedef void (*sceCgcDeleteContext_t)( CGCcontext* context );
|
|
|
|
typedef CGCbin* (*sceCgcNewBin_t)( CGCmem* pool );
|
|
typedef void* (*sceCgcGetBinData_t)( CGCbin* bin );
|
|
typedef size_t (*sceCgcGetBinSize_t)( CGCbin* bin );
|
|
typedef CGCstatus (*sceCgcStoreBinData_t)( CGCbin* bin, void* data, size_t size );
|
|
typedef void (*sceCgcDeleteBin_t)( CGCbin* bin );
|
|
|
|
typedef CGCstatus (*sceCgcCompileString_t)( CGCcontext* context,
|
|
const char* sourceString,
|
|
const char* profile,
|
|
const char* entry,
|
|
const char** options,
|
|
CGCbin* shaderBinary,
|
|
CGCbin* messages ,
|
|
CGCbin* asciiOutput ,
|
|
CGCinclude* includeHandler );
|
|
|
|
sceCgcNewContext_t m_sceCgcNewContext;
|
|
sceCgcDeleteContext_t m_sceCgcDeleteContext;
|
|
sceCgcNewBin_t m_sceCgcNewBin;
|
|
sceCgcGetBinData_t m_sceCgcGetBinData;
|
|
sceCgcGetBinSize_t m_sceCgcGetBinSize;
|
|
sceCgcStoreBinData_t m_sceCgcStoreBinData;
|
|
sceCgcDeleteBin_t m_sceCgcDeleteBin;
|
|
|
|
sceCgcCompileString_t m_sceCgcCompileString;
|
|
|
|
///
|
|
/// Interface functions calling into DirectX proxy
|
|
///
|
|
public:
|
|
|
|
HRESULT CompileShaderFromFile(
|
|
LPCSTR pSrcFile,
|
|
CONST D3DXMACRO* pDefines,
|
|
LPD3DXINCLUDE pInclude,
|
|
LPCSTR pFunctionName,
|
|
LPCSTR pProfile,
|
|
DWORD Flags,
|
|
LPD3DXBUFFER* ppShader,
|
|
LPD3DXBUFFER* ppErrorMsgs,
|
|
LPD3DXCONSTANTTABLE* ppConstantTable
|
|
);
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IMPLEMENTATION
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
inline SceCgcProxyModule::SceCgcProxyModule( void )
|
|
{
|
|
m_hModule = NULL;
|
|
ZeroMemory( m_arrFuncs, sizeof( m_arrFuncs ) );
|
|
}
|
|
|
|
inline SceCgcProxyModule::~SceCgcProxyModule( void )
|
|
{
|
|
Free();
|
|
}
|
|
|
|
inline BOOL SceCgcProxyModule::Load( void )
|
|
{
|
|
if ( (m_hModule == NULL) &&
|
|
( ( m_hModule = ::LoadLibrary( "libcgc.dll" ) ) != NULL
|
|
//||( m_hModule = ::LoadLibrary( "\\usr\\local\\cell\\host-win32\\Cg\\bin\\libcgc.dll" ) ) != NULL
|
|
||( m_hModule = ::LoadLibrary( "C:\\usr\\local\\cell\\host-win32\\Cg\\bin\\libcgc.dll" ) ) != NULL
|
|
)
|
|
)
|
|
{
|
|
// Requested function names array
|
|
LPCSTR const arrFuncNames[fnTotal] = {
|
|
"sceCgcCapCalcHash_Fletcher32",
|
|
"sceCgcCapCalcHash_Fletcher32_Enhanced",
|
|
"sceCgcCapCalcHash_MD5",
|
|
"sceCgcCapGetShaderHash",
|
|
"sceCgcCapGetShaderHash_header",
|
|
"compile_program_from_string",
|
|
"free_compiled_program",
|
|
"sceCgcCompileFile",
|
|
"sceCgcCompileString",
|
|
"sceCgcDebugTraceBin",
|
|
"sceCgcDeleteBin",
|
|
"sceCgcDeleteContext",
|
|
"sceCgcGetBinData",
|
|
"sceCgcGetBinSize",
|
|
"sceCgcNewBin",
|
|
"sceCgcNewContext",
|
|
"sceCgcStoreBinData"
|
|
};
|
|
|
|
// Acquire the functions
|
|
for ( int k = 0; k < fnTotal; ++ k )
|
|
{
|
|
m_arrFuncs[k] = ::GetProcAddress( m_hModule, arrFuncNames[k] );
|
|
}
|
|
|
|
// regexp: replace {[(a-z)|(A-Z)]*}_t m_[(a-z)|(A-Z)]*; with m_\1 = (\1_t)m_arrFuncs[\1];
|
|
m_sceCgcNewContext = (sceCgcNewContext_t)m_arrFuncs[sceCgcNewContext];
|
|
m_sceCgcDeleteContext = (sceCgcDeleteContext_t) m_arrFuncs[sceCgcNewContext];
|
|
|
|
m_sceCgcNewBin = (sceCgcNewBin_t)m_arrFuncs[sceCgcNewBin];
|
|
m_sceCgcGetBinData = (sceCgcGetBinData_t)m_arrFuncs[sceCgcGetBinData];
|
|
m_sceCgcGetBinSize = (sceCgcGetBinSize_t)m_arrFuncs[sceCgcGetBinSize];
|
|
m_sceCgcStoreBinData = (sceCgcStoreBinData_t)m_arrFuncs[sceCgcStoreBinData];
|
|
m_sceCgcDeleteBin = (sceCgcDeleteBin_t)m_arrFuncs[sceCgcDeleteBin];
|
|
|
|
m_sceCgcCompileString = (sceCgcCompileString_t)m_arrFuncs[sceCgcCompileString];
|
|
}
|
|
|
|
return !!m_hModule;
|
|
}
|
|
|
|
inline void SceCgcProxyModule::Free( void )
|
|
{
|
|
if ( m_hModule )
|
|
{
|
|
::FreeLibrary( m_hModule );
|
|
m_hModule = NULL;
|
|
ZeroMemory( m_arrFuncs, sizeof( m_arrFuncs ) );
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// INTERFACE FUNCTIONS IMPLEMENTATION
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
inline HRESULT SceCgcProxyModule::CompileShaderFromFile(
|
|
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[sceCgcCompileFile] )
|
|
return MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 2 );
|
|
// TODO: call m_sceCgcCompileFile
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
#endif
|