Files
Xenia-Canary/src/xenia/profiling.cc
2014-08-16 18:31:54 -07:00

156 lines
4.1 KiB
C++

/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2014 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#define MICRO_PROFILE_IMPL
#define MICROPROFILE_USE_THREAD_NAME_CALLBACK 1
#include <xenia/profiling.h>
namespace xe {
std::unique_ptr<ProfilerDisplay> Profiler::display_ = nullptr;
#if XE_OPTION_PROFILING
void Profiler::Initialize() {
MicroProfileInit();
MicroProfileSetDisplayMode(1);
}
void Profiler::Dump() { MicroProfileDumpTimers(); }
void Profiler::Shutdown() {
display_.reset();
MicroProfileShutdown();
}
uint32_t Profiler::GetColor(const char* str) {
std::hash<std::string> fn;
size_t value = fn(str);
return value & 0xFFFFFF;
}
void Profiler::ThreadEnter(const char* name) {
MicroProfileOnThreadCreate(name);
}
void Profiler::ThreadExit() { MicroProfileOnThreadExit(); }
bool Profiler::OnKeyDown(int key_code) {
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
switch (key_code) {
case VK_TAB:
MicroProfileToggleDisplayMode();
return true;
case VK_OEM_3: // `
MicroProfileTogglePause();
return true;
case 0x31: // 1
MicroProfileModKey(1);
return true;
}
return false;
}
bool Profiler::OnKeyUp(int key_code) {
switch (key_code) {
case 0x31: // 1
MicroProfileModKey(0);
return true;
}
return false;
}
void Profiler::OnMouseDown(bool left_button, bool right_button) {
MicroProfileMouseButton(left_button, right_button);
}
void Profiler::OnMouseUp() { MicroProfileMouseButton(0, 0); }
void Profiler::OnMouseMove(int x, int y) { MicroProfileMousePosition(x, y, 0); }
void Profiler::OnMouseWheel(int x, int y, int dy) {
MicroProfileMousePosition(x, y, dy);
}
void Profiler::set_display(std::unique_ptr<ProfilerDisplay> display) {
display_ = std::move(display);
}
void Profiler::Present() {
MicroProfileFlip();
if (!display_) {
return;
}
display_->Begin();
MicroProfileDraw(display_->width(), display_->height());
display_->End();
}
#else
void Profiler::Initialize() {}
void Profiler::Dump() {}
void Profiler::Shutdown() {}
uint32_t Profiler::GetColor(const char* str) { return 0; }
void Profiler::ThreadEnter(const char* name) {}
void Profiler::ThreadExit() {}
bool Profiler::OnKeyDown(int key_code) { return false; }
bool Profiler::OnKeyUp(int key_code) { return false; }
void Profiler::OnMouseDown(bool left_button, bool right_button) {}
void Profiler::OnMouseUp() {}
void Profiler::OnMouseMove(int x, int y) {}
void Profiler::OnMouseWheel(int x, int y, int dy) {}
void Profiler::set_display(std::unique_ptr<ProfilerDisplay> display) {}
void Profiler::Present() {}
#endif // XE_OPTION_PROFILING
} // namespace xe
#if XE_OPTION_PROFILING
uint32_t MicroProfileGpuInsertTimeStamp() { return 0; }
uint64_t MicroProfileGpuGetTimeStamp(uint32_t nKey) { return 0; }
uint64_t MicroProfileTicksPerSecondGpu() { return 0; }
const char* MicroProfileGetThreadName() { return "TODO: get thread name!"; }
void MicroProfileDrawBox(int nX, int nY, int nX1, int nY1, uint32_t nColor,
MicroProfileBoxType type) {
auto display = xe::Profiler::display();
if (!display) {
return;
}
display->DrawBox(nX, nY, nX1, nY1, nColor,
static_cast<xe::ProfilerDisplay::BoxType>(type));
}
void MicroProfileDrawLine2D(uint32_t nVertices, float* pVertices,
uint32_t nColor) {
auto display = xe::Profiler::display();
if (!display) {
return;
}
display->DrawLine2D(nVertices, pVertices, nColor);
}
void MicroProfileDrawText(int nX, int nY, uint32_t nColor, const char* pText,
uint32_t nLen) {
auto display = xe::Profiler::display();
if (!display) {
return;
}
display->DrawText(nX, nY, nColor, pText, nLen);
}
#endif // XE_OPTION_PROFILING