mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-08-02 03:16:11 -04:00
Initial commits of the sharedDebug and sharedMemoryManager projects
This commit is contained in:
@@ -0,0 +1,505 @@
|
||||
// ======================================================================
|
||||
//
|
||||
// PixCounter.cpp
|
||||
// Copyright 2004 Sony Online Entertainment
|
||||
// All Rights Reserved
|
||||
//
|
||||
// ======================================================================
|
||||
|
||||
#include "sharedDebug/FirstSharedDebug.h"
|
||||
#include "sharedDebug/PixCounter.h"
|
||||
|
||||
#if PRODUCTION == 0
|
||||
|
||||
#include "sharedFoundation/ExitChain.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
// ======================================================================
|
||||
|
||||
#ifdef _WIN32
|
||||
#define STDCALL __stdcall
|
||||
#else
|
||||
#define STDCALL
|
||||
#endif
|
||||
|
||||
namespace PixCounterNamespace
|
||||
{
|
||||
typedef std::vector<PixCounter::Counter *> Counters;
|
||||
typedef BOOL (STDCALL *SetCounterFloat)(char const * name, float * value);
|
||||
typedef BOOL (STDCALL *SetCounterInt)(char const * name, int * value);
|
||||
typedef BOOL (STDCALL *SetCounterInt64)(char const * name, __int64 * value);
|
||||
typedef BOOL (STDCALL *SetCounterString)(char const * name, char const * const * value);
|
||||
typedef void (STDCALL *PollRoutine)();
|
||||
typedef void (STDCALL *ClientInstall)(bool * active, PollRoutine pollRoutine);
|
||||
|
||||
void remove();
|
||||
void STDCALL poll();
|
||||
|
||||
#ifdef _WIN32
|
||||
HINSTANCE ms_pixDll;
|
||||
#endif
|
||||
SetCounterFloat ms_setCounterFloat;
|
||||
SetCounterInt ms_setCounterInt;
|
||||
SetCounterInt64 ms_setCounterInt64;
|
||||
SetCounterString ms_setCounterString;
|
||||
Counters ms_counters;
|
||||
bool ms_enabled;
|
||||
bool ms_connectedToPixProfiler;
|
||||
}
|
||||
using namespace PixCounterNamespace;
|
||||
|
||||
// ======================================================================
|
||||
|
||||
void PixCounter::install()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
ms_pixDll = LoadLibrary("C:\\Program Files\\Microsoft DirectX 9.0 SDK (October 2004)\\Utilities\\PIX\\SoePix.PIXPlugin");
|
||||
if (ms_pixDll)
|
||||
{
|
||||
ms_setCounterFloat = reinterpret_cast<SetCounterFloat> (GetProcAddress(ms_pixDll, "SetCounterFloat"));
|
||||
ms_setCounterInt = reinterpret_cast<SetCounterInt> (GetProcAddress(ms_pixDll, "SetCounterInt"));
|
||||
ms_setCounterInt64 = reinterpret_cast<SetCounterInt64> (GetProcAddress(ms_pixDll, "SetCounterInt64"));
|
||||
ms_setCounterString = reinterpret_cast<SetCounterString>(GetProcAddress(ms_pixDll, "SetCounterString"));
|
||||
|
||||
NOT_NULL(ms_setCounterFloat);
|
||||
NOT_NULL(ms_setCounterInt);
|
||||
NOT_NULL(ms_setCounterInt64);
|
||||
NOT_NULL(ms_setCounterString);
|
||||
|
||||
ClientInstall clientInstall = reinterpret_cast<ClientInstall>(GetProcAddress(ms_pixDll, "ClientInstall"));
|
||||
NOT_NULL(clientInstall);
|
||||
(*clientInstall)(&ms_connectedToPixProfiler, &PixCounterNamespace::poll);
|
||||
|
||||
ExitChain::add(PixCounterNamespace::remove, "PixCounter");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounterNamespace::remove()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
FreeLibrary(ms_pixDll);
|
||||
ms_pixDll = NULL;
|
||||
#endif
|
||||
|
||||
ms_setCounterFloat = NULL;
|
||||
ms_setCounterInt = NULL;
|
||||
ms_setCounterInt64 = NULL;
|
||||
ms_setCounterString = NULL;
|
||||
|
||||
// Make sure the counter memory gets freed at this point
|
||||
Counters().swap(ms_counters);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::enable()
|
||||
{
|
||||
if (!ms_enabled)
|
||||
{
|
||||
resetAllCounters();
|
||||
ms_enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::disable()
|
||||
{
|
||||
ms_enabled = false;
|
||||
resetAllCounters();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
bool PixCounter::isEnabled()
|
||||
{
|
||||
return ms_enabled;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
bool PixCounter::connectedToPixProfiler()
|
||||
{
|
||||
return ms_connectedToPixProfiler;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::bindToCounter(char const * name, int * value)
|
||||
{
|
||||
if (ms_setCounterInt && (*ms_setCounterInt)(name, value) == false)
|
||||
DEBUG_WARNING(true, ("Could not bind int pix counter %s", name));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::bindToCounter(char const * name, float * value)
|
||||
{
|
||||
if (ms_setCounterFloat && (*ms_setCounterFloat)(name, value) == false)
|
||||
DEBUG_WARNING(true, ("Could not bind float pix counter %s", name));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::bindToCounter(char const * name, __int64 * value)
|
||||
{
|
||||
if (ms_setCounterInt64 && (*ms_setCounterInt64)(name, value) == false)
|
||||
DEBUG_WARNING(true, ("Could not bind int64 pix counter %s", name));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::bindToCounter(char const * name, char const * const * value)
|
||||
{
|
||||
if (ms_setCounterString && (*ms_setCounterString)(name, value) == false)
|
||||
DEBUG_WARNING(true, ("Could not bind string pix counter %s", name));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::resetAllCounters()
|
||||
{
|
||||
Counters::iterator const iEnd = ms_counters.end();
|
||||
for (Counters::iterator i = ms_counters.begin(); i != iEnd; ++i)
|
||||
(*i)->reset();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::update()
|
||||
{
|
||||
if (!ms_connectedToPixProfiler)
|
||||
poll();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void STDCALL PixCounterNamespace::poll()
|
||||
{
|
||||
if (ms_enabled)
|
||||
{
|
||||
Counters::iterator const iEnd = ms_counters.end();
|
||||
for (Counters::iterator i = ms_counters.begin(); i != iEnd; ++i)
|
||||
(*i)->poll();
|
||||
}
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
PixCounter::Counter::Counter()
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
PixCounter::Counter::~Counter()
|
||||
{
|
||||
disable();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Counter::enable()
|
||||
{
|
||||
ms_counters.push_back(this);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Counter::disable()
|
||||
{
|
||||
Counters::iterator i = std::find(ms_counters.begin(), ms_counters.end(), this);
|
||||
if (i != ms_counters.end())
|
||||
ms_counters.erase(i);
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
PixCounter::Integer::Integer()
|
||||
: Counter(),
|
||||
m_lastFrameValue(0),
|
||||
m_currentValue(0)
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Integer::bindToCounter(char const * name)
|
||||
{
|
||||
PixCounter::bindToCounter(name, &m_lastFrameValue);
|
||||
enable();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Integer::poll()
|
||||
{
|
||||
m_lastFrameValue = m_currentValue;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Integer::reset()
|
||||
{
|
||||
m_currentValue = 0;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Integer::operator =(int value)
|
||||
{
|
||||
m_currentValue = value;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Integer::operator +=(int value)
|
||||
{
|
||||
m_currentValue += value;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Integer::operator ++()
|
||||
{
|
||||
++m_currentValue;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
int PixCounter::Integer::getCurrentValue() const
|
||||
{
|
||||
return m_currentValue;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
int PixCounter::Integer::getLastFrameValue() const
|
||||
{
|
||||
return m_lastFrameValue;
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
PixCounter::ResetInteger::ResetInteger()
|
||||
: Integer()
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::ResetInteger::poll()
|
||||
{
|
||||
Integer::poll();
|
||||
reset();
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
PixCounter::Float::Float()
|
||||
: Counter(),
|
||||
m_lastFrameValue(0.0f),
|
||||
m_currentValue(0.0f)
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Float::bindToCounter(char const * name)
|
||||
{
|
||||
PixCounter::bindToCounter(name, &m_lastFrameValue);
|
||||
enable();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Float::poll()
|
||||
{
|
||||
m_lastFrameValue = m_currentValue;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Float::reset()
|
||||
{
|
||||
m_currentValue = 0.0f;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Float::operator =(float value)
|
||||
{
|
||||
m_currentValue = value;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::Float::operator +=(float value)
|
||||
{
|
||||
m_currentValue += value;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
float PixCounter::Float::getCurrentValue() const
|
||||
{
|
||||
return m_currentValue;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
float PixCounter::Float::getLastFrameValue() const
|
||||
{
|
||||
return m_lastFrameValue;
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
PixCounter::ResetFloat::ResetFloat()
|
||||
: Float()
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::ResetFloat::poll()
|
||||
{
|
||||
Float::poll();
|
||||
reset();
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
PixCounter::String::String()
|
||||
: Counter(),
|
||||
m_enabled(false),
|
||||
m_lastFrameValue(),
|
||||
m_lastFrameValuePointer(NULL),
|
||||
m_currentValue()
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::bindToCounter(char const * name)
|
||||
{
|
||||
PixCounter::bindToCounter(name, &m_lastFrameValuePointer);
|
||||
enable();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::poll()
|
||||
{
|
||||
m_lastFrameValue = m_currentValue;
|
||||
m_lastFrameValuePointer = &(m_lastFrameValue.c_str()[0]);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::pollAndReset()
|
||||
{
|
||||
m_lastFrameValue.swap(m_currentValue);
|
||||
m_currentValue.clear();
|
||||
m_lastFrameValuePointer = &(m_lastFrameValue.c_str()[0]);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::reset()
|
||||
{
|
||||
m_currentValue.clear();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::enable()
|
||||
{
|
||||
Counter::enable();
|
||||
m_enabled = true;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::disable()
|
||||
{
|
||||
Counter::disable();
|
||||
m_enabled = false;
|
||||
m_lastFrameValue.clear();
|
||||
m_currentValue.clear();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::operator =(const char * value)
|
||||
{
|
||||
if (ms_enabled && m_enabled)
|
||||
m_currentValue = value;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::operator +=(const char * value)
|
||||
{
|
||||
if (ms_enabled && m_enabled)
|
||||
m_currentValue += value;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::set(const char * format, ...)
|
||||
{
|
||||
if (ms_enabled && m_enabled)
|
||||
{
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
|
||||
char buffer[512];
|
||||
vsnprintf(buffer, sizeof(buffer), format, va);
|
||||
buffer[sizeof(buffer-1)] = '\0';
|
||||
operator =(buffer);
|
||||
|
||||
va_end(va);
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::String::append(const char * format, ...)
|
||||
{
|
||||
if (ms_enabled && m_enabled)
|
||||
{
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
|
||||
char buffer[512];
|
||||
vsnprintf(buffer, sizeof(buffer), format, va);
|
||||
buffer[sizeof(buffer)-1] = '\0';
|
||||
operator +=(buffer);
|
||||
|
||||
va_end(va);
|
||||
}
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
PixCounter::ResetString::ResetString()
|
||||
: String()
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void PixCounter::ResetString::poll()
|
||||
{
|
||||
String::pollAndReset();
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user