csgo-2018-source/common/dx_proxy/scecgc_proxy.h
2021-07-24 21:11:47 -07:00

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