Files
GTASource/game/renderer/Util/ShmooFile.cpp
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

210 lines
4.6 KiB
C++

// ======================
// renderer/util/shmoofile.cpp
// (c) 2010 RockstarNorth
// ======================
#if __PS3
#include "parser/manager.h"
#include "system/param.h"
#include "bank/bank.h"
#include "grcore/channel.h"
#include "grmodel/shader.h"
#include "renderer/util/shmoofile.h"
#include "ShmooFile_parser.h"
namespace rage {
NOSTRIP_XPARAM(useFinalShaders);
NOSTRIP_XPARAM(useOptimizedShaders);
};
static void formatFileName(char *filename,const char *shadername)
{
bool bUseFinalShaders = __FINAL ? true : false;
if ( PARAM_useFinalShaders.Get() )
{
int nParam = 0;
PARAM_useFinalShaders.Get(nParam);
bUseFinalShaders = nParam ? true : false;
}
bool bUseOptimizedShaders = __FINAL ? true : false;
if ( PARAM_useOptimizedShaders.Get() )
{
int nParam = 0;
PARAM_useOptimizedShaders.Get(nParam);
bUseOptimizedShaders = nParam ? true : false;
}
const char *platformString = "psn";
char pStrPlatformFolder[32];
if ( bUseFinalShaders || bUseOptimizedShaders )
{
Assert( (strlen(platformString) + sizeof("_final") PS3_ONLY(+ sizeof("_optimized"))) <= sizeof(pStrPlatformFolder) );
strncpy( pStrPlatformFolder, platformString, sizeof(pStrPlatformFolder) );
if ( bUseOptimizedShaders )
strncat( pStrPlatformFolder, "_optimized", sizeof("_optimized") );
if ( bUseFinalShaders )
strncat( pStrPlatformFolder, "_final", sizeof("_final") );
platformString = &pStrPlatformFolder[0];
}
sprintf(filename,"common:/shaders/%s/%s",platformString,shadername);
}
#if __BANK
void ShmooFile::Set(const atArray<grcShmoo::Result> &results)
{
for(int i=0;i<results.GetCount();i++)
{
ShmooItem &item = m_ShmooItems.Grow();
item.m_TechniqueName = results[i].TechniqueName;
item.m_Pass = results[i].PassIndex;
item.m_RegisterCount = results[i].RegisterCount;
}
}
bool ShmooFile::Save(const char *shadername)
{
char filename[1024];
formatFileName(filename,shadername);
return PARSER.SaveObject(filename, "xml", this);
}
#endif // __BANK
bool ShmooFile::Load(const char* shadername)
{
bool result = false;
char filename[1024];
formatFileName(filename,shadername);
if (ASSET.Exists(filename, "xml"))
result = PARSER.LoadObject(filename, "xml", *this);
return result;
}
void ShmooFile::Apply(grmShader *shader)
{
atArray<grcShmoo::Result> results;
for(int i=0;i<m_ShmooItems.GetCount();i++)
{
grcShmoo::Result &res = results.Grow();
res.TechniqueName = m_ShmooItems[i].m_TechniqueName;
res.PassIndex = m_ShmooItems[i].m_Pass;
res.RegisterCount = m_ShmooItems[i].m_RegisterCount;
}
grcShmoo::ApplyResults(shader,results);
}
static atArray<grcShmoo *> shmooArray;
static atArray<float> deltaArray;
int ShmooHandling::Register(const char* shaderName, grmShader *shader, bool shouldExist, float improvementDelta)
{
ShmooFile file;
bool loaded = file.Load(shaderName);
if( loaded )
{
grcDisplayf("Loaded %s Shmoo file",shaderName);
file.Apply(shader);
}
if( shouldExist && loaded == false )
{
grcWarningf("Failed to load %s shmoo file",shaderName);
}
#if GENERATE_SHMOO
int instanceCount = 0;
int techCount = shader->GetTechniqueCount();
for(int i=0;i<techCount;i++)
{
grcEffectTechnique tech = shader->GetTechniqueByIndex(i);
instanceCount += shader->GetPassCount(tech);
}
grcShmoo * shm = rage_new grcShmoo(shaderName,instanceCount);
shmooArray.PushAndGrow(shm);
deltaArray.PushAndGrow(improvementDelta);
return shmooArray.GetCount() - 1;
#else
return -1;
#endif
}
#if GENERATE_SHMOO
bool ShmooHandling::IsShmooEnable(int shmooIdx)
{
if( shmooIdx > -1 )
return shmooArray[shmooIdx]->IsEnabled();
return false;
}
void ShmooHandling::BeginShmoo(int shmooIdx, const grmShader *shader, int pass)
{
if( shmooIdx > -1 )
shmooArray[shmooIdx]->Begin(shader, pass);
}
void ShmooHandling::EndShmoo(int shmooIdx)
{
if( shmooIdx > -1 )
shmooArray[shmooIdx]->End();
}
#if __BANK
static void SaveShmooFiles()
{
for(int i=0;i<shmooArray.GetCount();i++)
{
if( shmooArray[i]->IsEnabled() )
{
atArray<grcShmoo::Result> results;
shmooArray[i]->GetResults(results,deltaArray[i]);
ShmooFile file;
file.Set(results);
bool res = file.Save(shmooArray[i]->GetName());
if( res )
grcDisplayf("Saved %s shmoofile", shmooArray[i]->GetName().c_str());
Assertf(res, "Failed to save %s shmoofile", shmooArray[i]->GetName().c_str());
}
}
}
void ShmooHandling::AddWidgets(bkBank& bank)
{
bank.PushGroup("Shmoo");
bank.AddButton("Save Shmoo Files",CFA1(SaveShmooFiles));
for(int i=0;i<shmooArray.GetCount();i++)
{
shmooArray[i]->AddWidgets(bank);
}
bank.PopGroup();
}
#endif // __BANK
#endif // GENERATE_SHMOO
#endif // __PS3