diff --git a/CMakeLists.txt b/CMakeLists.txt
index 221a92b3..920b2b18 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -135,9 +135,6 @@ add_library(imgui-static STATIC
list(APPEND RELIB_INCLUDES deps/cimgui)
list(APPEND IMGUI_LIBS imgui-static)
-# microprofile
-list(APPEND RELIB_INCLUDES deps/microprofile)
-
# sdl2
set(DIRECTX OFF CACHE BOOL "")
set(RENDER_D3D OFF CACHE BOOL "")
@@ -188,7 +185,7 @@ set(RELIB_SOURCES
src/core/md5.c
src/core/memory.c
src/core/option.c
- src/core/profiler.cc
+ src/core/profiler.c
src/core/ringbuf.cc
src/core/rb_tree.c
src/core/sort.c
@@ -249,8 +246,7 @@ set(RELIB_SOURCES
src/jit/jit.c
src/jit/pass_stats.c
src/render/gl_backend.c
- src/imgui.cc
- src/microprofile.cc)
+ src/imgui.cc)
if(PLATFORM_ANDROID)
list(APPEND RELIB_DEFS PLATFORM_ANDROID=1)
@@ -357,7 +353,7 @@ else()
set(REDREAM_SOURCES ${RELIB_SOURCES} src/host/sdl_host.c src/emulator.c src/tracer.c)
set(REDREAM_INCLUDES ${RELIB_INCLUDES})
set(REDREAM_LIBS ${RELIB_LIBS} ${IMGUI_LIBS} ${SDL_LIBS})
- set(REDREAM_DEFS ${RELIB_DEFS} HAVE_GDBSERVER HAVE_IMGUI HAVE_MICROPROFILE)
+ set(REDREAM_DEFS ${RELIB_DEFS} HAVE_GDBSERVER HAVE_IMGUI)
set(REDREAM_FLAGS ${RELIB_FLAGS})
endif()
diff --git a/deps/libretro/Makefile.common b/deps/libretro/Makefile.common
index d8c0403d..5d72bac3 100644
--- a/deps/libretro/Makefile.common
+++ b/deps/libretro/Makefile.common
@@ -84,8 +84,7 @@ SOURCES_C := $(CORE_DIR)/src/core/assert.c \
$(CORE_DIR)/src/host/retro_host.c \
$(CORE_DIR)/src/render/gl_backend.c
-SOURCES_CXX += $(CORE_DIR)/src/render/imgui.cc \
- $(CORE_DIR)/src/render/microprofile.cc
+SOURCES_CXX += $(CORE_DIR)/src/imgui.cc
#==--------------------------------------------------------------------------==#
# capstone
diff --git a/deps/microprofile/microprofile/microprofile.h b/deps/microprofile/microprofile/microprofile.h
deleted file mode 100644
index 25372721..00000000
--- a/deps/microprofile/microprofile/microprofile.h
+++ /dev/null
@@ -1,3899 +0,0 @@
-#pragma once
-// This is free and unencumbered software released into the public domain.
-// Anyone is free to copy, modify, publish, use, compile, sell, or
-// distribute this software, either in source code form or as a compiled
-// binary, for any purpose, commercial or non-commercial, and by any
-// means.
-// In jurisdictions that recognize copyright laws, the author or authors
-// of this software dedicate any and all copyright interest in the
-// software to the public domain. We make this dedication for the benefit
-// of the public at large and to the detriment of our heirs and
-// successors. We intend this dedication to be an overt act of
-// relinquishment in perpetuity of all present and future rights to this
-// software under copyright law.
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-// For more information, please refer to
-//
-// ***********************************************************************
-//
-//
-//
-//
-// Howto:
-// Call these functions from your code:
-// MicroProfileOnThreadCreate
-// MicroProfileMouseButton
-// MicroProfileMousePosition
-// MicroProfileModKey
-// MicroProfileFlip <-- Call this once per frame
-// MicroProfileDraw <-- Call this once per frame
-// MicroProfileToggleDisplayMode <-- Bind to a key to toggle profiling
-// MicroProfileTogglePause <-- Bind to a key to toggle pause
-//
-// Use these macros in your code in blocks you want to time:
-//
-// MICROPROFILE_DECLARE
-// MICROPROFILE_DEFINE
-// MICROPROFILE_DECLARE_GPU
-// MICROPROFILE_DEFINE_GPU
-// MICROPROFILE_SCOPE
-// MICROPROFILE_SCOPEI
-// MICROPROFILE_SCOPEGPU
-// MICROPROFILE_SCOPEGPUI
-// MICROPROFILE_META
-//
-//
-// Usage:
-//
-// {
-// MICROPROFILE_SCOPEI("GroupName", "TimerName", nColorRgb):
-// ..Code to be timed..
-// }
-//
-// MICROPROFILE_DECLARE / MICROPROFILE_DEFINE allows defining groups in a shared place, to ensure sorting of the timers
-//
-// (in global scope)
-// MICROPROFILE_DEFINE(g_ProfileFisk, "Fisk", "Skalle", nSomeColorRgb);
-//
-// (in some other file)
-// MICROPROFILE_DECLARE(g_ProfileFisk);
-//
-// void foo(){
-// MICROPROFILE_SCOPE(g_ProfileFisk);
-// }
-//
-// Once code is instrumented the gui is activeted by calling MicroProfileToggleDisplayMode or by clicking in the upper left corner of
-// the screen
-//
-// The following functions must be implemented before the profiler is usable
-// debug render:
-// void MicroProfileDrawText(int nX, int nY, uint32_t nColor, const char* pText, uint32_t nNumCharacters);
-// void MicroProfileDrawBox(int nX, int nY, int nX1, int nY1, uint32_t nColor, MicroProfileBoxType = MicroProfileBoxTypeFlat);
-// void MicroProfileDrawLine2D(uint32_t nVertices, float* pVertices, uint32_t nColor);
-// Gpu time stamps: (See below for d3d/opengl helper)
-// uint32_t MicroProfileGpuInsertTimeStamp();
-// uint64_t MicroProfileGpuGetTimeStamp(uint32_t nKey);
-// uint64_t MicroProfileTicksPerSecondGpu();
-// threading:
-// const char* MicroProfileGetThreadName(); Threadnames in detailed view
-//
-// Default implementations of Gpu timestamp functions:
-// Opengl:
-// in .c file where MICROPROFILE_IMPL is defined:
-// #define MICROPROFILE_GPU_TIMERS_GL
-// call MicroProfileGpuInitGL() on startup
-// D3D11:
-// in .c file where MICROPROFILE_IMPL is defined:
-// #define MICROPROFILE_GPU_TIMERS_D3D11
-// call MICROPROFILE_GPU_TIMERS_D3D11(). Pass Device & ImmediateContext
-//
-// Limitations:
-// GPU timestamps can only be inserted from one thread.
-
-
-
-#ifndef MICROPROFILE_ENABLED
-#define MICROPROFILE_ENABLED 1
-#endif
-
-#include
-#include
-typedef uint64_t MicroProfileToken;
-typedef uint16_t MicroProfileGroupId;
-
-#if 0 == MICROPROFILE_ENABLED
-
-#define MICROPROFILE_DECLARE(var)
-#define MICROPROFILE_DEFINE(var, group, name, color)
-#define MICROPROFILE_REGISTER_GROUP(group, color, category)
-#define MICROPROFILE_DECLARE_GPU(var)
-#define MICROPROFILE_DEFINE_GPU(var, name, color)
-#define MICROPROFILE_SCOPE(var) do{}while(0)
-#define MICROPROFILE_SCOPEI(group, name, color) do{}while(0)
-#define MICROPROFILE_SCOPEGPU(var) do{}while(0)
-#define MICROPROFILE_SCOPEGPUI( name, color) do{}while(0)
-#define MICROPROFILE_META_CPU(name, count)
-#define MICROPROFILE_META_GPU(name, count)
-#define MICROPROFILE_FORCEENABLECPUGROUP(s) do{} while(0)
-#define MICROPROFILE_FORCEDISABLECPUGROUP(s) do{} while(0)
-#define MICROPROFILE_FORCEENABLEGPUGROUP(s) do{} while(0)
-#define MICROPROFILE_FORCEDISABLEGPUGROUP(s) do{} while(0)
-#define MICROPROFILE_SCOPE_TOKEN(token) do{} while(0)
-#define MICROPROFILE_COUNTER_ADD(name, count) do{} while(0)
-#define MICROPROFILE_COUNTER_SET(name, count) do{} while(0)
-#define MICROPROFILE_COUNTER_SET_LIMIT(name, count) do{} while(0)
-
-
-#define MICROPROFILE_COUNTER_CONFIG(name, type)
-
-#define MicroProfileGetTime(group, name) 0.f
-#define MicroProfileOnThreadCreate(foo) do{}while(0)
-#define MicroProfileFlip() do{}while(0)
-#define MicroProfileSetAggregateFrames(a) do{}while(0)
-#define MicroProfileGetAggregateFrames() 0
-#define MicroProfileGetCurrentAggregateFrames() 0
-#define MicroProfileTogglePause() do{}while(0)
-#define MicroProfileToggleAllGroups() do{} while(0)
-#define MicroProfileDumpTimers() do{}while(0)
-#define MicroProfileShutdown() do{}while(0)
-#define MicroProfileSetForceEnable(a) do{} while(0)
-#define MicroProfileGetForceEnable() false
-#define MicroProfileSetEnableAllGroups(a) do{} while(0)
-#define MicroProfileEnableCategory(a) do{} while(0)
-#define MicroProfileDisableCategory(a) do{} while(0)
-#define MicroProfileGetEnableAllGroups() false
-#define MicroProfileSetForceMetaCounters(a)
-#define MicroProfileGetForceMetaCounters() 0
-#define MicroProfileEnableMetaCounter(c) do{}while(0)
-#define MicroProfileDisableMetaCounter(c) do{}while(0)
-#define MicroProfileDumpFile(html,csv) do{} while(0)
-#define MicroProfileWebServerPort() ((uint32_t)-1)
-
-#else
-
-#include
-#include
-#include
-#include
-#include
-
-#ifndef MICROPROFILE_API
-#define MICROPROFILE_API
-#endif
-
-MICROPROFILE_API int64_t MicroProfileTicksPerSecondCpu();
-
-
-#if defined(__APPLE__)
-#include
-#include
-#include
-#include
-#include
-#if TARGET_OS_IPHONE
-#define MICROPROFILE_IOS
-#endif
-
-#define MP_TICK() mach_absolute_time()
-inline int64_t MicroProfileTicksPerSecondCpu()
-{
- static int64_t nTicksPerSecond = 0;
- if(nTicksPerSecond == 0)
- {
- mach_timebase_info_data_t sTimebaseInfo;
- mach_timebase_info(&sTimebaseInfo);
- nTicksPerSecond = 1000000000ll * sTimebaseInfo.denom / sTimebaseInfo.numer;
- }
- return nTicksPerSecond;
-}
-inline uint64_t MicroProfileGetCurrentThreadId()
-{
- uint64_t tid;
- pthread_threadid_np(pthread_self(), &tid);
- return tid;
-}
-
-#define MP_BREAK() __builtin_trap()
-#define MP_THREAD_LOCAL __thread
-#define MP_STRCASECMP strcasecmp
-#define MP_GETCURRENTTHREADID() MicroProfileGetCurrentThreadId()
-typedef uint64_t ThreadIdType;
-#elif defined(_WIN32)
-int64_t MicroProfileGetTick();
-#define MP_TICK() MicroProfileGetTick()
-#define MP_BREAK() __debugbreak()
-#define MP_THREAD_LOCAL __declspec(thread)
-#define MP_STRCASECMP _stricmp
-#define MP_GETCURRENTTHREADID() GetCurrentThreadId()
-typedef uint32_t ThreadIdType;
-
-#elif defined(__linux__)
-#include
-#include
-inline int64_t MicroProfileTicksPerSecondCpu()
-{
- return 1000000000ll;
-}
-
-inline int64_t MicroProfileGetTick()
-{
- timespec ts;
- clock_gettime(CLOCK_REALTIME, &ts);
- return 1000000000ll * ts.tv_sec + ts.tv_nsec;
-}
-#define MP_TICK() MicroProfileGetTick()
-#define MP_BREAK() __builtin_trap()
-#define MP_THREAD_LOCAL __thread
-#define MP_STRCASECMP strcasecmp
-#define MP_GETCURRENTTHREADID() (uint64_t)pthread_self()
-typedef uint64_t ThreadIdType;
-#endif
-
-
-#ifndef MP_GETCURRENTTHREADID
-#define MP_GETCURRENTTHREADID() 0
-typedef uint32_t ThreadIdType;
-#endif
-
-
-#define MP_ASSERT(a) do{if(!(a)){MP_BREAK();} }while(0)
-#define MICROPROFILE_DECLARE(var) extern MicroProfileToken g_mp_##var
-#define MICROPROFILE_DEFINE(var, group, name, color) MicroProfileToken g_mp_##var = MicroProfileGetToken(group, name, color, MicroProfileTokenTypeCpu)
-#define MICROPROFILE_REGISTER_GROUP(group, category, color) MicroProfileRegisterGroup(group, category, color)
-#define MICROPROFILE_DECLARE_GPU(var) extern MicroProfileToken g_mp_##var
-#define MICROPROFILE_DEFINE_GPU(var, name, color) MicroProfileToken g_mp_##var = MicroProfileGetToken("GPU", name, color, MicroProfileTokenTypeGpu)
-#define MICROPROFILE_TOKEN_PASTE0(a, b) a ## b
-#define MICROPROFILE_TOKEN_PASTE(a, b) MICROPROFILE_TOKEN_PASTE0(a,b)
-#define MICROPROFILE_SCOPE(var) MicroProfileScopeHandler MICROPROFILE_TOKEN_PASTE(foo, __LINE__)(g_mp_##var)
-#define MICROPROFILE_SCOPE_TOKEN(token) MicroProfileScopeHandler MICROPROFILE_TOKEN_PASTE(foo, __LINE__)(token)
-#define MICROPROFILE_SCOPEI(group, name, color) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__) = MicroProfileGetToken(group, name, color, MicroProfileTokenTypeCpu); MicroProfileScopeHandler MICROPROFILE_TOKEN_PASTE(foo,__LINE__)( MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__))
-#define MICROPROFILE_SCOPEGPU(var) MicroProfileScopeGpuHandler MICROPROFILE_TOKEN_PASTE(foo, __LINE__)(g_mp_##var)
-#define MICROPROFILE_SCOPEGPUI(name, color) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__) = MicroProfileGetToken("GPU", name, color, MicroProfileTokenTypeGpu); MicroProfileScopeGpuHandler MICROPROFILE_TOKEN_PASTE(foo,__LINE__)( MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__))
-#define MICROPROFILE_META_CPU(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_meta,__LINE__) = MicroProfileGetMetaToken(name); MicroProfileMetaUpdate(MICROPROFILE_TOKEN_PASTE(g_mp_meta,__LINE__), count, MicroProfileTokenTypeCpu)
-#define MICROPROFILE_META_GPU(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_meta,__LINE__) = MicroProfileGetMetaToken(name); MicroProfileMetaUpdate(MICROPROFILE_TOKEN_PASTE(g_mp_meta,__LINE__), count, MicroProfileTokenTypeGpu)
-#define MICROPROFILE_COUNTER_ADD(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__) = MicroProfileGetCounterToken(name); MicroProfileCounterAdd(MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__), count)
-#define MICROPROFILE_COUNTER_SET(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__) = MicroProfileGetCounterToken(name); MicroProfileCounterSet(MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__), count)
-#define MICROPROFILE_COUNTER_SET_LIMIT(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__) = MicroProfileGetCounterToken(name); MicroProfileCounterSetLimit(MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__), count)
-#define MICROPROFILE_COUNTER_CONFIG(name, type, limit) MicroProfileCounterConfig(name, type, limit)
-
-
-#ifndef MICROPROFILE_USE_THREAD_NAME_CALLBACK
-#define MICROPROFILE_USE_THREAD_NAME_CALLBACK 0
-#endif
-
-#ifndef MICROPROFILE_PER_THREAD_BUFFER_SIZE
-#define MICROPROFILE_PER_THREAD_BUFFER_SIZE (2048<<10)
-#endif
-
-#ifndef MICROPROFILE_MAX_FRAME_HISTORY
-#define MICROPROFILE_MAX_FRAME_HISTORY 512
-#endif
-
-#ifndef MICROPROFILE_PRINTF
-#define MICROPROFILE_PRINTF printf
-#endif
-
-#ifndef MICROPROFILE_META_MAX
-#define MICROPROFILE_META_MAX 8
-#endif
-
-#ifndef MICROPROFILE_WEBSERVER_PORT
-#define MICROPROFILE_WEBSERVER_PORT 1338
-#endif
-
-#ifndef MICROPROFILE_WEBSERVER
-#define MICROPROFILE_WEBSERVER 1
-#endif
-
-#ifndef MICROPROFILE_WEBSERVER_MAXFRAMES
-#define MICROPROFILE_WEBSERVER_MAXFRAMES 30
-#endif
-
-#ifndef MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE
-#define MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE (16<<10)
-#endif
-
-#ifndef MICROPROFILE_GPU_TIMERS
-#define MICROPROFILE_GPU_TIMERS 1
-#endif
-
-#ifndef MICROPROFILE_GPU_FRAME_DELAY
-#define MICROPROFILE_GPU_FRAME_DELAY 3 //must be > 0
-#endif
-
-
-#ifndef MICROPROFILE_NAME_MAX_LEN
-#define MICROPROFILE_NAME_MAX_LEN 64
-#endif
-
-#define MICROPROFILE_FORCEENABLECPUGROUP(s) MicroProfileForceEnableGroup(s, MicroProfileTokenTypeCpu)
-#define MICROPROFILE_FORCEDISABLECPUGROUP(s) MicroProfileForceDisableGroup(s, MicroProfileTokenTypeCpu)
-#define MICROPROFILE_FORCEENABLEGPUGROUP(s) MicroProfileForceEnableGroup(s, MicroProfileTokenTypeGpu)
-#define MICROPROFILE_FORCEDISABLEGPUGROUP(s) MicroProfileForceDisableGroup(s, MicroProfileTokenTypeGpu)
-
-#define MICROPROFILE_INVALID_TICK ((uint64_t)-1)
-#define MICROPROFILE_GROUP_MASK_ALL 0xffffffffffff
-
-
-#define MICROPROFILE_INVALID_TOKEN (uint64_t)-1
-
-enum MicroProfileTokenType
-{
- MicroProfileTokenTypeCpu,
- MicroProfileTokenTypeGpu,
-};
-
-enum MicroProfileBoxType
-{
- MicroProfileBoxTypeBar,
- MicroProfileBoxTypeFlat,
-};
-
-
-
-struct MicroProfile;
-
-MICROPROFILE_API void MicroProfileInit();
-MICROPROFILE_API void MicroProfileShutdown();
-MICROPROFILE_API MicroProfileToken MicroProfileFindToken(const char* sGroup, const char* sName);
-MICROPROFILE_API MicroProfileToken MicroProfileGetToken(const char* sGroup, const char* sName, uint32_t nColor, MicroProfileTokenType Token = MicroProfileTokenTypeCpu);
-MICROPROFILE_API MicroProfileToken MicroProfileGetMetaToken(const char* pName);
-MICROPROFILE_API MicroProfileToken MicroProfileGetCounterToken(const char* pName);
-MICROPROFILE_API void MicroProfileMetaUpdate(MicroProfileToken, int nCount, MicroProfileTokenType eTokenType);
-MICROPROFILE_API int64_t MicroProfileCounterLoad(MicroProfileToken nToken);
-MICROPROFILE_API void MicroProfileCounterAdd(MicroProfileToken nToken, int64_t nCount);
-MICROPROFILE_API void MicroProfileCounterSet(MicroProfileToken nToken, int64_t nCount);
-MICROPROFILE_API void MicroProfileCounterSetLimit(MicroProfileToken nToken, int64_t nCount);
-MICROPROFILE_API void MicroProfileCounterConfig(const char* pCounterName, uint32_t nFormat, int64_t nLimit);
-MICROPROFILE_API uint64_t MicroProfileEnter(MicroProfileToken nToken);
-MICROPROFILE_API void MicroProfileLeave(MicroProfileToken nToken, uint64_t nTick);
-MICROPROFILE_API uint64_t MicroProfileGpuEnter(MicroProfileToken nToken);
-MICROPROFILE_API void MicroProfileGpuLeave(MicroProfileToken nToken, uint64_t nTick);
-inline uint16_t MicroProfileGetTimerIndex(MicroProfileToken t){ return (t&0xffff); }
-inline uint64_t MicroProfileGetGroupMask(MicroProfileToken t){ return ((t>>16)&MICROPROFILE_GROUP_MASK_ALL);}
-inline MicroProfileToken MicroProfileMakeToken(uint64_t nGroupMask, uint16_t nTimer){ return (nGroupMask<<16) | nTimer;}
-
-MICROPROFILE_API void MicroProfileFlip(); //! call once per frame.
-MICROPROFILE_API void MicroProfileTogglePause();
-MICROPROFILE_API void MicroProfileForceEnableGroup(const char* pGroup, MicroProfileTokenType Type);
-MICROPROFILE_API void MicroProfileForceDisableGroup(const char* pGroup, MicroProfileTokenType Type);
-MICROPROFILE_API float MicroProfileGetTime(const char* pGroup, const char* pName);
-MICROPROFILE_API void MicroProfileContextSwitchSearch(uint32_t* pContextSwitchStart, uint32_t* pContextSwitchEnd, uint64_t nBaseTicksCpu, uint64_t nBaseTicksEndCpu);
-MICROPROFILE_API void MicroProfileOnThreadCreate(const char* pThreadName); //should be called from newly created threads
-MICROPROFILE_API void MicroProfileOnThreadExit(); //call on exit to reuse log
-MICROPROFILE_API void MicroProfileInitThreadLog();
-MICROPROFILE_API void MicroProfileSetForceEnable(bool bForceEnable);
-MICROPROFILE_API bool MicroProfileGetForceEnable();
-MICROPROFILE_API void MicroProfileSetEnableAllGroups(bool bEnable);
-MICROPROFILE_API void MicroProfileEnableCategory(const char* pCategory);
-MICROPROFILE_API void MicroProfileDisableCategory(const char* pCategory);
-MICROPROFILE_API bool MicroProfileGetEnableAllGroups();
-MICROPROFILE_API void MicroProfileSetForceMetaCounters(bool bEnable);
-MICROPROFILE_API bool MicroProfileGetForceMetaCounters();
-MICROPROFILE_API void MicroProfileEnableMetaCounter(const char* pMet);
-MICROPROFILE_API void MicroProfileDisableMetaCounter(const char* pMet);
-MICROPROFILE_API void MicroProfileSetAggregateFrames(int frames);
-MICROPROFILE_API int MicroProfileGetAggregateFrames();
-MICROPROFILE_API int MicroProfileGetCurrentAggregateFrames();
-MICROPROFILE_API MicroProfile* MicroProfileGet();
-MICROPROFILE_API void MicroProfileGetRange(uint32_t nPut, uint32_t nGet, uint32_t nRange[2][2]);
-MICROPROFILE_API std::recursive_mutex& MicroProfileGetMutex();
-MICROPROFILE_API void MicroProfileStartContextSwitchTrace();
-MICROPROFILE_API void MicroProfileStopContextSwitchTrace();
-MICROPROFILE_API bool MicroProfileIsLocalThread(uint32_t nThreadId);
-MICROPROFILE_API int MicroProfileFormatCounter(int eFormat, int64_t nCounter, char* pOut, uint32_t nBufferSize);
-
-#if MICROPROFILE_WEBSERVER
-MICROPROFILE_API void MicroProfileDumpFile(const char* pHtml, const char* pCsv);
-MICROPROFILE_API uint32_t MicroProfileWebServerPort();
-#else
-#define MicroProfileDumpFile(c) do{} while(0)
-#define MicroProfileWebServerPort() ((uint32_t)-1)
-#endif
-
-
-
-
-#if MICROPROFILE_GPU_TIMERS
-MICROPROFILE_API uint32_t MicroProfileGpuInsertTimeStamp();
-MICROPROFILE_API uint64_t MicroProfileGpuGetTimeStamp(uint32_t nKey);
-MICROPROFILE_API uint64_t MicroProfileTicksPerSecondGpu();
-MICROPROFILE_API int MicroProfileGetGpuTickReference(int64_t* pOutCPU, int64_t* pOutGpu);
-#else
-#define MicroProfileGpuInsertTimeStamp() 1
-#define MicroProfileGpuGetTimeStamp(a) 0
-#define MicroProfileTicksPerSecondGpu() 1
-#define MicroProfileGetGpuTickReference(a,b) 0
-#endif
-
-#if MICROPROFILE_GPU_TIMERS_D3D11
-#define MICROPROFILE_D3D_MAX_QUERIES (8<<10)
-MICROPROFILE_API void MicroProfileGpuInitD3D11(void* pDevice, void* pDeviceContext);
-#endif
-
-#if MICROPROFILE_GPU_TIMERS_GL
-#define MICROPROFILE_GL_MAX_QUERIES (8<<10)
-MICROPROFILE_API void MicroProfileGpuInitGL();
-#endif
-
-
-
-#if MICROPROFILE_USE_THREAD_NAME_CALLBACK
-MICROPROFILE_API const char* MicroProfileGetThreadName();
-#else
-#define MicroProfileGetThreadName() ""
-#endif
-
-#if !defined(MICROPROFILE_THREAD_NAME_FROM_ID)
-#define MICROPROFILE_THREAD_NAME_FROM_ID(a) ""
-#endif
-
-
-struct MicroProfileScopeHandler
-{
- MicroProfileToken nToken;
- uint64_t nTick;
- MicroProfileScopeHandler(MicroProfileToken Token):nToken(Token)
- {
- nTick = MicroProfileEnter(nToken);
- }
- ~MicroProfileScopeHandler()
- {
- MicroProfileLeave(nToken, nTick);
- }
-};
-
-struct MicroProfileScopeGpuHandler
-{
- MicroProfileToken nToken;
- uint64_t nTick;
- MicroProfileScopeGpuHandler(MicroProfileToken Token):nToken(Token)
- {
- nTick = MicroProfileGpuEnter(nToken);
- }
- ~MicroProfileScopeGpuHandler()
- {
- MicroProfileGpuLeave(nToken, nTick);
- }
-};
-
-
-#define MICROPROFILE_MAX_COUNTERS 512
-#define MICROPROFILE_MAX_COUNTER_NAME_CHARS (MICROPROFILE_MAX_COUNTERS*16)
-#define MICROPROFILE_MAX_TIMERS 1024
-#define MICROPROFILE_MAX_GROUPS 48 //dont bump! no. of bits used it bitmask
-#define MICROPROFILE_MAX_CATEGORIES 16
-#define MICROPROFILE_MAX_GRAPHS 5
-#define MICROPROFILE_GRAPH_HISTORY 128
-#define MICROPROFILE_BUFFER_SIZE ((MICROPROFILE_PER_THREAD_BUFFER_SIZE)/sizeof(MicroProfileLogEntry))
-#define MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS 256
-#define MICROPROFILE_STACK_MAX 32
-//#define MICROPROFILE_MAX_PRESETS 5
-#define MICROPROFILE_ANIM_DELAY_PRC 0.5f
-#define MICROPROFILE_GAP_TIME 50 //extra ms to fetch to close timers from earlier frames
-
-
-#ifndef MICROPROFILE_MAX_THREADS
-#define MICROPROFILE_MAX_THREADS 32
-#endif
-
-#ifndef MICROPROFILE_UNPACK_RED
-#define MICROPROFILE_UNPACK_RED(c) ((c)>>16)
-#endif
-
-#ifndef MICROPROFILE_UNPACK_GREEN
-#define MICROPROFILE_UNPACK_GREEN(c) ((c)>>8)
-#endif
-
-#ifndef MICROPROFILE_UNPACK_BLUE
-#define MICROPROFILE_UNPACK_BLUE(c) ((c))
-#endif
-
-#ifndef MICROPROFILE_DEFAULT_PRESET
-#define MICROPROFILE_DEFAULT_PRESET "Default"
-#endif
-
-
-#ifndef MICROPROFILE_CONTEXT_SWITCH_TRACE
-#if defined(_WIN32)
-#define MICROPROFILE_CONTEXT_SWITCH_TRACE 1
-#elif defined(__APPLE__)
-#define MICROPROFILE_CONTEXT_SWITCH_TRACE 0 //disabled until dtrace script is working.
-#else
-#define MICROPROFILE_CONTEXT_SWITCH_TRACE 0
-#endif
-#endif
-
-#if MICROPROFILE_CONTEXT_SWITCH_TRACE
-#define MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE (128*1024) //2mb with 16 byte entry size
-#else
-#define MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE (1)
-#endif
-
-#ifndef MICROPROFILE_MINIZ
-#define MICROPROFILE_MINIZ 0
-#endif
-
-#ifdef _WIN32
-#include
-typedef UINT_PTR MpSocket;
-#else
-typedef int MpSocket;
-#endif
-
-
-#if defined(__APPLE__) || defined(__linux__)
-typedef pthread_t MicroProfileThread;
-#elif defined(_WIN32)
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-typedef void * HANDLE;
-#endif
-
-typedef HANDLE MicroProfileThread;
-#else
-typedef std::thread* MicroProfileThread;
-#endif
-
-
-
-enum MicroProfileDrawMask
-{
- MP_DRAW_OFF = 0x0,
- MP_DRAW_BARS = 0x1,
- MP_DRAW_DETAILED = 0x2,
- MP_DRAW_COUNTERS = 0x3,
- MP_DRAW_HIDDEN = 0x4,
- MP_DRAW_SIZE = 0x5,
-};
-
-enum MicroProfileDrawBarsMask
-{
- MP_DRAW_TIMERS = 0x1,
- MP_DRAW_AVERAGE = 0x2,
- MP_DRAW_MAX = 0x4,
- MP_DRAW_MIN = 0x8,
- MP_DRAW_CALL_COUNT = 0x10,
- MP_DRAW_TIMERS_EXCLUSIVE = 0x20,
- MP_DRAW_AVERAGE_EXCLUSIVE = 0x40,
- MP_DRAW_MAX_EXCLUSIVE = 0x80,
- MP_DRAW_META_FIRST = 0x100,
- MP_DRAW_ALL = 0xffffffff,
-
-};
-
-enum MicroProfileCounterFormat
-{
- MICROPROFILE_COUNTER_FORMAT_DEFAULT,
- MICROPROFILE_COUNTER_FORMAT_BYTES,
-};
-
-enum MicroProfileCounterFlags
-{
- MICROPROFILE_COUNTER_FLAG_NONE = 0,
- MICROPROFILE_COUNTER_FLAG_HAS_LIMIT = 0x1,
-};
-
-typedef uint64_t MicroProfileLogEntry;
-
-struct MicroProfileTimer
-{
- uint64_t nTicks;
- uint32_t nCount;
-};
-
-struct MicroProfileCategory
-{
- char pName[MICROPROFILE_NAME_MAX_LEN];
- uint64_t nGroupMask;
-};
-
-struct MicroProfileGroupInfo
-{
- char pName[MICROPROFILE_NAME_MAX_LEN];
- uint32_t nNameLen;
- uint32_t nGroupIndex;
- uint32_t nNumTimers;
- uint32_t nMaxTimerNameLen;
- uint32_t nColor;
- uint32_t nCategory;
- MicroProfileTokenType Type;
-};
-
-struct MicroProfileTimerInfo
-{
- MicroProfileToken nToken;
- uint32_t nTimerIndex;
- uint32_t nGroupIndex;
- char pName[MICROPROFILE_NAME_MAX_LEN];
- uint32_t nNameLen;
- uint32_t nColor;
- bool bGraph;
-};
-
-struct MicroProfileCounterInfo
-{
- int nParent;
- int nSibling;
- int nFirstChild;
- uint16_t nNameLen;
- uint8_t nLevel;
- uint8_t nClosed;
- char* pName;
-
- uint32_t nFlags;
- int64_t nLimit;
- MicroProfileCounterFormat eFormat;
-
-};
-
-struct MicroProfileGraphState
-{
- int64_t nHistory[MICROPROFILE_GRAPH_HISTORY];
- MicroProfileToken nToken;
- int32_t nKey;
-};
-
-struct MicroProfileContextSwitch
-{
- ThreadIdType nThreadOut;
- ThreadIdType nThreadIn;
- int64_t nCpu : 8;
- int64_t nTicks : 56;
-};
-
-
-struct MicroProfileFrameState
-{
- int64_t nFrameStartCpu;
- int64_t nFrameStartGpu;
- uint32_t nLogStart[MICROPROFILE_MAX_THREADS];
-};
-
-struct MicroProfileThreadLog
-{
- MicroProfileLogEntry Log[MICROPROFILE_BUFFER_SIZE];
-
- std::atomic nPut;
- std::atomic nGet;
- uint32_t nActive;
- uint32_t nGpu;
- ThreadIdType nThreadId;
-
- uint32_t nStack[MICROPROFILE_STACK_MAX];
- int64_t nChildTickStack[MICROPROFILE_STACK_MAX];
- uint32_t nStackPos;
-
-
- uint8_t nGroupStackPos[MICROPROFILE_MAX_GROUPS];
- int64_t nGroupTicks[MICROPROFILE_MAX_GROUPS];
- int64_t nAggregateGroupTicks[MICROPROFILE_MAX_GROUPS];
- enum
- {
- THREAD_MAX_LEN = 64,
- };
- char ThreadName[64];
- int nFreeListNext;
-};
-
-#if MICROPROFILE_GPU_TIMERS_D3D11
-struct MicroProfileD3D11Frame
-{
- uint32_t m_nQueryStart;
- uint32_t m_nQueryCount;
- uint32_t m_nRateQueryStarted;
- void* m_pRateQuery;
-};
-
-struct MicroProfileGpuTimerState
-{
- uint32_t bInitialized;
- void* m_pDevice;
- void* m_pDeviceContext;
- void* m_pQueries[MICROPROFILE_D3D_MAX_QUERIES];
- int64_t m_nQueryResults[MICROPROFILE_D3D_MAX_QUERIES];
- uint32_t m_nQueryPut;
- uint32_t m_nQueryGet;
- uint32_t m_nQueryFrame;
- int64_t m_nQueryFrequency;
- MicroProfileD3D11Frame m_QueryFrames[MICROPROFILE_GPU_FRAME_DELAY];
-};
-#elif MICROPROFILE_GPU_TIMERS_GL
-struct MicroProfileGpuTimerState
-{
- uint32_t GLTimers[MICROPROFILE_GL_MAX_QUERIES];
- uint32_t GLTimerPos;
-};
-#else
-struct MicroProfileGpuTimerState{};
-#endif
-
-struct MicroProfile
-{
- uint32_t nTotalTimers;
- uint32_t nGroupCount;
- uint32_t nCategoryCount;
- uint32_t nAggregateClear;
- uint32_t nAggregateFlip;
- uint32_t nAggregateFlipCount;
- uint32_t nAggregateFrames;
-
- uint64_t nAggregateFlipTick;
-
- uint32_t nDisplay;
- uint32_t nBars;
- uint64_t nActiveGroup;
- uint32_t nActiveBars;
-
- uint64_t nForceGroup;
- uint32_t nForceEnable;
- uint32_t nForceMetaCounters;
-
- uint64_t nForceGroupUI;
- uint64_t nActiveGroupWanted;
- uint32_t nAllGroupsWanted;
- uint32_t nAllThreadsWanted;
-
- uint32_t nOverflow;
-
- uint64_t nGroupMask;
- uint32_t nRunning;
- uint32_t nToggleRunning;
- uint32_t nMaxGroupSize;
- uint32_t nDumpFileNextFrame;
- uint32_t nAutoClearFrames;
- char HtmlDumpPath[512];
- char CsvDumpPath[512];
-
- int64_t nPauseTicks;
-
- float fReferenceTime;
- float fRcpReferenceTime;
-
- MicroProfileCategory CategoryInfo[MICROPROFILE_MAX_CATEGORIES];
- MicroProfileGroupInfo GroupInfo[MICROPROFILE_MAX_GROUPS];
- MicroProfileTimerInfo TimerInfo[MICROPROFILE_MAX_TIMERS];
- uint8_t TimerToGroup[MICROPROFILE_MAX_TIMERS];
-
- MicroProfileTimer AccumTimers[MICROPROFILE_MAX_TIMERS];
- uint64_t AccumMaxTimers[MICROPROFILE_MAX_TIMERS];
- uint64_t AccumMinTimers[MICROPROFILE_MAX_TIMERS];
- uint64_t AccumTimersExclusive[MICROPROFILE_MAX_TIMERS];
- uint64_t AccumMaxTimersExclusive[MICROPROFILE_MAX_TIMERS];
-
- MicroProfileTimer Frame[MICROPROFILE_MAX_TIMERS];
- uint64_t FrameExclusive[MICROPROFILE_MAX_TIMERS];
-
- MicroProfileTimer Aggregate[MICROPROFILE_MAX_TIMERS];
- uint64_t AggregateMax[MICROPROFILE_MAX_TIMERS];
- uint64_t AggregateMin[MICROPROFILE_MAX_TIMERS];
- uint64_t AggregateExclusive[MICROPROFILE_MAX_TIMERS];
- uint64_t AggregateMaxExclusive[MICROPROFILE_MAX_TIMERS];
-
-
- uint64_t FrameGroup[MICROPROFILE_MAX_GROUPS];
- uint64_t AccumGroup[MICROPROFILE_MAX_GROUPS];
- uint64_t AccumGroupMax[MICROPROFILE_MAX_GROUPS];
-
- uint64_t AggregateGroup[MICROPROFILE_MAX_GROUPS];
- uint64_t AggregateGroupMax[MICROPROFILE_MAX_GROUPS];
-
-
- struct
- {
- uint64_t nCounters[MICROPROFILE_MAX_TIMERS];
-
- uint64_t nAccum[MICROPROFILE_MAX_TIMERS];
- uint64_t nAccumMax[MICROPROFILE_MAX_TIMERS];
-
- uint64_t nAggregate[MICROPROFILE_MAX_TIMERS];
- uint64_t nAggregateMax[MICROPROFILE_MAX_TIMERS];
-
- uint64_t nSum;
- uint64_t nSumAccum;
- uint64_t nSumAccumMax;
- uint64_t nSumAggregate;
- uint64_t nSumAggregateMax;
-
- const char* pName;
- } MetaCounters[MICROPROFILE_META_MAX];
-
- MicroProfileGraphState Graph[MICROPROFILE_MAX_GRAPHS];
- uint32_t nGraphPut;
-
- uint32_t nThreadActive[MICROPROFILE_MAX_THREADS];
- MicroProfileThreadLog* Pool[MICROPROFILE_MAX_THREADS];
- uint32_t nNumLogs;
- uint32_t nMemUsage;
- int nFreeListHead;
-
- uint32_t nFrameCurrent;
- uint32_t nFrameCurrentIndex;
- uint32_t nFramePut;
- uint64_t nFramePutIndex;
-
- MicroProfileFrameState Frames[MICROPROFILE_MAX_FRAME_HISTORY];
-
- uint64_t nFlipTicks;
- uint64_t nFlipAggregate;
- uint64_t nFlipMax;
- uint64_t nFlipAggregateDisplay;
- uint64_t nFlipMaxDisplay;
-
- MicroProfileThread ContextSwitchThread;
- bool bContextSwitchRunning;
- bool bContextSwitchStop;
- bool bContextSwitchAllThreads;
- bool bContextSwitchNoBars;
- uint32_t nContextSwitchUsage;
- uint32_t nContextSwitchLastPut;
-
- int64_t nContextSwitchHoverTickIn;
- int64_t nContextSwitchHoverTickOut;
- uint32_t nContextSwitchHoverThread;
- uint32_t nContextSwitchHoverThreadBefore;
- uint32_t nContextSwitchHoverThreadAfter;
- uint8_t nContextSwitchHoverCpu;
- uint8_t nContextSwitchHoverCpuNext;
-
- uint32_t nContextSwitchPut;
- MicroProfileContextSwitch ContextSwitch[MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE];
-
-
- MpSocket ListenerSocket;
- uint32_t nWebServerPort;
-
- char WebServerBuffer[MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE];
- uint32_t WebServerPut;
-
- uint64_t nWebServerDataSent;
-
-
-
- char CounterNames[MICROPROFILE_MAX_COUNTER_NAME_CHARS];
- MicroProfileCounterInfo CounterInfo[MICROPROFILE_MAX_COUNTERS];
- uint32_t nNumCounters;
- uint32_t nCounterNamePos;
- std::atomic Counters[MICROPROFILE_MAX_COUNTERS];
-
- MicroProfileGpuTimerState GPU;
-
-};
-
-#define MP_LOG_TICK_MASK 0x0000ffffffffffff
-#define MP_LOG_INDEX_MASK 0x3fff000000000000
-#define MP_LOG_BEGIN_MASK 0xc000000000000000
-#define MP_LOG_GPU_EXTRA 0x3
-#define MP_LOG_META 0x2
-#define MP_LOG_ENTER 0x1
-#define MP_LOG_LEAVE 0x0
-
-
-inline uint64_t MicroProfileLogType(MicroProfileLogEntry Index)
-{
- return ((MP_LOG_BEGIN_MASK & Index)>>62) & 0x3;
-}
-
-inline uint64_t MicroProfileLogTimerIndex(MicroProfileLogEntry Index)
-{
- return (0x3fff&(Index>>48));
-}
-
-inline MicroProfileLogEntry MicroProfileMakeLogIndex(uint64_t nBegin, MicroProfileToken nToken, int64_t nTick)
-{
- MicroProfileLogEntry Entry = (nBegin<<62) | ((0x3fff&nToken)<<48) | (MP_LOG_TICK_MASK&nTick);
- uint64_t t = MicroProfileLogType(Entry);
- uint64_t nTimerIndex = MicroProfileLogTimerIndex(Entry);
- MP_ASSERT(t == nBegin);
- MP_ASSERT(nTimerIndex == (nToken&0x3fff));
- return Entry;
-
-}
-
-inline int64_t MicroProfileLogTickDifference(MicroProfileLogEntry Start, MicroProfileLogEntry End)
-{
- uint64_t nStart = Start;
- uint64_t nEnd = End;
- int64_t nDifference = ((nEnd<<16) - (nStart<<16));
- return nDifference >> 16;
-}
-
-inline int64_t MicroProfileLogGetTick(MicroProfileLogEntry e)
-{
- return MP_LOG_TICK_MASK & e;
-}
-
-inline int64_t MicroProfileLogSetTick(MicroProfileLogEntry e, int64_t nTick)
-{
- return (MP_LOG_TICK_MASK & nTick) | (e & ~MP_LOG_TICK_MASK);
-}
-
-template
-T MicroProfileMin(T a, T b)
-{ return a < b ? a : b; }
-
-template
-T MicroProfileMax(T a, T b)
-{ return a > b ? a : b; }
-
-inline int64_t MicroProfileMsToTick(float fMs, int64_t nTicksPerSecond)
-{
- return (int64_t)(fMs*0.001f*nTicksPerSecond);
-}
-
-inline float MicroProfileTickToMsMultiplier(int64_t nTicksPerSecond)
-{
- return 1000.f / nTicksPerSecond;
-}
-
-inline uint16_t MicroProfileGetGroupIndex(MicroProfileToken t)
-{
- return (uint16_t)MicroProfileGet()->TimerToGroup[MicroProfileGetTimerIndex(t)];
-}
-
-
-
-#ifdef MICROPROFILE_IMPL
-
-#ifdef _WIN32
-#include
-#define snprintf _snprintf
-
-#pragma warning(push)
-#pragma warning(disable: 4244)
-int64_t MicroProfileTicksPerSecondCpu()
-{
- static int64_t nTicksPerSecond = 0;
- if(nTicksPerSecond == 0)
- {
- QueryPerformanceFrequency((LARGE_INTEGER*)&nTicksPerSecond);
- }
- return nTicksPerSecond;
-}
-int64_t MicroProfileGetTick()
-{
- int64_t ticks;
- QueryPerformanceCounter((LARGE_INTEGER*)&ticks);
- return ticks;
-}
-
-#endif
-
-#if defined(MICROPROFILE_WEBSERVER) || defined(MICROPROFILE_CONTEXT_SWITCH_TRACE)
-
-
-typedef void* (*MicroProfileThreadFunc)(void*);
-
-#if defined(__APPLE__) || defined(__linux__)
-typedef pthread_t MicroProfileThread;
-void MicroProfileThreadStart(MicroProfileThread* pThread, MicroProfileThreadFunc Func)
-{
- pthread_attr_t Attr;
- int r = pthread_attr_init(&Attr);
- MP_ASSERT(r == 0);
- pthread_create(pThread, &Attr, Func, 0);
-}
-void MicroProfileThreadJoin(MicroProfileThread* pThread)
-{
- int r = pthread_join(*pThread, 0);
- MP_ASSERT(r == 0);
-}
-#elif defined(_WIN32)
-typedef HANDLE MicroProfileThread;
-DWORD _stdcall ThreadTrampoline(void* pFunc)
-{
- MicroProfileThreadFunc F = (MicroProfileThreadFunc)pFunc;
- return (uint32_t)(uintptr_t)F(0);
-}
-
-void MicroProfileThreadStart(MicroProfileThread* pThread, MicroProfileThreadFunc Func)
-{
- *pThread = CreateThread(0, 0, ThreadTrampoline, (LPVOID)Func, 0, 0);
-}
-void MicroProfileThreadJoin(MicroProfileThread* pThread)
-{
- WaitForSingleObject(*pThread, INFINITE);
- CloseHandle(*pThread);
-}
-#else
-#include
-typedef std::thread* MicroProfileThread;
-inline void MicroProfileThreadStart(MicroProfileThread* pThread, MicroProfileThreadFunc Func)
-{
- *pThread = new std::thread(Func, nullptr);
-}
-inline void MicroProfileThreadJoin(MicroProfileThread* pThread)
-{
- (*pThread)->join();
- delete *pThread;
-}
-#endif
-#endif
-
-#if MICROPROFILE_WEBSERVER
-
-#ifdef _WIN32
-#define MP_INVALID_SOCKET(f) (f == INVALID_SOCKET)
-#endif
-
-#if defined(__APPLE__)
-#include
-#include
-#include
-#define MP_INVALID_SOCKET(f) (f < 0)
-#endif
-
-
-void MicroProfileWebServerStart();
-void MicroProfileWebServerStop();
-bool MicroProfileWebServerUpdate();
-void MicroProfileDumpToFile();
-
-#else
-
-#define MicroProfileWebServerStart() do{}while(0)
-#define MicroProfileWebServerStop() do{}while(0)
-#define MicroProfileWebServerUpdate() false
-#define MicroProfileDumpToFile() do{} while(0)
-#endif
-
-
-#if MICROPROFILE_GPU_TIMERS_D3D11
-void MicroProfileGpuFlip();
-void MicroProfileGpuShutdown();
-#else
-#define MicroProfileGpuFlip() do{}while(0)
-#define MicroProfileGpuShutdown() do{}while(0)
-#endif
-
-
-
-#include
-#include
-#include
-#include
-
-
-#ifndef MICROPROFILE_DEBUG
-#define MICROPROFILE_DEBUG 0
-#endif
-
-
-#define S g_MicroProfile
-
-MicroProfile g_MicroProfile;
-MicroProfileThreadLog* g_MicroProfileGpuLog = 0;
-#ifdef MICROPROFILE_IOS
-// iOS doesn't support __thread
-static pthread_key_t g_MicroProfileThreadLogKey;
-static pthread_once_t g_MicroProfileThreadLogKeyOnce = PTHREAD_ONCE_INIT;
-static void MicroProfileCreateThreadLogKey()
-{
- pthread_key_create(&g_MicroProfileThreadLogKey, NULL);
-}
-#else
-MP_THREAD_LOCAL MicroProfileThreadLog* g_MicroProfileThreadLog = 0;
-#endif
-static bool g_bUseLock = false; /// This is used because windows does not support using mutexes under dll init(which is where global initialization is handled)
-
-
-MICROPROFILE_DEFINE(g_MicroProfileFlip, "MicroProfile", "MicroProfileFlip", 0x3355ee);
-MICROPROFILE_DEFINE(g_MicroProfileThreadLoop, "MicroProfile", "ThreadLoop", 0x3355ee);
-MICROPROFILE_DEFINE(g_MicroProfileClear, "MicroProfile", "Clear", 0x3355ee);
-MICROPROFILE_DEFINE(g_MicroProfileAccumulate, "MicroProfile", "Accumulate", 0x3355ee);
-MICROPROFILE_DEFINE(g_MicroProfileContextSwitchSearch,"MicroProfile", "ContextSwitchSearch", 0xDD7300);
-
-inline std::recursive_mutex& MicroProfileMutex()
-{
- static std::recursive_mutex Mutex;
- return Mutex;
-}
-std::recursive_mutex& MicroProfileGetMutex()
-{
- return MicroProfileMutex();
-}
-
-MICROPROFILE_API MicroProfile* MicroProfileGet()
-{
- return &g_MicroProfile;
-}
-
-
-MicroProfileThreadLog* MicroProfileCreateThreadLog(const char* pName);
-
-
-void MicroProfileInit()
-{
- std::recursive_mutex& mutex = MicroProfileMutex();
- bool bUseLock = g_bUseLock;
- if(bUseLock)
- mutex.lock();
- static bool bOnce = true;
- if(bOnce)
- {
- S.nMemUsage += sizeof(S);
- bOnce = false;
- memset(&S, 0, sizeof(S));
- for(int i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)
- {
- S.GroupInfo[i].pName[0] = '\0';
- }
- for(int i = 0; i < MICROPROFILE_MAX_CATEGORIES; ++i)
- {
- S.CategoryInfo[i].pName[0] = '\0';
- S.CategoryInfo[i].nGroupMask = 0;
- }
- strcpy(&S.CategoryInfo[0].pName[0], "default");
- S.nCategoryCount = 1;
- for(int i = 0; i < MICROPROFILE_MAX_TIMERS; ++i)
- {
- S.TimerInfo[i].pName[0] = '\0';
- }
- S.nGroupCount = 0;
- S.nAggregateFlipTick = MP_TICK();
- S.nActiveGroup = 0;
- S.nActiveBars = 0;
- S.nForceGroup = 0;
- S.nAllGroupsWanted = 0;
- S.nActiveGroupWanted = 0;
- S.nAllThreadsWanted = 1;
- S.nAggregateFlip = 0;
- S.nTotalTimers = 0;
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- S.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;
- }
- S.nRunning = 1;
- S.fReferenceTime = 33.33f;
- S.fRcpReferenceTime = 1.f / S.fReferenceTime;
- S.nFreeListHead = -1;
- int64_t nTick = MP_TICK();
- for(int i = 0; i < MICROPROFILE_MAX_FRAME_HISTORY; ++i)
- {
- S.Frames[i].nFrameStartCpu = nTick;
- S.Frames[i].nFrameStartGpu = -1;
- }
-
- MicroProfileThreadLog* pGpu = MicroProfileCreateThreadLog("GPU");
- g_MicroProfileGpuLog = pGpu;
- MP_ASSERT(S.Pool[0] == pGpu);
- pGpu->nGpu = 1;
- pGpu->nThreadId = 0;
-
- S.nWebServerDataSent = (uint64_t)-1;
- }
- if(bUseLock)
- mutex.unlock();
-}
-
-void MicroProfileShutdown()
-{
- std::lock_guard Lock(MicroProfileMutex());
- MicroProfileWebServerStop();
- MicroProfileStopContextSwitchTrace();
- MicroProfileGpuShutdown();
-}
-
-#ifdef MICROPROFILE_IOS
-inline MicroProfileThreadLog* MicroProfileGetThreadLog()
-{
- pthread_once(&g_MicroProfileThreadLogKeyOnce, MicroProfileCreateThreadLogKey);
- return (MicroProfileThreadLog*)pthread_getspecific(g_MicroProfileThreadLogKey);
-}
-
-inline void MicroProfileSetThreadLog(MicroProfileThreadLog* pLog)
-{
- pthread_once(&g_MicroProfileThreadLogKeyOnce, MicroProfileCreateThreadLogKey);
- pthread_setspecific(g_MicroProfileThreadLogKey, pLog);
-}
-#else
-MicroProfileThreadLog* MicroProfileGetThreadLog()
-{
- return g_MicroProfileThreadLog;
-}
-inline void MicroProfileSetThreadLog(MicroProfileThreadLog* pLog)
-{
- g_MicroProfileThreadLog = pLog;
-}
-#endif
-
-
-MicroProfileThreadLog* MicroProfileCreateThreadLog(const char* pName)
-{
- MicroProfileThreadLog* pLog = 0;
- if(S.nFreeListHead != -1)
- {
- pLog = S.Pool[S.nFreeListHead];
- MP_ASSERT(pLog->nPut.load() == 0);
- MP_ASSERT(pLog->nGet.load() == 0);
- S.nFreeListHead = S.Pool[S.nFreeListHead]->nFreeListNext;
- }
- else
- {
- pLog = new MicroProfileThreadLog;
- S.nMemUsage += sizeof(MicroProfileThreadLog);
- S.Pool[S.nNumLogs++] = pLog;
- }
- memset(pLog, 0, sizeof(*pLog));
- int len = (int)strlen(pName);
- int maxlen = sizeof(pLog->ThreadName)-1;
- len = len < maxlen ? len : maxlen;
- memcpy(&pLog->ThreadName[0], pName, len);
- pLog->ThreadName[len] = '\0';
- pLog->nThreadId = MP_GETCURRENTTHREADID();
- pLog->nFreeListNext = -1;
- pLog->nActive = 1;
- return pLog;
-}
-
-void MicroProfileOnThreadCreate(const char* pThreadName)
-{
- g_bUseLock = true;
- MicroProfileInit();
- std::lock_guard Lock(MicroProfileMutex());
- MP_ASSERT(MicroProfileGetThreadLog() == 0);
- MicroProfileThreadLog* pLog = MicroProfileCreateThreadLog(pThreadName ? pThreadName : MicroProfileGetThreadName());
- MP_ASSERT(pLog);
- MicroProfileSetThreadLog(pLog);
-}
-
-void MicroProfileOnThreadExit()
-{
- std::lock_guard Lock(MicroProfileMutex());
- MicroProfileThreadLog* pLog = MicroProfileGetThreadLog();
- if(pLog)
- {
- int32_t nLogIndex = -1;
- for(int i = 0; i < MICROPROFILE_MAX_THREADS; ++i)
- {
- if(pLog == S.Pool[i])
- {
- nLogIndex = i;
- break;
- }
- }
- MP_ASSERT(nLogIndex < MICROPROFILE_MAX_THREADS && nLogIndex > 0);
- pLog->nFreeListNext = S.nFreeListHead;
- pLog->nActive = 0;
- pLog->nPut.store(0);
- pLog->nGet.store(0);
- S.nFreeListHead = nLogIndex;
- for(int i = 0; i < MICROPROFILE_MAX_FRAME_HISTORY; ++i)
- {
- S.Frames[i].nLogStart[nLogIndex] = 0;
- }
- memset(pLog->nGroupStackPos, 0, sizeof(pLog->nGroupStackPos));
- memset(pLog->nGroupTicks, 0, sizeof(pLog->nGroupTicks));
- }
-}
-
-void MicroProfileInitThreadLog()
-{
- MicroProfileOnThreadCreate(nullptr);
-}
-
-
-struct MicroProfileScopeLock
-{
- bool bUseLock;
- std::recursive_mutex& m;
- MicroProfileScopeLock(std::recursive_mutex& m) : bUseLock(g_bUseLock), m(m)
- {
- if(bUseLock)
- m.lock();
- }
- ~MicroProfileScopeLock()
- {
- if(bUseLock)
- m.unlock();
- }
-};
-
-MicroProfileToken MicroProfileFindToken(const char* pGroup, const char* pName)
-{
- MicroProfileInit();
- MicroProfileScopeLock L(MicroProfileMutex());
- for(uint32_t i = 0; i < S.nTotalTimers; ++i)
- {
- if(!MP_STRCASECMP(pName, S.TimerInfo[i].pName) && !MP_STRCASECMP(pGroup, S.GroupInfo[S.TimerToGroup[i]].pName))
- {
- return S.TimerInfo[i].nToken;
- }
- }
- return MICROPROFILE_INVALID_TOKEN;
-}
-
-uint16_t MicroProfileGetGroup(const char* pGroup, MicroProfileTokenType Type)
-{
- for(uint32_t i = 0; i < S.nGroupCount; ++i)
- {
- if(!MP_STRCASECMP(pGroup, S.GroupInfo[i].pName))
- {
- return i;
- }
- }
- uint16_t nGroupIndex = 0xffff;
- uint32_t nLen = (uint32_t)strlen(pGroup);
- if(nLen > MICROPROFILE_NAME_MAX_LEN-1)
- nLen = MICROPROFILE_NAME_MAX_LEN-1;
- memcpy(&S.GroupInfo[S.nGroupCount].pName[0], pGroup, nLen);
- S.GroupInfo[S.nGroupCount].pName[nLen] = '\0';
- S.GroupInfo[S.nGroupCount].nNameLen = nLen;
- S.GroupInfo[S.nGroupCount].nNumTimers = 0;
- S.GroupInfo[S.nGroupCount].nGroupIndex = S.nGroupCount;
- S.GroupInfo[S.nGroupCount].Type = Type;
- S.GroupInfo[S.nGroupCount].nMaxTimerNameLen = 0;
- S.GroupInfo[S.nGroupCount].nColor = 0x88888888;
- S.GroupInfo[S.nGroupCount].nCategory = 0;
- S.CategoryInfo[0].nGroupMask |= (1ll << (uint64_t)S.nGroupCount);
- nGroupIndex = S.nGroupCount++;
- S.nGroupMask = (S.nGroupMask<<1)|1;
- MP_ASSERT(nGroupIndex < MICROPROFILE_MAX_GROUPS);
- return nGroupIndex;
-}
-
-void MicroProfileRegisterGroup(const char* pGroup, const char* pCategory, uint32_t nColor)
-{
- int nCategoryIndex = -1;
- for(uint32_t i = 0; i < S.nCategoryCount; ++i)
- {
- if(!MP_STRCASECMP(pCategory, S.CategoryInfo[i].pName))
- {
- nCategoryIndex = (int)i;
- break;
- }
- }
- if(-1 == nCategoryIndex && S.nCategoryCount < MICROPROFILE_MAX_CATEGORIES)
- {
- MP_ASSERT(S.CategoryInfo[S.nCategoryCount].pName[0] == '\0');
- nCategoryIndex = (int)S.nCategoryCount++;
- uint32_t nLen = (uint32_t)strlen(pCategory);
- if(nLen > MICROPROFILE_NAME_MAX_LEN-1)
- nLen = MICROPROFILE_NAME_MAX_LEN-1;
- memcpy(&S.CategoryInfo[nCategoryIndex].pName[0], pCategory, nLen);
- S.CategoryInfo[nCategoryIndex].pName[nLen] = '\0';
- }
- uint16_t nGroup = MicroProfileGetGroup(pGroup, 0 != MP_STRCASECMP(pGroup, "gpu")?MicroProfileTokenTypeCpu : MicroProfileTokenTypeGpu);
- S.GroupInfo[nGroup].nColor = nColor;
- if(nCategoryIndex >= 0)
- {
- uint64_t nBit = 1ll << nGroup;
- uint32_t nOldCategory = S.GroupInfo[nGroup].nCategory;
- S.CategoryInfo[nOldCategory].nGroupMask &= ~nBit;
- S.CategoryInfo[nCategoryIndex].nGroupMask |= nBit;
- S.GroupInfo[nGroup].nCategory = nCategoryIndex;
- }
-}
-
-MicroProfileToken MicroProfileGetToken(const char* pGroup, const char* pName, uint32_t nColor, MicroProfileTokenType Type)
-{
- MicroProfileInit();
- MicroProfileScopeLock L(MicroProfileMutex());
- MicroProfileToken ret = MicroProfileFindToken(pGroup, pName);
- if(ret != MICROPROFILE_INVALID_TOKEN)
- return ret;
- uint16_t nGroupIndex = MicroProfileGetGroup(pGroup, Type);
- uint16_t nTimerIndex = (uint16_t)(S.nTotalTimers++);
- uint64_t nGroupMask = 1ll << nGroupIndex;
- MicroProfileToken nToken = MicroProfileMakeToken(nGroupMask, nTimerIndex);
- S.GroupInfo[nGroupIndex].nNumTimers++;
- S.GroupInfo[nGroupIndex].nMaxTimerNameLen = MicroProfileMax(S.GroupInfo[nGroupIndex].nMaxTimerNameLen, (uint32_t)strlen(pName));
- MP_ASSERT(S.GroupInfo[nGroupIndex].Type == Type); //dont mix cpu & gpu timers in the same group
- S.nMaxGroupSize = MicroProfileMax(S.nMaxGroupSize, S.GroupInfo[nGroupIndex].nNumTimers);
- S.TimerInfo[nTimerIndex].nToken = nToken;
- uint32_t nLen = (uint32_t)strlen(pName);
- if(nLen > MICROPROFILE_NAME_MAX_LEN-1)
- nLen = MICROPROFILE_NAME_MAX_LEN-1;
- memcpy(&S.TimerInfo[nTimerIndex].pName, pName, nLen);
- S.TimerInfo[nTimerIndex].pName[nLen] = '\0';
- S.TimerInfo[nTimerIndex].nNameLen = nLen;
- S.TimerInfo[nTimerIndex].nColor = nColor&0xffffff;
- S.TimerInfo[nTimerIndex].nGroupIndex = nGroupIndex;
- S.TimerInfo[nTimerIndex].nTimerIndex = nTimerIndex;
- S.TimerToGroup[nTimerIndex] = nGroupIndex;
- return nToken;
-}
-
-MicroProfileToken MicroProfileGetMetaToken(const char* pName)
-{
- MicroProfileInit();
- MicroProfileScopeLock L(MicroProfileMutex());
- for(uint32_t i = 0; i < MICROPROFILE_META_MAX; ++i)
- {
- if(!S.MetaCounters[i].pName)
- {
- S.MetaCounters[i].pName = pName;
- return i;
- }
- else if(!MP_STRCASECMP(pName, S.MetaCounters[i].pName))
- {
- return i;
- }
- }
- MP_ASSERT(0);//out of slots, increase MICROPROFILE_META_MAX
- return (MicroProfileToken)-1;
-}
-
-const char* MicroProfileNextName(const char* pName, char* pNameOut, uint32_t* nSubNameLen)
-{
- int nMaxLen = MICROPROFILE_NAME_MAX_LEN-1;
- const char* pRet = 0;
- bool bDone = false;
- uint32_t nChars = 0;
- for(int i = 0; i < nMaxLen && !bDone; ++i)
- {
- char c = *pName++;
- switch(c)
- {
- case 0:
- bDone = true;
- break;
- case '\\':
- case '/':
- if(nChars)
- {
- bDone = true;
- pRet = pName;
- }
- break;
- default:
- nChars++;
- *pNameOut++ = c;
- }
- }
- *nSubNameLen = nChars;
- *pNameOut = '\0';
- return pRet;
-}
-
-
-const char* MicroProfileCounterFullName(int nCounter)
-{
- static char Buffer[1024];
- int nNodes[32];
- int nIndex = 0;
- do
- {
- nNodes[nIndex++] = nCounter;
- nCounter = S.CounterInfo[nCounter].nParent;
- }while(nCounter >= 0);
- int nOffset = 0;
- while(nIndex >= 0 && nOffset < (int)sizeof(Buffer)-2)
- {
- uint32_t nLen = S.CounterInfo[nNodes[nIndex]].nNameLen + nOffset;// < sizeof(Buffer)-1
- nLen = MicroProfileMin((uint32_t)(sizeof(Buffer) - 2 - nOffset), nLen);
- memcpy(&Buffer[nOffset], S.CounterInfo[nNodes[nIndex]].pName, nLen);
-
- nOffset += S.CounterInfo[nNodes[nIndex]].nNameLen+1;
- if(nIndex)
- {
- Buffer[nOffset++] = '/';
- }
- nIndex--;
- }
- return &Buffer[0];
-}
-MicroProfileToken MicroProfileGetCounterTokenByParent(int nParent, const char* pName)
-{
- for(uint32_t i = 0; i < S.nNumCounters; ++i)
- {
- if(nParent == S.CounterInfo[i].nParent && !MP_STRCASECMP(S.CounterInfo[i].pName, pName))
- {
- return i;
- }
- }
- MicroProfileToken nResult = S.nNumCounters++;
- S.CounterInfo[nResult].nParent = nParent;
- S.CounterInfo[nResult].nSibling = -1;
- S.CounterInfo[nResult].nFirstChild = -1;
- S.CounterInfo[nResult].nClosed = 0;
- S.CounterInfo[nResult].nFlags = 0;
- S.CounterInfo[nResult].eFormat = MICROPROFILE_COUNTER_FORMAT_DEFAULT;
- S.CounterInfo[nResult].nLimit = 0;
- int nLen = (int)strlen(pName)+1;
-
- MP_ASSERT(nLen + S.nCounterNamePos <= MICROPROFILE_MAX_COUNTER_NAME_CHARS);
- uint32_t nPos = S.nCounterNamePos;
- S.nCounterNamePos += nLen;
- memcpy(&S.CounterNames[nPos], pName, nLen);
- S.CounterInfo[nResult].nNameLen = nLen-1;
- S.CounterInfo[nResult].pName = &S.CounterNames[nPos];
- if(nParent >= 0)
- {
- S.CounterInfo[nResult].nSibling = S.CounterInfo[nParent].nFirstChild;
- S.CounterInfo[nResult].nLevel = S.CounterInfo[nParent].nLevel + 1;
- S.CounterInfo[nParent].nFirstChild = nResult;
- }
- else
- {
- S.CounterInfo[nResult].nLevel = 0;
- }
-
- return nResult;
-}
-
-MicroProfileToken MicroProfileGetCounterToken(const char* pName)
-{
- MicroProfileInit();
- MicroProfileScopeLock L(MicroProfileMutex());
- char SubName[MICROPROFILE_NAME_MAX_LEN];
- MicroProfileToken nResult = MICROPROFILE_INVALID_TOKEN;
- do
- {
- uint32_t nLen = 0;
- pName = MicroProfileNextName(pName, &SubName[0], &nLen);
- if(0 == nLen)
- {
- break;
- }
- nResult = MicroProfileGetCounterTokenByParent(nResult, SubName);
-
- }while(pName != 0);
-
- MP_ASSERT((int)nResult >= 0);
- return nResult;
-}
-
-inline void MicroProfileLogPut(MicroProfileToken nToken_, uint64_t nTick, uint64_t nBegin, MicroProfileThreadLog* pLog)
-{
- MP_ASSERT(pLog != 0); //this assert is hit if MicroProfileOnCreateThread is not called
- MP_ASSERT(pLog->nActive);
- uint32_t nPos = pLog->nPut.load(std::memory_order_relaxed);
- uint32_t nNextPos = (nPos+1) % MICROPROFILE_BUFFER_SIZE;
- if(nNextPos == pLog->nGet.load(std::memory_order_relaxed))
- {
- S.nOverflow = 100;
- }
- else
- {
- pLog->Log[nPos] = MicroProfileMakeLogIndex(nBegin, nToken_, nTick);
- pLog->nPut.store(nNextPos, std::memory_order_release);
- }
-}
-
-uint64_t MicroProfileEnter(MicroProfileToken nToken_)
-{
- if(MicroProfileGetGroupMask(nToken_) & S.nActiveGroup)
- {
- if(!MicroProfileGetThreadLog())
- {
- MicroProfileInitThreadLog();
- }
- uint64_t nTick = MP_TICK();
- MicroProfileLogPut(nToken_, nTick, MP_LOG_ENTER, MicroProfileGetThreadLog());
- return nTick;
- }
- return MICROPROFILE_INVALID_TICK;
-}
-
-void MicroProfileMetaUpdate(MicroProfileToken nToken, int nCount, MicroProfileTokenType eTokenType)
-{
- if((MP_DRAW_META_FIRST<nTicks <= S.nPauseTicks)
- {
- uint32_t nPut = S.nContextSwitchPut;
- S.ContextSwitch[nPut] = *pContextSwitch;
- S.nContextSwitchPut = (S.nContextSwitchPut+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE;
- }
-}
-
-
-void MicroProfileGetRange(uint32_t nPut, uint32_t nGet, uint32_t nRange[2][2])
-{
- if(nPut > nGet)
- {
- nRange[0][0] = nGet;
- nRange[0][1] = nPut;
- nRange[1][0] = nRange[1][1] = 0;
- }
- else if(nPut != nGet)
- {
- MP_ASSERT(nGet != MICROPROFILE_BUFFER_SIZE);
- uint32_t nCountEnd = MICROPROFILE_BUFFER_SIZE - nGet;
- nRange[0][0] = nGet;
- nRange[0][1] = nGet + nCountEnd;
- nRange[1][0] = 0;
- nRange[1][1] = nPut;
- }
-}
-
-void MicroProfileFlip()
-{
- #if 0
- //verify LogEntry wraps correctly
- MicroProfileLogEntry c = MP_LOG_TICK_MASK-5000;
- for(int i = 0; i < 10000; ++i, c += 1)
- {
- MicroProfileLogEntry l2 = (c+2500) & MP_LOG_TICK_MASK;
- MP_ASSERT(2500 == MicroProfileLogTickDifference(c, l2));
- }
- #endif
- MICROPROFILE_SCOPE(g_MicroProfileFlip);
- std::lock_guard Lock(MicroProfileMutex());
-
-
- MicroProfileGpuFlip();
-
- if(S.nToggleRunning)
- {
- S.nRunning = !S.nRunning;
- if(!S.nRunning)
- S.nPauseTicks = MP_TICK();
- S.nToggleRunning = 0;
- for(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)
- {
- MicroProfileThreadLog* pLog = S.Pool[i];
- if(pLog)
- {
- pLog->nStackPos = 0;
- }
- }
- }
- uint32_t nAggregateClear = S.nAggregateClear || S.nAutoClearFrames, nAggregateFlip = 0;
- if(S.nDumpFileNextFrame)
- {
- MicroProfileDumpToFile();
- S.nDumpFileNextFrame = 0;
- S.nAutoClearFrames = MICROPROFILE_GPU_FRAME_DELAY + 3; //hide spike from dumping webpage
- }
- if(S.nWebServerDataSent == (uint64_t)-1)
- {
- MicroProfileWebServerStart();
- S.nWebServerDataSent = 0;
- }
-
- if(MicroProfileWebServerUpdate())
- {
- S.nAutoClearFrames = MICROPROFILE_GPU_FRAME_DELAY + 3; //hide spike from dumping webpage
- }
-
- if(S.nAutoClearFrames)
- {
- nAggregateClear = 1;
- nAggregateFlip = 1;
- S.nAutoClearFrames -= 1;
- }
-
-
- if(S.nRunning || S.nForceEnable)
- {
- S.nFramePutIndex++;
- S.nFramePut = (S.nFramePut+1) % MICROPROFILE_MAX_FRAME_HISTORY;
- MP_ASSERT((S.nFramePutIndex % MICROPROFILE_MAX_FRAME_HISTORY) == S.nFramePut);
- S.nFrameCurrent = (S.nFramePut + MICROPROFILE_MAX_FRAME_HISTORY - MICROPROFILE_GPU_FRAME_DELAY - 1) % MICROPROFILE_MAX_FRAME_HISTORY;
- S.nFrameCurrentIndex++;
- uint32_t nFrameNext = (S.nFrameCurrent+1) % MICROPROFILE_MAX_FRAME_HISTORY;
-
- uint32_t nContextSwitchPut = S.nContextSwitchPut;
- if(S.nContextSwitchLastPut < nContextSwitchPut)
- {
- S.nContextSwitchUsage = (nContextSwitchPut - S.nContextSwitchLastPut);
- }
- else
- {
- S.nContextSwitchUsage = MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE - S.nContextSwitchLastPut + nContextSwitchPut;
- }
- S.nContextSwitchLastPut = nContextSwitchPut;
-
- MicroProfileFrameState* pFramePut = &S.Frames[S.nFramePut];
- MicroProfileFrameState* pFrameCurrent = &S.Frames[S.nFrameCurrent];
- MicroProfileFrameState* pFrameNext = &S.Frames[nFrameNext];
-
- pFramePut->nFrameStartCpu = MP_TICK();
- pFramePut->nFrameStartGpu = MicroProfileGpuInsertTimeStamp();
- if(pFrameNext->nFrameStartGpu != -1)
- pFrameNext->nFrameStartGpu = MicroProfileGpuGetTimeStamp((uint32_t)pFrameNext->nFrameStartGpu);
-
- if(pFrameCurrent->nFrameStartGpu == -1)
- pFrameCurrent->nFrameStartGpu = pFrameNext->nFrameStartGpu + 1;
-
- uint64_t nFrameStartCpu = pFrameCurrent->nFrameStartCpu;
- uint64_t nFrameEndCpu = pFrameNext->nFrameStartCpu;
-
- {
- uint64_t nTick = nFrameEndCpu - nFrameStartCpu;
- S.nFlipTicks = nTick;
- S.nFlipAggregate += nTick;
- S.nFlipMax = MicroProfileMax(S.nFlipMax, nTick);
- }
-
- uint8_t* pTimerToGroup = &S.TimerToGroup[0];
- for(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)
- {
- MicroProfileThreadLog* pLog = S.Pool[i];
- if(!pLog)
- {
- pFramePut->nLogStart[i] = 0;
- }
- else
- {
- uint32_t nPut = pLog->nPut.load(std::memory_order_acquire);
- pFramePut->nLogStart[i] = nPut;
- MP_ASSERT(nPut< MICROPROFILE_BUFFER_SIZE);
- //need to keep last frame around to close timers. timers more than 1 frame old is ditched.
- pLog->nGet.store(nPut, std::memory_order_relaxed);
- }
- }
-
- if(S.nRunning)
- {
- uint64_t* pFrameGroup = &S.FrameGroup[0];
- {
- MICROPROFILE_SCOPE(g_MicroProfileClear);
- for(uint32_t i = 0; i < S.nTotalTimers; ++i)
- {
- S.Frame[i].nTicks = 0;
- S.Frame[i].nCount = 0;
- S.FrameExclusive[i] = 0;
- }
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)
- {
- pFrameGroup[i] = 0;
- }
- for(uint32_t j = 0; j < MICROPROFILE_META_MAX; ++j)
- {
- if(S.MetaCounters[j].pName && 0 != (S.nActiveBars & (MP_DRAW_META_FIRST<nGroupStackPos[0];
- int64_t nGroupTicks[MICROPROFILE_MAX_GROUPS] = {0};
-
-
- uint32_t nPut = pFrameNext->nLogStart[i];
- uint32_t nGet = pFrameCurrent->nLogStart[i];
- uint32_t nRange[2][2] = { {0, 0}, {0, 0}, };
- MicroProfileGetRange(nPut, nGet, nRange);
-
-
- //fetch gpu results.
- if(pLog->nGpu)
- {
- for(uint32_t j = 0; j < 2; ++j)
- {
- uint32_t nStart = nRange[j][0];
- uint32_t nEnd = nRange[j][1];
- for(uint32_t k = nStart; k < nEnd; ++k)
- {
- MicroProfileLogEntry L = pLog->Log[k];
- if(MicroProfileLogType(L) < MP_LOG_META)
- {
- pLog->Log[k] = MicroProfileLogSetTick(L, MicroProfileGpuGetTimeStamp((uint32_t)MicroProfileLogGetTick(L)));
- }
- }
- }
- }
-
-
- uint32_t* pStack = &pLog->nStack[0];
- int64_t* pChildTickStack = &pLog->nChildTickStack[0];
- uint32_t nStackPos = pLog->nStackPos;
-
- for(uint32_t j = 0; j < 2; ++j)
- {
- uint32_t nStart = nRange[j][0];
- uint32_t nEnd = nRange[j][1];
- for(uint32_t k = nStart; k < nEnd; ++k)
- {
- MicroProfileLogEntry LE = pLog->Log[k];
- uint64_t nType = MicroProfileLogType(LE);
-
- if(MP_LOG_ENTER == nType)
- {
- int nTimer = MicroProfileLogTimerIndex(LE);
- uint8_t nGroup = pTimerToGroup[nTimer];
- MP_ASSERT(nStackPos < MICROPROFILE_STACK_MAX);
- MP_ASSERT(nGroup < MICROPROFILE_MAX_GROUPS);
- pGroupStackPos[nGroup]++;
- pStack[nStackPos++] = k;
- pChildTickStack[nStackPos] = 0;
-
- }
- else if(MP_LOG_META == nType)
- {
- if(nStackPos)
- {
- int64_t nMetaIndex = MicroProfileLogTimerIndex(LE);
- int64_t nMetaCount = MicroProfileLogGetTick(LE);
- MP_ASSERT(nMetaIndex < MICROPROFILE_META_MAX);
- int64_t nCounter = MicroProfileLogTimerIndex(pLog->Log[pStack[nStackPos-1]]);
- S.MetaCounters[nMetaIndex].nCounters[nCounter] += nMetaCount;
- }
- }
- else if(MP_LOG_LEAVE == nType)
- {
- int nTimer = MicroProfileLogTimerIndex(LE);
- uint8_t nGroup = pTimerToGroup[nTimer];
- MP_ASSERT(nGroup < MICROPROFILE_MAX_GROUPS);
- if(nStackPos)
- {
- int64_t nTickStart = pLog->Log[pStack[nStackPos-1]];
- int64_t nTicks = MicroProfileLogTickDifference(nTickStart, LE);
- int64_t nChildTicks = pChildTickStack[nStackPos];
- nStackPos--;
- pChildTickStack[nStackPos] += nTicks;
-
- uint32_t nTimerIndex = MicroProfileLogTimerIndex(LE);
- S.Frame[nTimerIndex].nTicks += nTicks;
- S.FrameExclusive[nTimerIndex] += (nTicks-nChildTicks);
- S.Frame[nTimerIndex].nCount += 1;
-
- MP_ASSERT(nGroup < MICROPROFILE_MAX_GROUPS);
- uint8_t nGroupStackPos = pGroupStackPos[nGroup];
- if(nGroupStackPos)
- {
- nGroupStackPos--;
- if(0 == nGroupStackPos)
- {
- nGroupTicks[nGroup] += nTicks;
- }
- pGroupStackPos[nGroup] = nGroupStackPos;
- }
- }
- }
- }
- }
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)
- {
- pLog->nGroupTicks[i] += nGroupTicks[i];
- pFrameGroup[i] += nGroupTicks[i];
- }
- pLog->nStackPos = nStackPos;
- }
- }
- {
- MICROPROFILE_SCOPE(g_MicroProfileAccumulate);
- for(uint32_t i = 0; i < S.nTotalTimers; ++i)
- {
- S.AccumTimers[i].nTicks += S.Frame[i].nTicks;
- S.AccumTimers[i].nCount += S.Frame[i].nCount;
- S.AccumMaxTimers[i] = MicroProfileMax(S.AccumMaxTimers[i], S.Frame[i].nTicks);
- S.AccumMinTimers[i] = MicroProfileMin(S.AccumMinTimers[i], S.Frame[i].nTicks);
- S.AccumTimersExclusive[i] += S.FrameExclusive[i];
- S.AccumMaxTimersExclusive[i] = MicroProfileMax(S.AccumMaxTimersExclusive[i], S.FrameExclusive[i]);
- }
-
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)
- {
- S.AccumGroup[i] += pFrameGroup[i];
- S.AccumGroupMax[i] = MicroProfileMax(S.AccumGroupMax[i], pFrameGroup[i]);
- }
-
- for(uint32_t j = 0; j < MICROPROFILE_META_MAX; ++j)
- {
- if(S.MetaCounters[j].pName && 0 != (S.nActiveBars & (MP_DRAW_META_FIRST<nAggregateGroupTicks[0], &pLog->nGroupTicks[0], sizeof(pLog->nAggregateGroupTicks));
-
- if(nAggregateClear)
- {
- memset(&pLog->nGroupTicks[0], 0, sizeof(pLog->nGroupTicks));
- }
- }
-
- for(uint32_t j = 0; j < MICROPROFILE_META_MAX; ++j)
- {
- if(S.MetaCounters[j].pName && 0 != (S.nActiveBars & (MP_DRAW_META_FIRST<= 0)
- {
- if(bEnabled)
- {
- S.nActiveGroupWanted |= S.CategoryInfo[nCategoryIndex].nGroupMask;
- }
- else
- {
- S.nActiveGroupWanted &= ~S.CategoryInfo[nCategoryIndex].nGroupMask;
- }
- }
-}
-
-
-void MicroProfileEnableCategory(const char* pCategory)
-{
- MicroProfileEnableCategory(pCategory, true);
-}
-void MicroProfileDisableCategory(const char* pCategory)
-{
- MicroProfileEnableCategory(pCategory, false);
-}
-
-bool MicroProfileGetEnableAllGroups()
-{
- return 0 != S.nAllGroupsWanted;
-}
-
-void MicroProfileSetForceMetaCounters(bool bForce)
-{
- S.nForceMetaCounters = bForce ? 1 : 0;
-}
-
-bool MicroProfileGetForceMetaCounters()
-{
- return 0 != S.nForceMetaCounters;
-}
-
-void MicroProfileEnableMetaCounter(const char* pMeta)
-{
- for(uint32_t i = 0; i < MICROPROFILE_META_MAX; ++i)
- {
- if(S.MetaCounters[i].pName && 0 == MP_STRCASECMP(S.MetaCounters[i].pName, pMeta))
- {
- S.nBars |= (MP_DRAW_META_FIRST< Lock(MicroProfileMutex());
- uint16_t nGroup = MicroProfileGetGroup(pGroup, Type);
- S.nForceGroup |= (1ll << nGroup);
-}
-
-void MicroProfileForceDisableGroup(const char* pGroup, MicroProfileTokenType Type)
-{
- MicroProfileInit();
- std::lock_guard Lock(MicroProfileMutex());
- uint16_t nGroup = MicroProfileGetGroup(pGroup, Type);
- S.nForceGroup &= ~(1ll << nGroup);
-}
-
-
-void MicroProfileCalcAllTimers(float* pTimers, float* pAverage, float* pMax, float* pMin, float* pCallAverage, float* pExclusive, float* pAverageExclusive, float* pMaxExclusive, float* pTotal, uint32_t nSize)
-{
- for(uint32_t i = 0; i < S.nTotalTimers && i < nSize; ++i)
- {
- const uint32_t nGroupId = S.TimerInfo[i].nGroupIndex;
- const float fToMs = MicroProfileTickToMsMultiplier(S.GroupInfo[nGroupId].Type == MicroProfileTokenTypeGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());
- uint32_t nTimer = i;
- uint32_t nIdx = i * 2;
- uint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;
- uint32_t nAggregateCount = S.Aggregate[nTimer].nCount ? S.Aggregate[nTimer].nCount : 1;
- float fToPrc = S.fRcpReferenceTime;
- float fMs = fToMs * (S.Frame[nTimer].nTicks);
- float fPrc = MicroProfileMin(fMs * fToPrc, 1.f);
- float fAverageMs = fToMs * (S.Aggregate[nTimer].nTicks / nAggregateFrames);
- float fAveragePrc = MicroProfileMin(fAverageMs * fToPrc, 1.f);
- float fMaxMs = fToMs * (S.AggregateMax[nTimer]);
- float fMaxPrc = MicroProfileMin(fMaxMs * fToPrc, 1.f);
- float fMinMs = fToMs * (S.AggregateMin[nTimer] != uint64_t(-1) ? S.AggregateMin[nTimer] : 0);
- float fMinPrc = MicroProfileMin(fMinMs * fToPrc, 1.f);
- float fCallAverageMs = fToMs * (S.Aggregate[nTimer].nTicks / nAggregateCount);
- float fCallAveragePrc = MicroProfileMin(fCallAverageMs * fToPrc, 1.f);
- float fMsExclusive = fToMs * (S.FrameExclusive[nTimer]);
- float fPrcExclusive = MicroProfileMin(fMsExclusive * fToPrc, 1.f);
- float fAverageMsExclusive = fToMs * (S.AggregateExclusive[nTimer] / nAggregateFrames);
- float fAveragePrcExclusive = MicroProfileMin(fAverageMsExclusive * fToPrc, 1.f);
- float fMaxMsExclusive = fToMs * (S.AggregateMaxExclusive[nTimer]);
- float fMaxPrcExclusive = MicroProfileMin(fMaxMsExclusive * fToPrc, 1.f);
- float fTotalMs = fToMs * S.Aggregate[nTimer].nTicks;
- pTimers[nIdx] = fMs;
- pTimers[nIdx+1] = fPrc;
- pAverage[nIdx] = fAverageMs;
- pAverage[nIdx+1] = fAveragePrc;
- pMax[nIdx] = fMaxMs;
- pMax[nIdx+1] = fMaxPrc;
- pMin[nIdx] = fMinMs;
- pMin[nIdx + 1] = fMinPrc;
- pCallAverage[nIdx] = fCallAverageMs;
- pCallAverage[nIdx+1] = fCallAveragePrc;
- pExclusive[nIdx] = fMsExclusive;
- pExclusive[nIdx+1] = fPrcExclusive;
- pAverageExclusive[nIdx] = fAverageMsExclusive;
- pAverageExclusive[nIdx+1] = fAveragePrcExclusive;
- pMaxExclusive[nIdx] = fMaxMsExclusive;
- pMaxExclusive[nIdx+1] = fMaxPrcExclusive;
- pTotal[nIdx] = fTotalMs;
- pTotal[nIdx+1] = 0.f;
- }
-}
-
-void MicroProfileTogglePause()
-{
- S.nToggleRunning = 1;
-}
-
-float MicroProfileGetTime(const char* pGroup, const char* pName)
-{
- MicroProfileToken nToken = MicroProfileFindToken(pGroup, pName);
- if(nToken == MICROPROFILE_INVALID_TOKEN)
- {
- return 0.f;
- }
- uint32_t nTimerIndex = MicroProfileGetTimerIndex(nToken);
- uint32_t nGroupIndex = MicroProfileGetGroupIndex(nToken);
- float fToMs = MicroProfileTickToMsMultiplier(S.GroupInfo[nGroupIndex].Type == MicroProfileTokenTypeGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());
- return S.Frame[nTimerIndex].nTicks * fToMs;
-}
-
-
-void MicroProfileContextSwitchSearch(uint32_t* pContextSwitchStart, uint32_t* pContextSwitchEnd, uint64_t nBaseTicksCpu, uint64_t nBaseTicksEndCpu)
-{
- MICROPROFILE_SCOPE(g_MicroProfileContextSwitchSearch);
- uint32_t nContextSwitchPut = S.nContextSwitchPut;
- uint64_t nContextSwitchStart, nContextSwitchEnd;
- nContextSwitchStart = nContextSwitchEnd = (nContextSwitchPut + MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE - 1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE;
- int64_t nSearchEnd = nBaseTicksEndCpu + MicroProfileMsToTick(30.f, MicroProfileTicksPerSecondCpu());
- int64_t nSearchBegin = nBaseTicksCpu - MicroProfileMsToTick(30.f, MicroProfileTicksPerSecondCpu());
- for(uint32_t i = 0; i < MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE; ++i)
- {
- uint32_t nIndex = (nContextSwitchPut + MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE - (i+1)) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE;
- MicroProfileContextSwitch& CS = S.ContextSwitch[nIndex];
- if(CS.nTicks > nSearchEnd)
- {
- nContextSwitchEnd = nIndex;
- }
- if(CS.nTicks > nSearchBegin)
- {
- nContextSwitchStart = nIndex;
- }
- }
- *pContextSwitchStart = nContextSwitchStart;
- *pContextSwitchEnd = nContextSwitchEnd;
-}
-
-int MicroProfileFormatCounter(int eFormat, int64_t nCounter, char* pOut, uint32_t nBufferSize)
-{
- if (!nCounter)
- {
- pOut[0] = '\0';
- return 0;
- }
- int nLen = 0;
- char* pBase = pOut;
- char* pTmp = pOut;
- char* pEnd = pOut + nBufferSize;
- switch (eFormat)
- {
- case MICROPROFILE_COUNTER_FORMAT_DEFAULT:
- {
- int nSeperate = 0;
- while (nCounter)
- {
- if (nSeperate)
- {
- *pTmp++ = '.';
- }
- nSeperate = 1;
- for (uint32_t i = 0; nCounter && i < 3; ++i)
- {
- int nDigit = nCounter % 10;
- nCounter /= 10;
- *pTmp++ = '0' + nDigit;
- }
- }
- nLen = pTmp - pOut;
- --pTmp;
- MP_ASSERT(pTmp <= pEnd);
- while (pTmp > pOut) //reverse string
- {
- char c = *pTmp;
- *pTmp = *pOut;
- *pOut = c;
- pTmp--;
- pOut++;
- }
- }
- break;
- case MICROPROFILE_COUNTER_FORMAT_BYTES:
- {
- const char* pExt[] = { "b","kb","mb","gb","tb","pb", };
- int64_t nNumExt = (int64_t)sizeof(pExt) / (int64_t)sizeof(pExt[0]);
- int64_t nShift = 0;
- int64_t nDivisor = 1;
- int64_t nCountShifted = nCounter >> 10;
- while (nCountShifted)
- {
- nDivisor <<= 10;
- nCountShifted >>= 10;
- nShift++;
- }
- MP_ASSERT(nShift < nNumExt);
- if (nShift)
- {
- nLen = snprintf(pOut, nBufferSize - 1, "%3.2f%s", (double)nCounter / nDivisor, pExt[nShift]);
- }
- else
- {
- nLen = snprintf(pOut, nBufferSize - 1, "%" PRId64 "%s", nCounter, pExt[nShift]);
- }
- }
- break;
- }
- pBase[nLen] = '\0';
-
- return nLen;
-}
-
-#if MICROPROFILE_WEBSERVER
-
-#define MICROPROFILE_EMBED_HTML
-
-extern const char* g_MicroProfileHtml_begin[];
-extern size_t g_MicroProfileHtml_begin_sizes[];
-extern size_t g_MicroProfileHtml_begin_count;
-extern const char* g_MicroProfileHtml_end[];
-extern size_t g_MicroProfileHtml_end_sizes[];
-extern size_t g_MicroProfileHtml_end_count;
-
-typedef void MicroProfileWriteCallback(void* Handle, size_t size, const char* pData);
-
-uint32_t MicroProfileWebServerPort()
-{
- return S.nWebServerPort;
-}
-
-void MicroProfileDumpFile(const char* pHtml, const char* pCsv)
-{
- S.nDumpFileNextFrame = 0;
- if(pHtml)
- {
- uint32_t nLen = strlen(pHtml);
- if(nLen > sizeof(S.HtmlDumpPath)-1)
- {
- return;
- }
- memcpy(S.HtmlDumpPath, pHtml, nLen+1);
- S.nDumpFileNextFrame |= 1;
- }
- if(pCsv)
- {
- uint32_t nLen = strlen(pCsv);
- if(nLen > sizeof(S.CsvDumpPath)-1)
- {
- return;
- }
- memcpy(S.CsvDumpPath, pCsv, nLen+1);
- S.nDumpFileNextFrame |= 2;
- }
-}
-
-void MicroProfilePrintf(MicroProfileWriteCallback CB, void* Handle, const char* pFmt, ...)
-{
- char buffer[32*1024];
- va_list args;
- va_start (args, pFmt);
-#ifdef _WIN32
- size_t size = vsprintf_s(buffer, pFmt, args);
-#else
- size_t size = vsnprintf(buffer, sizeof(buffer)-1, pFmt, args);
-#endif
- CB(Handle, size, &buffer[0]);
- va_end (args);
-}
-
-#define printf(...) MicroProfilePrintf(CB, Handle, __VA_ARGS__)
-void MicroProfileDumpCsv(MicroProfileWriteCallback CB, void* Handle, int nMaxFrames)
-{
- uint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;
- float fToMsCPU = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- float fToMsGPU = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondGpu());
-
- printf("frames,%d\n", nAggregateFrames);
- printf("group,name,average,max,callaverage\n");
-
- uint32_t nNumTimers = S.nTotalTimers;
- uint32_t nBlockSize = 2 * nNumTimers;
- float* pTimers = (float*)alloca(nBlockSize * 9 * sizeof(float));
- float* pAverage = pTimers + nBlockSize;
- float* pMax = pTimers + 2 * nBlockSize;
- float* pMin = pTimers + 3 * nBlockSize;
- float* pCallAverage = pTimers + 4 * nBlockSize;
- float* pTimersExclusive = pTimers + 5 * nBlockSize;
- float* pAverageExclusive = pTimers + 6 * nBlockSize;
- float* pMaxExclusive = pTimers + 7 * nBlockSize;
- float* pTotal = pTimers + 8 * nBlockSize;
-
- MicroProfileCalcAllTimers(pTimers, pAverage, pMax, pMin, pCallAverage, pTimersExclusive, pAverageExclusive, pMaxExclusive, pTotal, nNumTimers);
-
- for(uint32_t i = 0; i < S.nTotalTimers; ++i)
- {
- uint32_t nIdx = i * 2;
- printf("\"%s\",\"%s\",%f,%f,%f\n", S.TimerInfo[i].pName, S.GroupInfo[S.TimerInfo[i].nGroupIndex].pName, pAverage[nIdx], pMax[nIdx], pCallAverage[nIdx]);
- }
-
- printf("\n\n");
-
- printf("group,average,max,total\n");
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- const char* pGroupName = S.GroupInfo[j].pName;
- float fToMs = S.GroupInfo[j].Type == MicroProfileTokenTypeGpu ? fToMsGPU : fToMsCPU;
- if(pGroupName[0] != '\0')
- {
- printf("\"%s\",%.3f,%.3f,%.3f\n", pGroupName, fToMs * S.AggregateGroup[j] / nAggregateFrames, fToMs * S.AggregateGroup[j] / nAggregateFrames, fToMs * S.AggregateGroup[j]);
- }
- }
-
- printf("\n\n");
- printf("group,thread,average,total\n");
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- for(uint32_t i = 0; i < S.nNumLogs; ++i)
- {
- if(S.Pool[i])
- {
- const char* pThreadName = &S.Pool[i]->ThreadName[0];
- // MicroProfilePrintf(CB, Handle, "var ThreadGroupTime%d = [", i);
- float fToMs = S.Pool[i]->nGpu ? fToMsGPU : fToMsCPU;
- {
- uint64_t nTicks = S.Pool[i]->nAggregateGroupTicks[j];
- float fTime = nTicks / nAggregateFrames * fToMs;
- float fTimeTotal = nTicks * fToMs;
- if(fTimeTotal > 0.01f)
- {
- const char* pGroupName = S.GroupInfo[j].pName;
- printf("\"%s\",\"%s\",%.3f,%.3f\n", pGroupName, pThreadName, fTime, fTimeTotal);
- }
- }
- }
- }
- }
-
- printf("\n\n");
- printf("frametimecpu\n");
-
- const uint32_t nCount = MICROPROFILE_MAX_FRAME_HISTORY - MICROPROFILE_GPU_FRAME_DELAY - 3;
- const uint32_t nStart = S.nFrameCurrent;
- for(uint32_t i = nCount; i > 0; i--)
- {
- uint32_t nFrame = (nStart + MICROPROFILE_MAX_FRAME_HISTORY - i) % MICROPROFILE_MAX_FRAME_HISTORY;
- uint32_t nFrameNext = (nStart + MICROPROFILE_MAX_FRAME_HISTORY - i + 1) % MICROPROFILE_MAX_FRAME_HISTORY;
- uint64_t nTicks = S.Frames[nFrameNext].nFrameStartCpu - S.Frames[nFrame].nFrameStartCpu;
- printf("%f,", nTicks * fToMsCPU);
- }
- printf("\n");
-
- printf("\n\n");
- printf("frametimegpu\n");
-
- for(uint32_t i = nCount; i > 0; i--)
- {
- uint32_t nFrame = (nStart + MICROPROFILE_MAX_FRAME_HISTORY - i) % MICROPROFILE_MAX_FRAME_HISTORY;
- uint32_t nFrameNext = (nStart + MICROPROFILE_MAX_FRAME_HISTORY - i + 1) % MICROPROFILE_MAX_FRAME_HISTORY;
- uint64_t nTicks = S.Frames[nFrameNext].nFrameStartGpu - S.Frames[nFrame].nFrameStartGpu;
- printf("%f,", nTicks * fToMsGPU);
- }
- printf("\n\n");
- printf("Meta\n");//only single frame snapshot
- printf("name,average,max,total\n");
- for(int j = 0; j < MICROPROFILE_META_MAX; ++j)
- {
- if(S.MetaCounters[j].pName)
- {
- printf("\"%s\",%f,%lld,%lld\n",S.MetaCounters[j].pName, S.MetaCounters[j].nSumAggregate / (float)nAggregateFrames, S.MetaCounters[j].nSumAggregateMax,S.MetaCounters[j].nSumAggregate);
- }
- }
-}
-#undef printf
-
-
-void MicroProfileDumpHtml(MicroProfileWriteCallback CB, void* Handle, int nMaxFrames, const char* pHost)
-{
- uint32_t nRunning = S.nRunning;
- S.nRunning = 0;
- //stall pushing of timers
- uint64_t nActiveGroup = S.nActiveGroup;
- S.nActiveGroup = 0;
- S.nPauseTicks = MP_TICK();
-
-
- for(size_t i = 0; i < g_MicroProfileHtml_begin_count; ++i)
- {
- CB(Handle, g_MicroProfileHtml_begin_sizes[i]-1, g_MicroProfileHtml_begin[i]);
- }
- //dump info
- uint64_t nTicks = MP_TICK();
-
- float fToMsCPU = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- float fToMsGPU = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondGpu());
- float fAggregateMs = fToMsCPU * (nTicks - S.nAggregateFlipTick);
- MicroProfilePrintf(CB, Handle, "var DumpHost = '%s';\n", pHost ? pHost : "");
- time_t CaptureTime;
- time(&CaptureTime);
- MicroProfilePrintf(CB, Handle, "var DumpUtcCaptureTime = %ld;\n", CaptureTime);
- MicroProfilePrintf(CB, Handle, "var AggregateInfo = {'Frames':%d, 'Time':%f};\n", S.nAggregateFrames, fAggregateMs);
-
- //categories
- MicroProfilePrintf(CB, Handle, "var CategoryInfo = Array(%d);\n",S.nCategoryCount);
- for(uint32_t i = 0; i < S.nCategoryCount; ++i)
- {
- MicroProfilePrintf(CB, Handle, "CategoryInfo[%d] = \"%s\";\n", i, S.CategoryInfo[i].pName);
- }
-
- //groups
- MicroProfilePrintf(CB, Handle, "var GroupInfo = Array(%d);\n\n",S.nGroupCount);
- uint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;
- float fRcpAggregateFrames = 1.f / nAggregateFrames;
- for(uint32_t i = 0; i < S.nGroupCount; ++i)
- {
- MP_ASSERT(i == S.GroupInfo[i].nGroupIndex);
- float fToMs = S.GroupInfo[i].Type == MicroProfileTokenTypeCpu ? fToMsCPU : fToMsGPU;
- MicroProfilePrintf(CB, Handle, "GroupInfo[%d] = MakeGroup(%d, \"%s\", %d, %d, %d, %f, %f, %f, '#%02x%02x%02x');\n",
- S.GroupInfo[i].nGroupIndex,
- S.GroupInfo[i].nGroupIndex,
- S.GroupInfo[i].pName,
- S.GroupInfo[i].nCategory,
- S.GroupInfo[i].nNumTimers,
- S.GroupInfo[i].Type == MicroProfileTokenTypeGpu?1:0,
- fToMs * S.AggregateGroup[i],
- fToMs * S.AggregateGroup[i] / nAggregateFrames,
- fToMs * S.AggregateGroupMax[i],
- MICROPROFILE_UNPACK_RED(S.GroupInfo[i].nColor) & 0xff,
- MICROPROFILE_UNPACK_GREEN(S.GroupInfo[i].nColor) & 0xff,
- MICROPROFILE_UNPACK_BLUE(S.GroupInfo[i].nColor) & 0xff);
- }
- //timers
-
- uint32_t nNumTimers = S.nTotalTimers;
- uint32_t nBlockSize = 2 * nNumTimers;
- float* pTimers = (float*)alloca(nBlockSize * 9 * sizeof(float));
- float* pAverage = pTimers + nBlockSize;
- float* pMax = pTimers + 2 * nBlockSize;
- float* pMin = pTimers + 3 * nBlockSize;
- float* pCallAverage = pTimers + 4 * nBlockSize;
- float* pTimersExclusive = pTimers + 5 * nBlockSize;
- float* pAverageExclusive = pTimers + 6 * nBlockSize;
- float* pMaxExclusive = pTimers + 7 * nBlockSize;
- float* pTotal = pTimers + 8 * nBlockSize;
-
- MicroProfileCalcAllTimers(pTimers, pAverage, pMax, pMin, pCallAverage, pTimersExclusive, pAverageExclusive, pMaxExclusive, pTotal, nNumTimers);
-
- MicroProfilePrintf(CB, Handle, "\nvar TimerInfo = Array(%d);\n\n", S.nTotalTimers);
- for(uint32_t i = 0; i < S.nTotalTimers; ++i)
- {
- uint32_t nIdx = i * 2;
- MP_ASSERT(i == S.TimerInfo[i].nTimerIndex);
- MicroProfilePrintf(CB, Handle, "var Meta%d = [", i);
- bool bOnce = true;
- for(int j = 0; j < MICROPROFILE_META_MAX; ++j)
- {
- if(S.MetaCounters[j].pName)
- {
- uint32_t lala = S.MetaCounters[j].nCounters[i];
- MicroProfilePrintf(CB, Handle, bOnce ? "%d" : ",%d", lala);
- bOnce = false;
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n");
- MicroProfilePrintf(CB, Handle, "var MetaAvg%d = [", i);
- bOnce = true;
- for(int j = 0; j < MICROPROFILE_META_MAX; ++j)
- {
- if(S.MetaCounters[j].pName)
- {
- MicroProfilePrintf(CB, Handle, bOnce ? "%f" : ",%f", fRcpAggregateFrames * S.MetaCounters[j].nAggregate[i]);
- bOnce = false;
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n");
- MicroProfilePrintf(CB, Handle, "var MetaMax%d = [", i);
- bOnce = true;
- for(int j = 0; j < MICROPROFILE_META_MAX; ++j)
- {
- if(S.MetaCounters[j].pName)
- {
- MicroProfilePrintf(CB, Handle, bOnce ? "%d" : ",%d", S.MetaCounters[j].nAggregateMax[i]);
- bOnce = false;
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n");
-
-
- uint32_t nColor = S.TimerInfo[i].nColor;
- uint32_t nColorDark = (nColor >> 1) & ~0x80808080;
- MicroProfilePrintf(CB, Handle, "TimerInfo[%d] = MakeTimer(%d, \"%s\", %d, '#%02x%02x%02x','#%02x%02x%02x', %f, %f, %f, %f, %f, %d, %f, Meta%d, MetaAvg%d, MetaMax%d);\n", S.TimerInfo[i].nTimerIndex, S.TimerInfo[i].nTimerIndex, S.TimerInfo[i].pName, S.TimerInfo[i].nGroupIndex,
- MICROPROFILE_UNPACK_RED(nColor) & 0xff,
- MICROPROFILE_UNPACK_GREEN(nColor) & 0xff,
- MICROPROFILE_UNPACK_BLUE(nColor) & 0xff,
- MICROPROFILE_UNPACK_RED(nColorDark) & 0xff,
- MICROPROFILE_UNPACK_GREEN(nColorDark) & 0xff,
- MICROPROFILE_UNPACK_BLUE(nColorDark) & 0xff,
- pAverage[nIdx],
- pMax[nIdx],
- pAverageExclusive[nIdx],
- pMaxExclusive[nIdx],
- pCallAverage[nIdx],
- S.Aggregate[i].nCount,
- pTotal[nIdx],
- i,i,i);
-
- }
-
- MicroProfilePrintf(CB, Handle, "\nvar ThreadNames = [");
- for(uint32_t i = 0; i < S.nNumLogs; ++i)
- {
- if(S.Pool[i])
- {
- MicroProfilePrintf(CB, Handle, "'%s',", S.Pool[i]->ThreadName);
- }
- else
- {
- MicroProfilePrintf(CB, Handle, "'Thread %d',", i);
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n\n");
-
-
- for(uint32_t i = 0; i < S.nNumLogs; ++i)
- {
- if(S.Pool[i])
- {
- MicroProfilePrintf(CB, Handle, "var ThreadGroupTime%d = [", i);
- float fToMs = S.Pool[i]->nGpu ? fToMsGPU : fToMsCPU;
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- MicroProfilePrintf(CB, Handle, "%f,", S.Pool[i]->nAggregateGroupTicks[j]/nAggregateFrames * fToMs);
- }
- MicroProfilePrintf(CB, Handle, "];\n");
- }
- }
- MicroProfilePrintf(CB, Handle, "\nvar ThreadGroupTimeArray = [");
- for(uint32_t i = 0; i < S.nNumLogs; ++i)
- {
- if(S.Pool[i])
- {
- MicroProfilePrintf(CB, Handle, "ThreadGroupTime%d,", i);
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n");
-
-
- for(uint32_t i = 0; i < S.nNumLogs; ++i)
- {
- if(S.Pool[i])
- {
- MicroProfilePrintf(CB, Handle, "var ThreadGroupTimeTotal%d = [", i);
- float fToMs = S.Pool[i]->nGpu ? fToMsGPU : fToMsCPU;
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- MicroProfilePrintf(CB, Handle, "%f,", S.Pool[i]->nAggregateGroupTicks[j] * fToMs);
- }
- MicroProfilePrintf(CB, Handle, "];\n");
- }
- }
- MicroProfilePrintf(CB, Handle, "\nvar ThreadGroupTimeTotalArray = [");
- for(uint32_t i = 0; i < S.nNumLogs; ++i)
- {
- if(S.Pool[i])
- {
- MicroProfilePrintf(CB, Handle, "ThreadGroupTimeTotal%d,", i);
- }
- }
- MicroProfilePrintf(CB, Handle, "];");
-
-
-
-
- MicroProfilePrintf(CB, Handle, "\nvar ThreadIds = [");
- for(uint32_t i = 0; i < S.nNumLogs; ++i)
- {
- if(S.Pool[i])
- {
- ThreadIdType ThreadId = S.Pool[i]->nThreadId;
- if(!ThreadId)
- {
- ThreadId = (ThreadIdType)-1;
- }
- MicroProfilePrintf(CB, Handle, "%d,", ThreadId);
- }
- else
- {
- MicroProfilePrintf(CB, Handle, "-1,", i);
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n\n");
-
- MicroProfilePrintf(CB, Handle, "\nvar MetaNames = [");
- for(int i = 0; i < MICROPROFILE_META_MAX; ++i)
- {
- if(S.MetaCounters[i].pName)
- {
- MicroProfilePrintf(CB, Handle, "'%s',", S.MetaCounters[i].pName);
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n\n");
-
- MicroProfilePrintf(CB, Handle, "\nvar CounterInfo = [");
-
- for(int i = 0; i < S.nNumCounters; ++i)
- {
- uint64_t nCounter = S.Counters[i].load();
- uint64_t nLimit = S.CounterInfo[i].nLimit;
- float fCounterPrc = 0.f;
- float fBoxPrc = 1.f;
- if(nLimit)
- {
- fCounterPrc = (float)nCounter / nLimit;
- if(fCounterPrc>1.f)
- {
- fBoxPrc = 1.f / fCounterPrc;
- fCounterPrc = 1.f;
- }
- }
-
- char Formatted[64];
- char FormattedLimit[64];
- MicroProfileFormatCounter(S.CounterInfo[i].eFormat, nCounter, Formatted, sizeof(Formatted)-1);
- MicroProfileFormatCounter(S.CounterInfo[i].eFormat, S.CounterInfo[i].nLimit, FormattedLimit, sizeof(FormattedLimit)-1);
- MicroProfilePrintf(CB, Handle, "MakeCounter(%d, %d, %d, %d, %d, '%s', %lld, '%s', %lld, '%s', %f, %f),\n",
- i,
- S.CounterInfo[i].nParent,
- S.CounterInfo[i].nSibling,
- S.CounterInfo[i].nFirstChild,
- S.CounterInfo[i].nLevel,
- S.CounterInfo[i].pName,
- nCounter,
- Formatted,
- nLimit,
- FormattedLimit,
- fCounterPrc,
- fBoxPrc
- );
- }
- MicroProfilePrintf(CB, Handle, "];\n\n");
-
-
-
-
- uint32_t nNumFrames = (MICROPROFILE_MAX_FRAME_HISTORY - MICROPROFILE_GPU_FRAME_DELAY - 3); //leave a few to not overwrite
- nNumFrames = MicroProfileMin(nNumFrames, (uint32_t)nMaxFrames);
-
-
- uint32_t nFirstFrame = (S.nFrameCurrent + MICROPROFILE_MAX_FRAME_HISTORY - nNumFrames) % MICROPROFILE_MAX_FRAME_HISTORY;
- uint32_t nLastFrame = (nFirstFrame + nNumFrames) % MICROPROFILE_MAX_FRAME_HISTORY;
- MP_ASSERT(nLastFrame == (S.nFrameCurrent % MICROPROFILE_MAX_FRAME_HISTORY));
- MP_ASSERT(nFirstFrame < MICROPROFILE_MAX_FRAME_HISTORY);
- MP_ASSERT(nLastFrame < MICROPROFILE_MAX_FRAME_HISTORY);
- const int64_t nTickStart = S.Frames[nFirstFrame].nFrameStartCpu;
- const int64_t nTickEnd = S.Frames[nLastFrame].nFrameStartCpu;
- int64_t nTickStartGpu = S.Frames[nFirstFrame].nFrameStartGpu;
-
- int64_t nTickReferenceCpu, nTickReferenceGpu;
- int64_t nTicksPerSecondCpu = MicroProfileTicksPerSecondCpu();
- int64_t nTicksPerSecondGpu = MicroProfileTicksPerSecondGpu();
- int nTickReference = 0;
- if(MicroProfileGetGpuTickReference(&nTickReferenceCpu, &nTickReferenceGpu))
- {
- nTickStartGpu = (nTickStart - nTickReferenceCpu) * nTicksPerSecondGpu / nTicksPerSecondCpu + nTickReferenceGpu;
- nTickReference = 1;
- }
-
-
-#if MICROPROFILE_DEBUG
- printf("dumping %d frames\n", nNumFrames);
- printf("dumping frame %d to %d\n", nFirstFrame, nLastFrame);
-#endif
-
-
- uint32_t* nTimerCounter = (uint32_t*)alloca(sizeof(uint32_t)* S.nTotalTimers);
- memset(nTimerCounter, 0, sizeof(uint32_t) * S.nTotalTimers);
-
- MicroProfilePrintf(CB, Handle, "var Frames = Array(%d);\n", nNumFrames);
- for(uint32_t i = 0; i < nNumFrames; ++i)
- {
- uint32_t nFrameIndex = (nFirstFrame + i) % MICROPROFILE_MAX_FRAME_HISTORY;
- uint32_t nFrameIndexNext = (nFrameIndex + 1) % MICROPROFILE_MAX_FRAME_HISTORY;
-
- for(uint32_t j = 0; j < S.nNumLogs; ++j)
- {
- MicroProfileThreadLog* pLog = S.Pool[j];
- int64_t nStartTickBase = pLog->nGpu ? nTickStartGpu : nTickStart;
- uint32_t nLogStart = S.Frames[nFrameIndex].nLogStart[j];
- uint32_t nLogEnd = S.Frames[nFrameIndexNext].nLogStart[j];
-
- float fToMsCpu = MicroProfileTickToMsMultiplier(nTicksPerSecondCpu);
- float fToMsBase = MicroProfileTickToMsMultiplier(pLog->nGpu ? nTicksPerSecondGpu : nTicksPerSecondCpu);
- MicroProfilePrintf(CB, Handle, "var ts_%d_%d = [", i, j);
- if(nLogStart != nLogEnd)
- {
- uint32_t k = nLogStart;
- uint64_t nLogType = MicroProfileLogType(pLog->Log[k]);
- float fToMs = nLogType == MP_LOG_GPU_EXTRA ? fToMsCpu : fToMsBase;
- int64_t nStartTick = nLogType == MP_LOG_GPU_EXTRA ? nTickStart : nStartTickBase;
- float fTime = nLogType == MP_LOG_META ? 0.f : MicroProfileLogTickDifference(nStartTick, pLog->Log[k]) * fToMs;
- MicroProfilePrintf(CB, Handle, "%f", fTime);
- for(k = (k+1) % MICROPROFILE_BUFFER_SIZE; k != nLogEnd; k = (k+1) % MICROPROFILE_BUFFER_SIZE)
- {
- uint64_t nLogType = MicroProfileLogType(pLog->Log[k]);
- float fToMs = nLogType == MP_LOG_GPU_EXTRA ? fToMsCpu : fToMsBase;
- nStartTick = nLogType == MP_LOG_GPU_EXTRA ? nTickStart : nStartTickBase;
- float fTime = nLogType == MP_LOG_META ? 0.f : MicroProfileLogTickDifference(nStartTick, pLog->Log[k]) * fToMs;
- MicroProfilePrintf(CB, Handle, ",%f", fTime);
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n");
- MicroProfilePrintf(CB, Handle, "var tt_%d_%d = [", i, j);
- if(nLogStart != nLogEnd)
- {
- uint32_t k = nLogStart;
- MicroProfilePrintf(CB, Handle, "%d", MicroProfileLogType(pLog->Log[k]));
- for(k = (k+1) % MICROPROFILE_BUFFER_SIZE; k != nLogEnd; k = (k+1) % MICROPROFILE_BUFFER_SIZE)
- {
- uint64_t nLogType = MicroProfileLogType(pLog->Log[k]);
- if(nLogType == MP_LOG_META)
- {
- //for meta, store the count + 3, which is the tick part
- nLogType = 3 + MicroProfileLogGetTick(pLog->Log[k]);
- }
- MicroProfilePrintf(CB, Handle, ",%d", nLogType);
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n");
-
- MicroProfilePrintf(CB, Handle, "var ti_%d_%d = [", i, j);
- if(nLogStart != nLogEnd)
- {
- uint32_t k = nLogStart;
- MicroProfilePrintf(CB, Handle, "%d", (uint32_t)MicroProfileLogTimerIndex(pLog->Log[k]));
- for(k = (k+1) % MICROPROFILE_BUFFER_SIZE; k != nLogEnd; k = (k+1) % MICROPROFILE_BUFFER_SIZE)
- {
- uint32_t nTimerIndex = (uint32_t)MicroProfileLogTimerIndex(pLog->Log[k]);
- MicroProfilePrintf(CB, Handle, ",%d", nTimerIndex);
- nTimerCounter[nTimerIndex]++;
- }
- }
- MicroProfilePrintf(CB, Handle, "];\n");
-
- }
-
- MicroProfilePrintf(CB, Handle, "var ts%d = [", i);
- for(uint32_t j = 0; j < S.nNumLogs; ++j)
- {
- MicroProfilePrintf(CB, Handle, "ts_%d_%d,", i, j);
- }
- MicroProfilePrintf(CB, Handle, "];\n");
- MicroProfilePrintf(CB, Handle, "var tt%d = [", i);
- for(uint32_t j = 0; j < S.nNumLogs; ++j)
- {
- MicroProfilePrintf(CB, Handle, "tt_%d_%d,", i, j);
- }
- MicroProfilePrintf(CB, Handle, "];\n");
-
- MicroProfilePrintf(CB, Handle, "var ti%d = [", i);
- for(uint32_t j = 0; j < S.nNumLogs; ++j)
- {
- MicroProfilePrintf(CB, Handle, "ti_%d_%d,", i, j);
- }
- MicroProfilePrintf(CB, Handle, "];\n");
-
-
- int64_t nFrameStart = S.Frames[nFrameIndex].nFrameStartCpu;
- int64_t nFrameEnd = S.Frames[nFrameIndexNext].nFrameStartCpu;
-
- float fToMs = MicroProfileTickToMsMultiplier(nTicksPerSecondCpu);
- float fFrameMs = MicroProfileLogTickDifference(nTickStart, nFrameStart) * fToMs;
- float fFrameEndMs = MicroProfileLogTickDifference(nTickStart, nFrameEnd) * fToMs;
- float fFrameGpuMs = 0;
- float fFrameGpuEndMs = 0;
- if(nTickReference)
- {
- fFrameGpuMs = MicroProfileLogTickDifference(nTickStartGpu, S.Frames[nFrameIndex].nFrameStartGpu) * fToMsGPU;
- fFrameGpuEndMs = MicroProfileLogTickDifference(nTickStartGpu, S.Frames[nFrameIndexNext].nFrameStartGpu) * fToMsGPU;
- }
- MicroProfilePrintf(CB, Handle, "Frames[%d] = MakeFrame(%d, %f, %f, %f, %f, ts%d, tt%d, ti%d);\n", i, 0, fFrameMs, fFrameEndMs, fFrameGpuMs, fFrameGpuEndMs, i, i, i);
- }
-
- uint32_t nContextSwitchStart = 0;
- uint32_t nContextSwitchEnd = 0;
- MicroProfileContextSwitchSearch(&nContextSwitchStart, &nContextSwitchEnd, nTickStart, nTickEnd);
-
- uint32_t nWrittenBefore = S.nWebServerDataSent;
- MicroProfilePrintf(CB, Handle, "var CSwitchThreadInOutCpu = [");
- for(uint32_t j = nContextSwitchStart; j != nContextSwitchEnd; j = (j+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE)
- {
- MicroProfileContextSwitch CS = S.ContextSwitch[j];
- int nCpu = CS.nCpu;
- MicroProfilePrintf(CB, Handle, "%d,%d,%d,", CS.nThreadIn, CS.nThreadOut, nCpu);
- }
- MicroProfilePrintf(CB, Handle, "];\n");
- MicroProfilePrintf(CB, Handle, "var CSwitchTime = [");
- float fToMsCpu = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- for(uint32_t j = nContextSwitchStart; j != nContextSwitchEnd; j = (j+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE)
- {
- MicroProfileContextSwitch CS = S.ContextSwitch[j];
- float fTime = MicroProfileLogTickDifference(nTickStart, CS.nTicks) * fToMsCpu;
- MicroProfilePrintf(CB, Handle, "%f,", fTime);
- }
- MicroProfilePrintf(CB, Handle, "];\n");
- uint32_t nWrittenAfter = S.nWebServerDataSent;
- MicroProfilePrintf(CB, Handle, "//CSwitch Size %d\n", nWrittenAfter - nWrittenBefore);
-
-
- for(size_t i = 0; i < g_MicroProfileHtml_end_count; ++i)
- {
- CB(Handle, g_MicroProfileHtml_end_sizes[i]-1, g_MicroProfileHtml_end[i]);
- }
-
- uint32_t* nGroupCounter = (uint32_t*)alloca(sizeof(uint32_t)* S.nGroupCount);
-
- memset(nGroupCounter, 0, sizeof(uint32_t) * S.nGroupCount);
- for(uint32_t i = 0; i < S.nTotalTimers; ++i)
- {
- uint32_t nGroupIndex = S.TimerInfo[i].nGroupIndex;
- nGroupCounter[nGroupIndex] += nTimerCounter[i];
- }
-
- uint32_t* nGroupCounterSort = (uint32_t*)alloca(sizeof(uint32_t)* S.nGroupCount);
- uint32_t* nTimerCounterSort = (uint32_t*)alloca(sizeof(uint32_t)* S.nTotalTimers);
- for(uint32_t i = 0; i < S.nGroupCount; ++i)
- {
- nGroupCounterSort[i] = i;
- }
- for(uint32_t i = 0; i < S.nTotalTimers; ++i)
- {
- nTimerCounterSort[i] = i;
- }
- std::sort(nGroupCounterSort, nGroupCounterSort + S.nGroupCount,
- [nGroupCounter](const uint32_t l, const uint32_t r)
- {
- return nGroupCounter[l] > nGroupCounter[r];
- }
- );
-
- std::sort(nTimerCounterSort, nTimerCounterSort + S.nTotalTimers,
- [nTimerCounter](const uint32_t l, const uint32_t r)
- {
- return nTimerCounter[l] > nTimerCounter[r];
- }
- );
-
- MicroProfilePrintf(CB, Handle, "\n\n");
-
- S.nActiveGroup = nActiveGroup;
- S.nRunning = nRunning;
-
-#if MICROPROFILE_DEBUG
- int64_t nTicksEnd = MP_TICK();
- float fMs = fToMsCpu * (nTicksEnd - S.nPauseTicks);
- printf("html dump took %6.2fms\n", fMs);
-#endif
-
-
-}
-
-void MicroProfileWriteFile(void* Handle, size_t nSize, const char* pData)
-{
- fwrite(pData, nSize, 1, (FILE*)Handle);
-}
-
-void MicroProfileDumpToFile()
-{
- std::lock_guard Lock(MicroProfileMutex());
- if(S.nDumpFileNextFrame&1)
- {
- FILE* F = fopen(S.HtmlDumpPath, "w");
- if(F)
- {
- MicroProfileDumpHtml(MicroProfileWriteFile, F, MICROPROFILE_WEBSERVER_MAXFRAMES, S.HtmlDumpPath);
- fclose(F);
- }
- }
- if(S.nDumpFileNextFrame&2)
- {
- FILE* F = fopen(S.CsvDumpPath, "w");
- if(F)
- {
- MicroProfileDumpCsv(MicroProfileWriteFile, F, MICROPROFILE_WEBSERVER_MAXFRAMES);
- fclose(F);
- }
- }
-}
-
-void MicroProfileFlushSocket(MpSocket Socket)
-{
- send(Socket, &S.WebServerBuffer[0], S.WebServerPut, 0);
- S.WebServerPut = 0;
-
-}
-
-void MicroProfileWriteSocket(void* Handle, size_t nSize, const char* pData)
-{
- S.nWebServerDataSent += nSize;
- MpSocket Socket = *(MpSocket*)Handle;
- if(nSize > MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE / 2)
- {
- MicroProfileFlushSocket(Socket);
- send(Socket, pData, nSize, 0);
-
- }
- else
- {
- memcpy(&S.WebServerBuffer[S.WebServerPut], pData, nSize);
- S.WebServerPut += nSize;
- if(S.WebServerPut > MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE/2)
- {
- MicroProfileFlushSocket(Socket);
- }
- }
-}
-
-#if MICROPROFILE_MINIZ
-#ifndef MICROPROFILE_COMPRESS_BUFFER_SIZE
-#define MICROPROFILE_COMPRESS_BUFFER_SIZE (256<<10)
-#endif
-
-#define MICROPROFILE_COMPRESS_CHUNK (MICROPROFILE_COMPRESS_BUFFER_SIZE/2)
-struct MicroProfileCompressedSocketState
-{
- unsigned char DeflateOut[MICROPROFILE_COMPRESS_CHUNK];
- unsigned char DeflateIn[MICROPROFILE_COMPRESS_CHUNK];
- mz_stream Stream;
- MpSocket Socket;
- uint32_t nSize;
- uint32_t nCompressedSize;
- uint32_t nFlushes;
- uint32_t nMemmoveBytes;
-};
-
-void MicroProfileCompressedSocketFlush(MicroProfileCompressedSocketState* pState)
-{
- mz_stream& Stream = pState->Stream;
- unsigned char* pSendStart = &pState->DeflateOut[0];
- unsigned char* pSendEnd = &pState->DeflateOut[MICROPROFILE_COMPRESS_CHUNK - Stream.avail_out];
- if(pSendStart != pSendEnd)
- {
- send(pState->Socket, (const char*)pSendStart, pSendEnd - pSendStart, 0);
- pState->nCompressedSize += pSendEnd - pSendStart;
- }
- Stream.next_out = &pState->DeflateOut[0];
- Stream.avail_out = MICROPROFILE_COMPRESS_CHUNK;
-
-}
-void MicroProfileCompressedSocketStart(MicroProfileCompressedSocketState* pState, MpSocket Socket)
-{
- mz_stream& Stream = pState->Stream;
- memset(&Stream, 0, sizeof(Stream));
- Stream.next_out = &pState->DeflateOut[0];
- Stream.avail_out = MICROPROFILE_COMPRESS_CHUNK;
- Stream.next_in = &pState->DeflateIn[0];
- Stream.avail_in = 0;
- mz_deflateInit(&Stream, Z_DEFAULT_COMPRESSION);
- pState->Socket = Socket;
- pState->nSize = 0;
- pState->nCompressedSize = 0;
- pState->nFlushes = 0;
- pState->nMemmoveBytes = 0;
-
-}
-void MicroProfileCompressedSocketFinish(MicroProfileCompressedSocketState* pState)
-{
- mz_stream& Stream = pState->Stream;
- MicroProfileCompressedSocketFlush(pState);
- int r = mz_deflate(&Stream, MZ_FINISH);
- MP_ASSERT(r == MZ_STREAM_END);
- MicroProfileCompressedSocketFlush(pState);
- r = mz_deflateEnd(&Stream);
- MP_ASSERT(r == MZ_OK);
-}
-
-void MicroProfileCompressedWriteSocket(void* Handle, size_t nSize, const char* pData)
-{
- MicroProfileCompressedSocketState* pState = (MicroProfileCompressedSocketState*)Handle;
- mz_stream& Stream = pState->Stream;
- const unsigned char* pDeflateInEnd = Stream.next_in + Stream.avail_in;
- const unsigned char* pDeflateInStart = &pState->DeflateIn[0];
- const unsigned char* pDeflateInRealEnd = &pState->DeflateIn[MICROPROFILE_COMPRESS_CHUNK];
- pState->nSize += nSize;
- if(nSize <= pDeflateInRealEnd - pDeflateInEnd)
- {
- memcpy((void*)pDeflateInEnd, pData, nSize);
- Stream.avail_in += nSize;
- MP_ASSERT(Stream.next_in + Stream.avail_in <= pDeflateInRealEnd);
- return;
- }
- int Flush = 0;
- while(nSize)
- {
- pDeflateInEnd = Stream.next_in + Stream.avail_in;
- if(Flush)
- {
- pState->nFlushes++;
- MicroProfileCompressedSocketFlush(pState);
- pDeflateInRealEnd = &pState->DeflateIn[MICROPROFILE_COMPRESS_CHUNK];
- if(pDeflateInEnd == pDeflateInRealEnd)
- {
- if(Stream.avail_in)
- {
- MP_ASSERT(pDeflateInStart != Stream.next_in);
- memmove((void*)pDeflateInStart, Stream.next_in, Stream.avail_in);
- pState->nMemmoveBytes += Stream.avail_in;
- }
- Stream.next_in = pDeflateInStart;
- pDeflateInEnd = Stream.next_in + Stream.avail_in;
- }
- }
- size_t nSpace = pDeflateInRealEnd - pDeflateInEnd;
- size_t nBytes = MicroProfileMin(nSpace, nSize);
- MP_ASSERT(nBytes + pDeflateInEnd <= pDeflateInRealEnd);
- memcpy((void*)pDeflateInEnd, pData, nBytes);
- Stream.avail_in += nBytes;
- nSize -= nBytes;
- pData += nBytes;
- int r = mz_deflate(&Stream, MZ_NO_FLUSH);
- Flush = r == MZ_BUF_ERROR || nBytes == 0 || Stream.avail_out == 0 ? 1 : 0;
- MP_ASSERT(r == MZ_BUF_ERROR || r == MZ_OK);
- if(r == MZ_BUF_ERROR)
- {
- r = mz_deflate(&Stream, MZ_SYNC_FLUSH);
- }
- }
-}
-#endif
-
-
-#ifndef MicroProfileSetNonBlocking //fcntl doesnt work on a some unix like platforms..
-void MicroProfileSetNonBlocking(MpSocket Socket, int NonBlocking)
-{
-#ifdef _WIN32
- u_long nonBlocking = NonBlocking ? 1 : 0;
- ioctlsocket(Socket, FIONBIO, &nonBlocking);
-#else
- int Options = fcntl(Socket, F_GETFL);
- if(NonBlocking)
- {
- fcntl(Socket, F_SETFL, Options|O_NONBLOCK);
- }
- else
- {
- fcntl(Socket, F_SETFL, Options&(~O_NONBLOCK));
- }
-#endif
-}
-#endif
-
-void MicroProfileWebServerStart()
-{
-#ifdef _WIN32
- WSADATA wsa;
- if(WSAStartup(MAKEWORD(2, 2), &wsa))
- {
- S.ListenerSocket = -1;
- return;
- }
-#endif
-
- S.ListenerSocket = socket(PF_INET, SOCK_STREAM, 6);
- MP_ASSERT(!MP_INVALID_SOCKET(S.ListenerSocket));
- MicroProfileSetNonBlocking(S.ListenerSocket, 1);
-
- S.nWebServerPort = (uint32_t)-1;
- struct sockaddr_in Addr;
- Addr.sin_family = AF_INET;
- Addr.sin_addr.s_addr = INADDR_ANY;
- for(int i = 0; i < 20; ++i)
- {
- Addr.sin_port = htons(MICROPROFILE_WEBSERVER_PORT+i);
- if(0 == bind(S.ListenerSocket, (sockaddr*)&Addr, sizeof(Addr)))
- {
- S.nWebServerPort = MICROPROFILE_WEBSERVER_PORT+i;
- break;
- }
- }
- listen(S.ListenerSocket, 8);
-}
-
-void MicroProfileWebServerStop()
-{
-#ifdef _WIN32
- closesocket(S.ListenerSocket);
- WSACleanup();
-#else
- close(S.ListenerSocket);
-#endif
-}
-
-int MicroProfileParseGet(const char* pGet)
-{
- const char* pStart = pGet;
- while(*pGet != '\0')
- {
- if(*pGet < '0' || *pGet > '9')
- return 0;
- pGet++;
- }
- int nFrames = atoi(pStart);
- if(nFrames)
- {
- return nFrames;
- }
- else
- {
- return MICROPROFILE_WEBSERVER_MAXFRAMES;
- }
-}
-bool MicroProfileWebServerUpdate()
-{
- MICROPROFILE_SCOPEI("MicroProfile", "Webserver-update", -1);
- MpSocket Connection = accept(S.ListenerSocket, 0, 0);
- bool bServed = false;
- if(!MP_INVALID_SOCKET(Connection))
- {
- std::lock_guard Lock(MicroProfileMutex());
- char Req[8192];
- MicroProfileSetNonBlocking(Connection, 0);
- int nReceived = recv(Connection, Req, sizeof(Req)-1, 0);
- if(nReceived > 0)
- {
- Req[nReceived] = '\0';
-#if MICROPROFILE_MINIZ
-#define MICROPROFILE_HTML_HEADER "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nContent-Encoding: deflate\r\nExpires: Tue, 01 Jan 2199 16:00:00 GMT\r\n\r\n"
-#else
-#define MICROPROFILE_HTML_HEADER "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nExpires: Tue, 01 Jan 2199 16:00:00 GMT\r\n\r\n"
-#endif
- char* pHttp = strstr(Req, "HTTP/");
- char* pGet = strstr(Req, "GET /");
- char* pHost = strstr(Req, "Host: ");
- auto Terminate = [](char* pString)
- {
- char* pEnd = pString;
- while(*pEnd != '\0')
- {
- if(*pEnd == '\r' || *pEnd == '\n' || *pEnd == ' ')
- {
- *pEnd = '\0';
- return;
- }
- pEnd++;
- }
- };
- if(pHost)
- {
- pHost += sizeof("Host: ")-1;
- Terminate(pHost);
- }
-
- if(pHttp && pGet)
- {
- *pHttp = '\0';
- pGet += sizeof("GET /")-1;
- Terminate(pGet);
- int nFrames = MicroProfileParseGet(pGet);
- if(nFrames)
- {
- uint64_t nTickStart = MP_TICK();
- send(Connection, MICROPROFILE_HTML_HEADER, sizeof(MICROPROFILE_HTML_HEADER)-1, 0);
- uint64_t nDataStart = S.nWebServerDataSent;
- S.WebServerPut = 0;
- #if 0 == MICROPROFILE_MINIZ
- MicroProfileDumpHtml(MicroProfileWriteSocket, &Connection, nFrames, pHost);
- uint64_t nDataEnd = S.nWebServerDataSent;
- uint64_t nTickEnd = MP_TICK();
- uint64_t nDiff = (nTickEnd - nTickStart);
- float fMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu()) * nDiff;
- int nKb = ((nDataEnd-nDataStart)>>10) + 1;
- int nCompressedKb = nKb;
- MicroProfilePrintf(MicroProfileWriteSocket, &Connection, "\n\n\n",nKb, fMs);
- MicroProfileFlushSocket(Connection);
- #else
- MicroProfileCompressedSocketState CompressState;
- MicroProfileCompressedSocketStart(&CompressState, Connection);
- MicroProfileDumpHtml(MicroProfileCompressedWriteSocket, &CompressState, nFrames, pHost);
- S.nWebServerDataSent += CompressState.nSize;
- uint64_t nDataEnd = S.nWebServerDataSent;
- uint64_t nTickEnd = MP_TICK();
- uint64_t nDiff = (nTickEnd - nTickStart);
- float fMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu()) * nDiff;
- int nKb = ((nDataEnd-nDataStart)>>10) + 1;
- int nCompressedKb = ((CompressState.nCompressedSize)>>10) + 1;
- MicroProfilePrintf(MicroProfileCompressedWriteSocket, &CompressState, "\n\n\n", nKb, nCompressedKb, fMs);
- MicroProfileCompressedSocketFinish(&CompressState);
- MicroProfileFlushSocket(Connection);
- #endif
-
- #if MICROPROFILE_DEBUG
- printf("\n\n\n", nKb, nCompressedKb, fMs);
- #endif
- }
- }
- }
-#ifdef _WIN32
- closesocket(Connection);
-#else
- close(Connection);
-#endif
- }
- return bServed;
-}
-#endif
-
-
-
-
-#if MICROPROFILE_CONTEXT_SWITCH_TRACE
-//functions that need to be implemented per platform.
-void* MicroProfileTraceThread(void* unused);
-bool MicroProfileIsLocalThread(uint32_t nThreadId);
-
-
-void MicroProfileStartContextSwitchTrace()
-{
- if(!S.bContextSwitchRunning)
- {
- S.bContextSwitchRunning = true;
- S.bContextSwitchStop = false;
- MicroProfileThreadStart(&S.ContextSwitchThread, MicroProfileTraceThread);
- }
-}
-
-void MicroProfileStopContextSwitchTrace()
-{
- if(S.bContextSwitchRunning)
- {
- S.bContextSwitchStop = true;
- MicroProfileThreadJoin(&S.ContextSwitchThread);
- }
-}
-
-
-#ifdef _WIN32
-#define INITGUID
-#include
-#include
-#include
-
-
-static GUID g_MicroProfileThreadClassGuid = { 0x3d6fa8d1, 0xfe05, 0x11d0, 0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c };
-
-struct MicroProfileSCSwitch
-{
- uint32_t NewThreadId;
- uint32_t OldThreadId;
- int8_t NewThreadPriority;
- int8_t OldThreadPriority;
- uint8_t PreviousCState;
- int8_t SpareByte;
- int8_t OldThreadWaitReason;
- int8_t OldThreadWaitMode;
- int8_t OldThreadState;
- int8_t OldThreadWaitIdealProcessor;
- uint32_t NewThreadWaitTime;
- uint32_t Reserved;
-};
-
-
-VOID WINAPI MicroProfileContextSwitchCallback(PEVENT_TRACE pEvent)
-{
- if (pEvent->Header.Guid == g_MicroProfileThreadClassGuid)
- {
- if (pEvent->Header.Class.Type == 36)
- {
- MicroProfileSCSwitch* pCSwitch = (MicroProfileSCSwitch*) pEvent->MofData;
- if ((pCSwitch->NewThreadId != 0) || (pCSwitch->OldThreadId != 0))
- {
- MicroProfileContextSwitch Switch;
- Switch.nThreadOut = pCSwitch->OldThreadId;
- Switch.nThreadIn = pCSwitch->NewThreadId;
- Switch.nCpu = pEvent->BufferContext.ProcessorNumber;
- Switch.nTicks = pEvent->Header.TimeStamp.QuadPart;
- MicroProfileContextSwitchPut(&Switch);
- }
- }
- }
-}
-
-ULONG WINAPI MicroProfileBufferCallback(PEVENT_TRACE_LOGFILE Buffer)
-{
- return (S.bContextSwitchStop || !S.bContextSwitchRunning) ? FALSE : TRUE;
-}
-
-
-struct MicroProfileKernelTraceProperties : public EVENT_TRACE_PROPERTIES
-{
- char dummy[sizeof(KERNEL_LOGGER_NAME)];
-};
-
-void MicroProfileContextSwitchShutdownTrace()
-{
- TRACEHANDLE SessionHandle = 0;
- MicroProfileKernelTraceProperties sessionProperties;
-
- ZeroMemory(&sessionProperties, sizeof(sessionProperties));
- sessionProperties.Wnode.BufferSize = sizeof(sessionProperties);
- sessionProperties.Wnode.Flags = WNODE_FLAG_TRACED_GUID;
- sessionProperties.Wnode.ClientContext = 1; //QPC clock resolution
- sessionProperties.Wnode.Guid = SystemTraceControlGuid;
- sessionProperties.BufferSize = 1;
- sessionProperties.NumberOfBuffers = 128;
- sessionProperties.EnableFlags = EVENT_TRACE_FLAG_CSWITCH;
- sessionProperties.LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
- sessionProperties.MaximumFileSize = 0;
- sessionProperties.LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
- sessionProperties.LogFileNameOffset = 0;
-
- EVENT_TRACE_LOGFILE log;
- ZeroMemory(&log, sizeof(log));
- log.LoggerName = KERNEL_LOGGER_NAME;
- log.ProcessTraceMode = 0;
- TRACEHANDLE hLog = OpenTrace(&log);
- if (hLog)
- {
- ControlTrace(SessionHandle, KERNEL_LOGGER_NAME, &sessionProperties, EVENT_TRACE_CONTROL_STOP);
- }
- CloseTrace(hLog);
-
-
-}
-
-void* MicroProfileTraceThread(void* unused)
-{
-
- MicroProfileContextSwitchShutdownTrace();
- ULONG status = ERROR_SUCCESS;
- TRACEHANDLE SessionHandle = 0;
- MicroProfileKernelTraceProperties sessionProperties;
-
- ZeroMemory(&sessionProperties, sizeof(sessionProperties));
- sessionProperties.Wnode.BufferSize = sizeof(sessionProperties);
- sessionProperties.Wnode.Flags = WNODE_FLAG_TRACED_GUID;
- sessionProperties.Wnode.ClientContext = 1; //QPC clock resolution
- sessionProperties.Wnode.Guid = SystemTraceControlGuid;
- sessionProperties.BufferSize = 1;
- sessionProperties.NumberOfBuffers = 128;
- sessionProperties.EnableFlags = EVENT_TRACE_FLAG_CSWITCH|EVENT_TRACE_FLAG_PROCESS;
- sessionProperties.LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
- sessionProperties.MaximumFileSize = 0;
- sessionProperties.LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
- sessionProperties.LogFileNameOffset = 0;
-
-
- status = StartTrace((PTRACEHANDLE) &SessionHandle, KERNEL_LOGGER_NAME, &sessionProperties);
-
- if (ERROR_SUCCESS != status)
- {
- S.bContextSwitchRunning = false;
- return 0;
- }
-
- EVENT_TRACE_LOGFILE log;
- ZeroMemory(&log, sizeof(log));
-
- log.LoggerName = KERNEL_LOGGER_NAME;
- log.ProcessTraceMode = PROCESS_TRACE_MODE_REAL_TIME | PROCESS_TRACE_MODE_RAW_TIMESTAMP;
- log.EventCallback = MicroProfileContextSwitchCallback;
- log.BufferCallback = MicroProfileBufferCallback;
-
- TRACEHANDLE hLog = OpenTrace(&log);
- ProcessTrace(&hLog, 1, 0, 0);
- CloseTrace(hLog);
- MicroProfileContextSwitchShutdownTrace();
-
- S.bContextSwitchRunning = false;
- return 0;
-}
-
-bool MicroProfileIsLocalThread(uint32_t nThreadId)
-{
- HANDLE h = OpenThread(THREAD_QUERY_LIMITED_INFORMATION, FALSE, nThreadId);
- if(h == NULL)
- return false;
- DWORD hProcess = GetProcessIdOfThread(h);
- CloseHandle(h);
- return GetCurrentProcessId() == hProcess;
-}
-
-#elif defined(__APPLE__)
-#include
-void* MicroProfileTraceThread(void* unused)
-{
- FILE* pFile = fopen("mypipe", "r");
- if(!pFile)
- {
- printf("CONTEXT SWITCH FAILED TO OPEN FILE: make sure to run dtrace script\n");
- S.bContextSwitchRunning = false;
- return 0;
- }
- printf("STARTING TRACE THREAD\n");
- char* pLine = 0;
- size_t cap = 0;
- size_t len = 0;
- struct timeval tv;
-
- gettimeofday(&tv, NULL);
-
- uint64_t nsSinceEpoch = ((uint64_t)(tv.tv_sec) * 1000000 + (uint64_t)(tv.tv_usec)) * 1000;
- uint64_t nTickEpoch = MP_TICK();
- uint32_t nLastThread[MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS] = {0};
- mach_timebase_info_data_t sTimebaseInfo;
- mach_timebase_info(&sTimebaseInfo);
- S.bContextSwitchRunning = true;
-
- uint64_t nProcessed = 0;
- uint64_t nProcessedLast = 0;
- while((len = getline(&pLine, &cap, pFile))>0 && !S.bContextSwitchStop)
- {
- nProcessed += len;
- if(nProcessed - nProcessedLast > 10<<10)
- {
- nProcessedLast = nProcessed;
- printf("processed %llukb %llukb\n", (nProcessed-nProcessedLast)>>10,nProcessed >>10);
- }
-
- char* pX = strchr(pLine, 'X');
- if(pX)
- {
- int cpu = atoi(pX+1);
- char* pX2 = strchr(pX + 1, 'X');
- char* pX3 = strchr(pX2 + 1, 'X');
- int thread = atoi(pX2+1);
- char* lala;
- int64_t timestamp = strtoll(pX3 + 1, &lala, 10);
- MicroProfileContextSwitch Switch;
-
- //convert to ticks.
- uint64_t nDeltaNsSinceEpoch = timestamp - nsSinceEpoch;
- uint64_t nDeltaTickSinceEpoch = sTimebaseInfo.numer * nDeltaNsSinceEpoch / sTimebaseInfo.denom;
- uint64_t nTicks = nDeltaTickSinceEpoch + nTickEpoch;
- if(cpu < MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS)
- {
- Switch.nThreadOut = nLastThread[cpu];
- Switch.nThreadIn = thread;
- nLastThread[cpu] = thread;
- Switch.nCpu = cpu;
- Switch.nTicks = nTicks;
- MicroProfileContextSwitchPut(&Switch);
- }
- }
- }
- printf("EXITING TRACE THREAD\n");
- S.bContextSwitchRunning = false;
- return 0;
-}
-
-bool MicroProfileIsLocalThread(uint32_t nThreadId)
-{
- return false;
-}
-
-#endif
-#else
-
-bool MicroProfileIsLocalThread(uint32_t nThreadId){return false;}
-void MicroProfileStopContextSwitchTrace(){}
-void MicroProfileStartContextSwitchTrace(){}
-
-#endif
-
-
-
-
-#if MICROPROFILE_GPU_TIMERS_D3D11
-uint32_t MicroProfileGpuInsertTimeStamp()
-{
- MicroProfileD3D11Frame& Frame = S.GPU.m_QueryFrames[S.GPU.m_nQueryFrame];
- if(Frame.m_nRateQueryStarted)
- {
- uint32_t nCurrent = (Frame.m_nQueryStart + Frame.m_nQueryCount) % MICROPROFILE_D3D_MAX_QUERIES;
- uint32_t nNext = (nCurrent + 1) % MICROPROFILE_D3D_MAX_QUERIES;
- if(nNext != S.GPU.m_nQueryGet)
- {
- Frame.m_nQueryCount++;
- ID3D11Query* pQuery = (ID3D11Query*)S.GPU.m_pQueries[nCurrent];
- ID3D11DeviceContext* pContext = (ID3D11DeviceContext*)S.GPU.m_pDeviceContext;
- pContext->End(pQuery);
- S.GPU.m_nQueryPut = nNext;
- return nCurrent;
- }
- }
- return (uint32_t)-1;
-}
-
-uint64_t MicroProfileGpuGetTimeStamp(uint32_t nIndex)
-{
- if(nIndex == (uint32_t)-1)
- {
- return (uint64_t)-1;
- }
- int64_t nResult = S.GPU.m_nQueryResults[nIndex];
- MP_ASSERT(nResult != -1);
- return nResult;
-}
-
-bool MicroProfileGpuGetData(void* pQuery, void* pData, uint32_t nDataSize)
-{
- HRESULT hr;
- do
- {
- hr = ((ID3D11DeviceContext*)S.GPU.m_pDeviceContext)->GetData((ID3D11Query*)pQuery, pData, nDataSize, 0);
- }while(hr == S_FALSE);
- switch(hr)
- {
- case DXGI_ERROR_DEVICE_REMOVED:
- case DXGI_ERROR_INVALID_CALL:
- case E_INVALIDARG:
- MP_BREAK();
- return false;
-
- }
- return true;
-}
-
-uint64_t MicroProfileTicksPerSecondGpu()
-{
- return S.GPU.m_nQueryFrequency;
-}
-
-void MicroProfileGpuFlip()
-{
- MicroProfileD3D11Frame& CurrentFrame = S.GPU.m_QueryFrames[S.GPU.m_nQueryFrame];
- ID3D11DeviceContext* pContext = (ID3D11DeviceContext*)S.GPU.m_pDeviceContext;
- if(CurrentFrame.m_nRateQueryStarted)
- {
- pContext->End((ID3D11Query*)CurrentFrame.m_pRateQuery);
- }
- uint32_t nNextFrame = (S.GPU.m_nQueryFrame + 1) % MICROPROFILE_GPU_FRAME_DELAY;
- MicroProfileD3D11Frame& OldFrame = S.GPU.m_QueryFrames[nNextFrame];
- if(OldFrame.m_nRateQueryStarted)
- {
- struct RateQueryResult
- {
- uint64_t nFrequency;
- BOOL bDisjoint;
- };
- RateQueryResult Result;
- if(MicroProfileGpuGetData(OldFrame.m_pRateQuery, &Result, sizeof(Result)))
- {
- if(S.GPU.m_nQueryFrequency != (int64_t)Result.nFrequency)
- {
- if(S.GPU.m_nQueryFrequency)
- {
- OutputDebugString("Query freq changing");
- }
- S.GPU.m_nQueryFrequency = Result.nFrequency;
- }
- uint32_t nStart = OldFrame.m_nQueryStart;
- uint32_t nCount = OldFrame.m_nQueryCount;
- for(uint32_t i = 0; i < nCount; ++i)
- {
- uint32_t nIndex = (i + nStart) % MICROPROFILE_D3D_MAX_QUERIES;
-
-
-
- if(!MicroProfileGpuGetData(S.GPU.m_pQueries[nIndex], &S.GPU.m_nQueryResults[nIndex], sizeof(uint64_t)))
- {
- S.GPU.m_nQueryResults[nIndex] = -1;
- }
- }
- }
- else
- {
- uint32_t nStart = OldFrame.m_nQueryStart;
- uint32_t nCount = OldFrame.m_nQueryCount;
- for(uint32_t i = 0; i < nCount; ++i)
- {
- uint32_t nIndex = (i + nStart) % MICROPROFILE_D3D_MAX_QUERIES;
- S.GPU.m_nQueryResults[nIndex] = -1;
- }
- }
- S.GPU.m_nQueryGet = (OldFrame.m_nQueryStart + OldFrame.m_nQueryCount) % MICROPROFILE_D3D_MAX_QUERIES;
- }
-
- S.GPU.m_nQueryFrame = nNextFrame;
- MicroProfileD3D11Frame& NextFrame = S.GPU.m_QueryFrames[nNextFrame];
- pContext->Begin((ID3D11Query*)NextFrame.m_pRateQuery);
- NextFrame.m_nQueryStart = S.GPU.m_nQueryPut;
- NextFrame.m_nQueryCount = 0;
-
- NextFrame.m_nRateQueryStarted = 1;
-}
-
-void MicroProfileGpuInitD3D11(void* pDevice_, void* pDeviceContext_)
-{
- ID3D11Device* pDevice = (ID3D11Device*)pDevice_;
- ID3D11DeviceContext* pDeviceContext = (ID3D11DeviceContext*)pDeviceContext_;
- S.GPU.m_pDeviceContext = pDeviceContext_;
-
- D3D11_QUERY_DESC Desc;
- Desc.MiscFlags = 0;
- Desc.Query = D3D11_QUERY_TIMESTAMP;
- for(uint32_t i = 0; i < MICROPROFILE_D3D_MAX_QUERIES; ++i)
- {
- HRESULT hr = pDevice->CreateQuery(&Desc, (ID3D11Query**)&S.GPU.m_pQueries[i]);
- MP_ASSERT(hr == S_OK);
- S.GPU.m_nQueryResults[i] = -1;
- }
- S.GPU.m_nQueryPut = 0;
- S.GPU.m_nQueryGet = 0;
- S.GPU.m_nQueryFrame = 0;
- S.GPU.m_nQueryFrequency = 0;
- Desc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT;
- for(uint32_t i = 0; i < MICROPROFILE_GPU_FRAME_DELAY; ++i)
- {
- S.GPU.m_QueryFrames[i].m_nQueryStart = 0;
- S.GPU.m_QueryFrames[i].m_nQueryCount = 0;
- S.GPU.m_QueryFrames[i].m_nRateQueryStarted = 0;
- HRESULT hr = pDevice->CreateQuery(&Desc, (ID3D11Query**)&S.GPU.m_QueryFrames[i].m_pRateQuery);
- MP_ASSERT(hr == S_OK);
- }
-}
-
-
-void MicroProfileGpuShutdown()
-{
- for(uint32_t i = 0; i < MICROPROFILE_D3D_MAX_QUERIES; ++i)
- {
- ((ID3D11Query*)&S.GPU.m_pQueries[i])->Release();
- S.GPU.m_pQueries[i] = 0;
- }
- for(uint32_t i = 0; i < MICROPROFILE_GPU_FRAME_DELAY; ++i)
- {
- ((ID3D11Query*)S.GPU.m_QueryFrames[i].m_pRateQuery)->Release();
- S.GPU.m_QueryFrames[i].m_pRateQuery = 0;
- }
-}
-
-int MicroProfileGetGpuTickReference(int64_t* pOutCPU, int64_t* pOutGpu)
-{
- return 0;
-}
-
-
-#elif MICROPROFILE_GPU_TIMERS_GL
-void MicroProfileGpuInitGL()
-{
- S.GPU.GLTimerPos = 0;
- glGenQueries(MICROPROFILE_GL_MAX_QUERIES, &S.GPU.GLTimers[0]);
-}
-
-uint32_t MicroProfileGpuInsertTimeStamp()
-{
- uint32_t nIndex = (S.GPU.GLTimerPos+1)%MICROPROFILE_GL_MAX_QUERIES;
- glQueryCounter(S.GPU.GLTimers[nIndex], GL_TIMESTAMP);
- S.GPU.GLTimerPos = nIndex;
- return nIndex;
-}
-uint64_t MicroProfileGpuGetTimeStamp(uint32_t nKey)
-{
- uint64_t result;
- glGetQueryObjectui64v(S.GPU.GLTimers[nKey], GL_QUERY_RESULT, &result);
- return result;
-}
-
-uint64_t MicroProfileTicksPerSecondGpu()
-{
- return 1000000000ll;
-}
-
-int MicroProfileGetGpuTickReference(int64_t* pOutCpu, int64_t* pOutGpu)
-{
- int64_t nGpuTimeStamp;
- glGetInteger64v(GL_TIMESTAMP, &nGpuTimeStamp);
- if(nGpuTimeStamp)
- {
- *pOutCpu = MP_TICK();
- *pOutGpu = nGpuTimeStamp;
- #if 0 //debug test if timestamp diverges
- static int64_t nTicksPerSecondCpu = MicroProfileTicksPerSecondCpu();
- static int64_t nTicksPerSecondGpu = MicroProfileTicksPerSecondGpu();
- static int64_t nGpuStart = 0;
- static int64_t nCpuStart = 0;
- if(!nCpuStart)
- {
- nCpuStart = *pOutCpu;
- nGpuStart = *pOutGpu;
- }
- static int nCountDown = 100;
- if(0 == nCountDown--)
- {
- int64_t nCurCpu = *pOutCpu;
- int64_t nCurGpu = *pOutGpu;
- double fDistanceCpu = (nCurCpu - nCpuStart) / (double)nTicksPerSecondCpu;
- double fDistanceGpu = (nCurGpu - nGpuStart) / (double)nTicksPerSecondGpu;
-
- char buf[254];
- snprintf(buf, sizeof(buf)-1,"Distance %f %f diff %f\n", fDistanceCpu, fDistanceGpu, fDistanceCpu-fDistanceGpu);
- OutputDebugString(buf);
- nCountDown = 100;
- }
- #endif
- return 1;
- }
- return 0;
-}
-
-
-#endif
-
-#undef S
-
-#ifdef _WIN32
-#pragma warning(pop)
-#endif
-
-
-
-
-
-#endif
-#endif
-#ifdef MICROPROFILE_EMBED_HTML
-#include "microprofile_html.h"
-#endif
diff --git a/deps/microprofile/microprofile/microprofileui.h b/deps/microprofile/microprofile/microprofileui.h
deleted file mode 100644
index af3bc1a4..00000000
--- a/deps/microprofile/microprofile/microprofileui.h
+++ /dev/null
@@ -1,3512 +0,0 @@
-#pragma once
-// This is free and unencumbered software released into the public domain.
-// Anyone is free to copy, modify, publish, use, compile, sell, or
-// distribute this software, either in source code form or as a compiled
-// binary, for any purpose, commercial or non-commercial, and by any
-// means.
-// In jurisdictions that recognize copyright laws, the author or authors
-// of this software dedicate any and all copyright interest in the
-// software to the public domain. We make this dedication for the benefit
-// of the public at large and to the detriment of our heirs and
-// successors. We intend this dedication to be an overt act of
-// relinquishment in perpetuity of all present and future rights to this
-// software under copyright law.
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-// For more information, please refer to
-//
-// ***********************************************************************
-//
-//
-//
-
-
-#ifndef MICROPROFILE_ENABLED
-#error "microprofile.h must be included before including microprofileui.h"
-#endif
-
-#ifndef MICROPROFILEUI_ENABLED
-#define MICROPROFILEUI_ENABLED MICROPROFILE_ENABLED
-#endif
-
-#ifndef MICROPROFILEUI_API
-#define MICROPROFILEUI_API
-#endif
-
-
-#if 0 == MICROPROFILEUI_ENABLED
-#define MicroProfileMouseButton(foo, bar) do{}while(0)
-#define MicroProfileMousePosition(foo, bar, z) do{}while(0)
-#define MicroProfileModKey(key) do{}while(0)
-#define MicroProfileDraw(foo, bar) do{}while(0)
-#define MicroProfileIsDrawing() 0
-#define MicroProfileToggleDisplayMode() do{}while(0)
-#define MicroProfileSetDisplayMode(f) do{}while(0)
-#else
-
-#ifndef MICROPROFILE_DRAWCURSOR
-#define MICROPROFILE_DRAWCURSOR 0
-#endif
-
-#ifndef MICROPROFILE_DETAILED_BAR_NAMES
-#define MICROPROFILE_DETAILED_BAR_NAMES 1
-#endif
-
-#ifndef MICROPROFILE_TEXT_WIDTH
-#define MICROPROFILE_TEXT_WIDTH 5
-#endif
-
-#ifndef MICROPROFILE_TEXT_HEIGHT
-#define MICROPROFILE_TEXT_HEIGHT 8
-#endif
-
-#ifndef MICROPROFILE_DETAILED_BAR_HEIGHT
-#define MICROPROFILE_DETAILED_BAR_HEIGHT 12
-#endif
-
-#ifndef MICROPROFILE_DETAILED_CONTEXT_SWITCH_HEIGHT
-#define MICROPROFILE_DETAILED_CONTEXT_SWITCH_HEIGHT 7
-#endif
-
-#ifndef MICROPROFILE_GRAPH_WIDTH
-#define MICROPROFILE_GRAPH_WIDTH 256
-#endif
-
-#ifndef MICROPROFILE_GRAPH_HEIGHT
-#define MICROPROFILE_GRAPH_HEIGHT 256
-#endif
-
-#ifndef MICROPROFILE_BORDER_SIZE
-#define MICROPROFILE_BORDER_SIZE 1
-#endif
-
-#ifndef MICROPROFILE_HELP_LEFT
-#define MICROPROFILE_HELP_LEFT "Left-Click"
-#endif
-
-#ifndef MICROPROFILE_HELP_ALT
-#define MICROPROFILE_HELP_ALT "Alt-Click"
-#endif
-
-#ifndef MICROPROFILE_HELP_MOD
-#define MICROPROFILE_HELP_MOD "Mod"
-#endif
-
-#ifndef MICROPROFILE_BAR_WIDTH
-#define MICROPROFILE_BAR_WIDTH 100
-#endif
-
-#ifndef MICROPROFILE_CUSTOM_MAX
-#define MICROPROFILE_CUSTOM_MAX 8
-#endif
-
-#ifndef MICROPROFILE_CUSTOM_MAX_TIMERS
-#define MICROPROFILE_CUSTOM_MAX_TIMERS 64
-#endif
-
-#ifndef MICROPROFILE_CUSTOM_PADDING
-#define MICROPROFILE_CUSTOM_PADDING 12
-#endif
-
-
-#define MICROPROFILE_FRAME_HISTORY_HEIGHT 50
-#define MICROPROFILE_FRAME_HISTORY_WIDTH 7
-#define MICROPROFILE_FRAME_HISTORY_COLOR_CPU 0xffff7f27 //255 127 39
-#define MICROPROFILE_FRAME_HISTORY_COLOR_GPU 0xff37a0ee //55 160 238
-#define MICROPROFILE_FRAME_HISTORY_COLOR_HIGHTLIGHT 0x7733bb44
-#define MICROPROFILE_FRAME_COLOR_HIGHTLIGHT 0x20009900
-#define MICROPROFILE_FRAME_COLOR_HIGHTLIGHT_GPU 0x20996600
-#define MICROPROFILE_NUM_FRAMES (MICROPROFILE_MAX_FRAME_HISTORY - (MICROPROFILE_GPU_FRAME_DELAY+1))
-
-#define MICROPROFILE_TOOLTIP_MAX_STRINGS (32 + MICROPROFILE_MAX_GROUPS*2)
-#define MICROPROFILE_TOOLTIP_STRING_BUFFER_SIZE (4*1024)
-#define MICROPROFILE_TOOLTIP_MAX_LOCKED 3
-
-#define MICROPROFILE_COUNTER_INDENT 4
-#define MICROPROFILE_COUNTER_WIDTH 100
-
-
-
-enum
-{
- MICROPROFILE_CUSTOM_BARS = 0x1,
- MICROPROFILE_CUSTOM_BAR_SOURCE_MAX = 0x2,
- MICROPROFILE_CUSTOM_BAR_SOURCE_AVG = 0,
- MICROPROFILE_CUSTOM_STACK = 0x4,
- MICROPROFILE_CUSTOM_STACK_SOURCE_MAX = 0x8,
- MICROPROFILE_CUSTOM_STACK_SOURCE_AVG = 0,
-};
-
-
-MICROPROFILEUI_API void MicroProfileDraw(uint32_t nWidth, uint32_t nHeight); //! call if drawing microprofilers
-MICROPROFILEUI_API bool MicroProfileIsDrawing();
-MICROPROFILEUI_API void MicroProfileToggleGraph(MicroProfileToken nToken);
-MICROPROFILEUI_API bool MicroProfileDrawGraph(uint32_t nScreenWidth, uint32_t nScreenHeight);
-MICROPROFILEUI_API void MicroProfileToggleDisplayMode(); //switch between off, bars, detailed
-MICROPROFILEUI_API void MicroProfileSetDisplayMode(int); //switch between off, bars, detailed
-MICROPROFILEUI_API void MicroProfileClearGraph();
-MICROPROFILEUI_API void MicroProfileMousePosition(uint32_t nX, uint32_t nY, int nWheelDelta);
-MICROPROFILEUI_API void MicroProfileModKey(uint32_t nKeyState);
-MICROPROFILEUI_API void MicroProfileMouseButton(uint32_t nLeft, uint32_t nRight);
-MICROPROFILEUI_API void MicroProfileDrawLineVertical(int nX, int nTop, int nBottom, uint32_t nColor);
-MICROPROFILEUI_API void MicroProfileDrawLineHorizontal(int nLeft, int nRight, int nY, uint32_t nColor);
-MICROPROFILEUI_API void MicroProfileLoadPreset(const char* pSuffix);
-MICROPROFILEUI_API void MicroProfileSavePreset(const char* pSuffix);
-
-MICROPROFILEUI_API void MicroProfileDrawText(int nX, int nY, uint32_t nColor, const char* pText, uint32_t nNumCharacters);
-MICROPROFILEUI_API void MicroProfileDrawBox(int nX, int nY, int nX1, int nY1, uint32_t nColor, MicroProfileBoxType = MicroProfileBoxTypeFlat);
-MICROPROFILEUI_API void MicroProfileDrawLine2D(uint32_t nVertices, float* pVertices, uint32_t nColor);
-MICROPROFILEUI_API void MicroProfileDumpTimers();
-
-MICROPROFILEUI_API void MicroProfileInitUI();
-
-MICROPROFILEUI_API void MicroProfileCustomGroupToggle(const char* pCustomName);
-MICROPROFILEUI_API void MicroProfileCustomGroupEnable(const char* pCustomName);
-MICROPROFILEUI_API void MicroProfileCustomGroupEnable(uint32_t nIndex);
-MICROPROFILEUI_API void MicroProfileCustomGroupDisable();
-MICROPROFILEUI_API void MicroProfileCustomGroup(const char* pCustomName, uint32_t nMaxTimers, uint32_t nAggregateFlip, float fReferenceTime, uint32_t nFlags);
-MICROPROFILEUI_API void MicroProfileCustomGroupAddTimer(const char* pCustomName, const char* pGroup, const char* pTimer);
-
-#ifdef MICROPROFILEUI_IMPL
-#ifdef _WIN32
-#define snprintf _snprintf
-#endif
-#include
-#include
-#include
-#include
-#include
-
-MICROPROFILE_DEFINE(g_MicroProfileDetailed, "MicroProfile", "Detailed View", 0x8888000);
-MICROPROFILE_DEFINE(g_MicroProfileDrawGraph, "MicroProfile", "Draw Graph", 0xff44ee00);
-MICROPROFILE_DEFINE(g_MicroProfileDrawBarView, "MicroProfile", "DrawBarView", 0x00dd77);
-MICROPROFILE_DEFINE(g_MicroProfileDraw,"MicroProfile", "Draw", 0x737373);
-
-
-struct MicroProfileStringArray
-{
- const char* ppStrings[MICROPROFILE_TOOLTIP_MAX_STRINGS];
- char Buffer[MICROPROFILE_TOOLTIP_STRING_BUFFER_SIZE];
- char* pBufferPos;
- uint32_t nNumStrings;
-};
-
-struct MicroProfileGroupMenuItem
-{
- uint32_t nIsCategory;
- uint32_t nCategoryIndex;
- uint32_t nIndex;
- const char* pName;
-};
-
-struct MicroProfileCustom
-{
- char pName[MICROPROFILE_NAME_MAX_LEN];
- uint32_t nFlags;
- uint32_t nAggregateFlip;
- uint32_t nNumTimers;
- uint32_t nMaxTimers;
- uint64_t nGroupMask;
- float fReference;
- uint64_t* pTimers;
-};
-
-struct SOptionDesc
-{
- SOptionDesc(){}
- SOptionDesc(uint8_t nSubType, uint8_t nIndex, const char* fmt, ...):nSubType(nSubType), nIndex(nIndex)
- {
- va_list args;
- va_start (args, fmt);
- vsprintf(Text, fmt, args);
- va_end(args);
- }
- char Text[32];
- uint8_t nSubType;
- uint8_t nIndex;
- bool bSelected;
-};
-static uint32_t g_MicroProfileAggregatePresets[] = {0, 10, 20, 30, 60, 120};
-static float g_MicroProfileReferenceTimePresets[] = {5.f, 10.f, 15.f,20.f, 33.33f, 66.66f, 100.f, 250.f, 500.f, 1000.f};
-static uint32_t g_MicroProfileOpacityPresets[] = {0x40, 0x80, 0xc0, 0xff};
-static const char* g_MicroProfilePresetNames[] =
-{
- MICROPROFILE_DEFAULT_PRESET,
- "Render",
- "GPU",
- "Lighting",
- "AI",
- "Visibility",
- "Sound",
-};
-
-enum
-{
- MICROPROFILE_NUM_REFERENCE_PRESETS = sizeof(g_MicroProfileReferenceTimePresets)/sizeof(g_MicroProfileReferenceTimePresets[0]),
- MICROPROFILE_NUM_OPACITY_PRESETS = sizeof(g_MicroProfileOpacityPresets)/sizeof(g_MicroProfileOpacityPresets[0]),
-#if MICROPROFILE_CONTEXT_SWITCH_TRACE
- MICROPROFILE_OPTION_SIZE = MICROPROFILE_NUM_REFERENCE_PRESETS + MICROPROFILE_NUM_OPACITY_PRESETS * 2 + 2 + 7,
-#else
- MICROPROFILE_OPTION_SIZE = MICROPROFILE_NUM_REFERENCE_PRESETS + MICROPROFILE_NUM_OPACITY_PRESETS * 2 + 2 + 3,
-#endif
-};
-
-struct MicroProfileUI
-{
- //menu/mouse over stuff
- uint64_t nHoverToken;
- int64_t nHoverTime;
- int nHoverFrame;
-#if MICROPROFILE_DEBUG
- uint64_t nHoverAddressEnter;
- uint64_t nHoverAddressLeave;
-#endif
-
- uint32_t nWidth;
- uint32_t nHeight;
-
- int nOffsetX[MP_DRAW_SIZE];
- int nOffsetY[MP_DRAW_SIZE];
-
- float fDetailedOffset; //display offset relative to start of latest displayable frame.
- float fDetailedRange; //no. of ms to display
- float fDetailedOffsetTarget;
- float fDetailedRangeTarget;
- uint32_t nOpacityBackground;
- uint32_t nOpacityForeground;
- bool bShowSpikes;
-
-
-
- uint32_t nMouseX;
- uint32_t nMouseY;
- uint32_t nMouseDownX;
- uint32_t nMouseDownY;
- int nMouseWheelDelta;
- uint32_t nMouseDownLeft;
- uint32_t nMouseDownRight;
- uint32_t nMouseLeft;
- uint32_t nMouseRight;
- uint32_t nMouseLeftMod;
- uint32_t nMouseRightMod;
- uint32_t nModDown;
- uint32_t nActiveMenu;
-
- MicroProfileLogEntry* pDisplayMouseOver;
-
- int64_t nRangeBegin;
- int64_t nRangeEnd;
- int64_t nRangeBeginGpu;
- int64_t nRangeEndGpu;
- uint32_t nRangeBeginIndex;
- uint32_t nRangeEndIndex;
- MicroProfileThreadLog* pRangeLog;
- uint32_t nHoverColor;
- uint32_t nHoverColorShared;
-
- MicroProfileStringArray LockedToolTips[MICROPROFILE_TOOLTIP_MAX_LOCKED];
- uint32_t nLockedToolTipColor[MICROPROFILE_TOOLTIP_MAX_LOCKED];
- int LockedToolTipFront;
-
- MicroProfileGroupMenuItem GroupMenu[MICROPROFILE_MAX_GROUPS + MICROPROFILE_MAX_CATEGORIES];
- uint32_t GroupMenuCount;
-
-
- uint32_t nCustomActive;
- uint32_t nCustomTimerCount;
- uint32_t nCustomCount;
- MicroProfileCustom Custom[MICROPROFILE_CUSTOM_MAX];
- uint64_t CustomTimer[MICROPROFILE_CUSTOM_MAX_TIMERS];
-
- SOptionDesc Options[MICROPROFILE_OPTION_SIZE];
-
- uint32_t nCounterWidth;
- uint32_t nLimitWidth;
- uint32_t nCounterWidthTemp;
- uint32_t nLimitWidthTemp;
-
-
-};
-
-MicroProfileUI g_MicroProfileUI;
-#define UI g_MicroProfileUI
-static uint32_t g_nMicroProfileBackColors[2] = { 0x474747, 0x313131 };
-#define MICROPROFILE_NUM_CONTEXT_SWITCH_COLORS 16
-static uint32_t g_nMicroProfileContextSwitchThreadColors[MICROPROFILE_NUM_CONTEXT_SWITCH_COLORS] = //palette generated by http://tools.medialab.sciences-po.fr/iwanthue/index.php
-{
- 0x63607B,
- 0x755E2B,
- 0x326A55,
- 0x523135,
- 0x904F42,
- 0x87536B,
- 0x346875,
- 0x5E6046,
- 0x35404C,
- 0x224038,
- 0x413D1E,
- 0x5E3A26,
- 0x5D6161,
- 0x4C6234,
- 0x7D564F,
- 0x5C4352,
-};
-
-
-void MicroProfileInitUI()
-{
- static bool bInitialized = false;
- if(!bInitialized)
- {
- bInitialized = true;
- memset(&g_MicroProfileUI, 0, sizeof(g_MicroProfileUI));
- UI.nActiveMenu = (uint32_t)-1;
- UI.fDetailedOffsetTarget = UI.fDetailedOffset = 0.f;
- UI.fDetailedRangeTarget = UI.fDetailedRange = 50.f;
-
- UI.nOpacityBackground = 0xff<<24;
- UI.nOpacityForeground = 0xff<<24;
-
- UI.bShowSpikes = false;
-
- UI.nWidth = 100;
- UI.nHeight = 100;
-
- UI.nCustomActive = (uint32_t)-1;
- UI.nCustomTimerCount = 0;
- UI.nCustomCount = 0;
-
- int nIndex = 0;
- UI.Options[nIndex++] = SOptionDesc(0xff, 0, "%s", "Reference");
- for(int i = 0; i < MICROPROFILE_NUM_REFERENCE_PRESETS; ++i)
- {
- UI.Options[nIndex++] = SOptionDesc(0, i, " %6.2fms", g_MicroProfileReferenceTimePresets[i]);
- }
- UI.Options[nIndex++] = SOptionDesc(0xff, 0, "%s", "BG Opacity");
- for(int i = 0; i < MICROPROFILE_NUM_OPACITY_PRESETS; ++i)
- {
- UI.Options[nIndex++] = SOptionDesc(1, i, " %7d%%", (i+1)*25);
- }
- UI.Options[nIndex++] = SOptionDesc(0xff, 0, "%s", "FG Opacity");
- for(int i = 0; i < MICROPROFILE_NUM_OPACITY_PRESETS; ++i)
- {
- UI.Options[nIndex++] = SOptionDesc(2, i, " %7d%%", (i+1)*25);
- }
- UI.Options[nIndex++] = SOptionDesc(0xff, 0, "%s", "Spike Display");
- UI.Options[nIndex++] = SOptionDesc(3, 0, "%s", " Enable");
-
-#if MICROPROFILE_CONTEXT_SWITCH_TRACE
- UI.Options[nIndex++] = SOptionDesc(0xff, 0, "%s", "CSwitch Trace");
- UI.Options[nIndex++] = SOptionDesc(4, 0, "%s", " Enable");
- UI.Options[nIndex++] = SOptionDesc(4, 1, "%s", " All Threads");
- UI.Options[nIndex++] = SOptionDesc(4, 2, "%s", " No Bars");
-#endif
- MP_ASSERT(nIndex == MICROPROFILE_OPTION_SIZE);
-
- UI.nCounterWidth = 100;
- UI.nLimitWidth = 100;
- UI.nCounterWidthTemp = 100;
- UI.nLimitWidthTemp = 100;
-
- }
-}
-
-void MicroProfileSetDisplayMode(int nValue)
-{
- MicroProfile& S = *MicroProfileGet();
- nValue = nValue >= 0 && nValue < MP_DRAW_SIZE ? nValue : S.nDisplay;
- S.nDisplay = nValue;
- UI.nOffsetY[S.nDisplay] = 0;
-}
-
-void MicroProfileToggleDisplayMode()
-{
- MicroProfile& S = *MicroProfileGet();
- S.nDisplay = (S.nDisplay + 1) % MP_DRAW_SIZE;
- UI.nOffsetY[S.nDisplay] = 0;
-}
-
-
-void MicroProfileStringArrayClear(MicroProfileStringArray* pArray)
-{
- pArray->nNumStrings = 0;
- pArray->pBufferPos = &pArray->Buffer[0];
-}
-
-void MicroProfileStringArrayAddLiteral(MicroProfileStringArray* pArray, const char* pLiteral)
-{
- MP_ASSERT(pArray->nNumStrings < MICROPROFILE_TOOLTIP_MAX_STRINGS);
- pArray->ppStrings[pArray->nNumStrings++] = pLiteral;
-}
-
-void MicroProfileStringArrayFormat(MicroProfileStringArray* pArray, const char* fmt, ...)
-{
- MP_ASSERT(pArray->nNumStrings < MICROPROFILE_TOOLTIP_MAX_STRINGS);
- pArray->ppStrings[pArray->nNumStrings++] = pArray->pBufferPos;
- va_list args;
- va_start (args, fmt);
- pArray->pBufferPos += 1 + vsprintf(pArray->pBufferPos, fmt, args);
- va_end(args);
- MP_ASSERT(pArray->pBufferPos < pArray->Buffer + MICROPROFILE_TOOLTIP_STRING_BUFFER_SIZE);
-}
-void MicroProfileStringArrayCopy(MicroProfileStringArray* pDest, MicroProfileStringArray* pSrc)
-{
- memcpy(&pDest->ppStrings[0], &pSrc->ppStrings[0], sizeof(pDest->ppStrings));
- memcpy(&pDest->Buffer[0], &pSrc->Buffer[0], sizeof(pDest->Buffer));
- for(uint32_t i = 0; i < MICROPROFILE_TOOLTIP_MAX_STRINGS; ++i)
- {
- if(i < pSrc->nNumStrings)
- {
- if(pSrc->ppStrings[i] >= &pSrc->Buffer[0] && pSrc->ppStrings[i] < &pSrc->Buffer[0] + MICROPROFILE_TOOLTIP_STRING_BUFFER_SIZE)
- {
- pDest->ppStrings[i] += &pDest->Buffer[0] - &pSrc->Buffer[0];
- }
- }
- }
- pDest->nNumStrings = pSrc->nNumStrings;
-}
-
-void MicroProfileFloatWindowSize(const char** ppStrings, uint32_t nNumStrings, uint32_t* pColors, uint32_t& nWidth, uint32_t& nHeight, uint32_t* pStringLengths = 0)
-{
- uint32_t* nStringLengths = pStringLengths ? pStringLengths : (uint32_t*)alloca(nNumStrings * sizeof(uint32_t));
- uint32_t nTextCount = nNumStrings/2;
- for(uint32_t i = 0; i < nTextCount; ++i)
- {
- uint32_t i0 = i * 2;
- uint32_t s0, s1;
- nStringLengths[i0] = s0 = (uint32_t)strlen(ppStrings[i0]);
- nStringLengths[i0+1] = s1 = (uint32_t)strlen(ppStrings[i0+1]);
- nWidth = MicroProfileMax(s0+s1, nWidth);
- }
- nWidth = (MICROPROFILE_TEXT_WIDTH+1) * (2+nWidth) + 2 * MICROPROFILE_BORDER_SIZE;
- if(pColors)
- nWidth += MICROPROFILE_TEXT_WIDTH + 1;
- nHeight = (MICROPROFILE_TEXT_HEIGHT+1) * nTextCount + 2 * MICROPROFILE_BORDER_SIZE;
-}
-
-void MicroProfileDrawFloatWindow(uint32_t nX, uint32_t nY, const char** ppStrings, uint32_t nNumStrings, uint32_t nColor, uint32_t* pColors = 0)
-{
- uint32_t nWidth = 0, nHeight = 0;
- uint32_t* nStringLengths = (uint32_t*)alloca(nNumStrings * sizeof(uint32_t));
- MicroProfileFloatWindowSize(ppStrings, nNumStrings, pColors, nWidth, nHeight, nStringLengths);
- uint32_t nTextCount = nNumStrings/2;
- if(nX + nWidth > UI.nWidth)
- nX = UI.nWidth - nWidth;
- if(nY + nHeight > UI.nHeight)
- nY = UI.nHeight - nHeight;
- MicroProfileDrawBox(nX-1, nY-1, nX + nWidth+1, nY + nHeight+1, 0xff000000|nColor);
- MicroProfileDrawBox(nX, nY, nX + nWidth, nY + nHeight, 0xff000000);
- if(pColors)
- {
- nX += MICROPROFILE_TEXT_WIDTH+1;
- nWidth -= MICROPROFILE_TEXT_WIDTH+1;
- }
- for(uint32_t i = 0; i < nTextCount; ++i)
- {
- int i0 = i * 2;
- if(pColors)
- {
- MicroProfileDrawBox(nX-MICROPROFILE_TEXT_WIDTH, nY, nX, nY + MICROPROFILE_TEXT_WIDTH, pColors[i]|0xff000000);
- }
- MicroProfileDrawText(nX + 1, nY + 1, (uint32_t)-1, ppStrings[i0], (uint32_t)strlen(ppStrings[i0]));
- MicroProfileDrawText(nX + nWidth - nStringLengths[i0+1] * (MICROPROFILE_TEXT_WIDTH+1), nY + 1, (uint32_t)-1, ppStrings[i0+1], (uint32_t)strlen(ppStrings[i0+1]));
- nY += (MICROPROFILE_TEXT_HEIGHT+1);
- }
-}
-void MicroProfileDrawTextBox(uint32_t nX, uint32_t nY, const char** ppStrings, uint32_t nNumStrings, uint32_t nColor, uint32_t* pColors = 0)
-{
- uint32_t nWidth = 0, nHeight = 0;
- uint32_t* nStringLengths = (uint32_t*)alloca(nNumStrings * sizeof(uint32_t));
- for(uint32_t i = 0; i < nNumStrings; ++i)
- {
- nStringLengths[i] = (uint32_t)strlen(ppStrings[i]);
- nWidth = MicroProfileMax(nWidth, nStringLengths[i]);
- nHeight++;
- }
- nWidth = (MICROPROFILE_TEXT_WIDTH+1) * (2+nWidth) + 2 * MICROPROFILE_BORDER_SIZE;
- nHeight = (MICROPROFILE_TEXT_HEIGHT+1) * nHeight + 2 * MICROPROFILE_BORDER_SIZE;
- if(nX + nWidth > UI.nWidth)
- nX = UI.nWidth - nWidth;
- if(nY + nHeight > UI.nHeight)
- nY = UI.nHeight - nHeight;
- MicroProfileDrawBox(nX, nY, nX + nWidth, nY + nHeight, 0xff000000);
- for(uint32_t i = 0; i < nNumStrings; ++i)
- {
- MicroProfileDrawText(nX + 1, nY + 1, (uint32_t)-1, ppStrings[i], (uint32_t)strlen(ppStrings[i]));
- nY += (MICROPROFILE_TEXT_HEIGHT+1);
- }
-}
-
-
-
-void MicroProfileToolTipMeta(MicroProfileStringArray* pToolTip)
-{
- MicroProfile& S = *MicroProfileGet();
- if(UI.nRangeBeginIndex != UI.nRangeEndIndex && UI.pRangeLog)
- {
- uint64_t nMetaSum[MICROPROFILE_META_MAX] = {0};
- uint64_t nMetaSumInclusive[MICROPROFILE_META_MAX] = {0};
- int nStackDepth = 0;
- uint32_t nRange[2][2];
- MicroProfileThreadLog* pLog = UI.pRangeLog;
-
-
- MicroProfileGetRange(UI.nRangeEndIndex, UI.nRangeBeginIndex, nRange);
- for(uint32_t i = 0; i < 2; ++i)
- {
- uint32_t nStart = nRange[i][0];
- uint32_t nEnd = nRange[i][1];
- for(uint32_t j = nStart; j < nEnd; ++j)
- {
- MicroProfileLogEntry LE = pLog->Log[j];
- uint64_t nType = MicroProfileLogType(LE);
- switch(nType)
- {
- case MP_LOG_META:
- {
- int64_t nMetaIndex = MicroProfileLogTimerIndex(LE);
- int64_t nMetaCount = MicroProfileLogGetTick(LE);
- MP_ASSERT(nMetaIndex < MICROPROFILE_META_MAX);
- if(nStackDepth>1)
- {
- nMetaSumInclusive[nMetaIndex] += nMetaCount;
- }
- else
- {
- nMetaSum[nMetaIndex] += nMetaCount;
- }
- }
- break;
- case MP_LOG_LEAVE:
- if(nStackDepth)
- {
- nStackDepth--;
- }
- else
- {
- for(int i = 0; i < MICROPROFILE_META_MAX; ++i)
- {
- nMetaSumInclusive[i] += nMetaSum[i];
- nMetaSum[i] = 0;
- }
- }
- break;
- case MP_LOG_ENTER:
- nStackDepth++;
- break;
- }
-
- }
- }
- bool bSpaced = false;
- for(int i = 0; i < MICROPROFILE_META_MAX; ++i)
- {
- if(S.MetaCounters[i].pName && (nMetaSum[i]||nMetaSumInclusive[i]))
- {
- if(!bSpaced)
- {
- bSpaced = true;
- MicroProfileStringArrayAddLiteral(pToolTip, "");
- MicroProfileStringArrayAddLiteral(pToolTip, "");
- }
- MicroProfileStringArrayFormat(pToolTip, "%s excl", S.MetaCounters[i].pName);
- MicroProfileStringArrayFormat(pToolTip, "%5d", nMetaSum[i]);
- MicroProfileStringArrayFormat(pToolTip, "%s incl", S.MetaCounters[i].pName);
- MicroProfileStringArrayFormat(pToolTip, "%5d", nMetaSum[i] + nMetaSumInclusive[i]);
- }
- }
- }
-}
-
-void MicroProfileDrawFloatTooltip(uint32_t nX, uint32_t nY, uint32_t nToken, uint64_t nTime)
-{
- MicroProfile& S = *MicroProfileGet();
-
- uint32_t nIndex = MicroProfileGetTimerIndex(nToken);
- uint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;
- uint32_t nAggregateCount = S.Aggregate[nIndex].nCount ? S.Aggregate[nIndex].nCount : 1;
-
- uint32_t nGroupId = MicroProfileGetGroupIndex(nToken);
- uint32_t nTimerId = MicroProfileGetTimerIndex(nToken);
- bool bGpu = S.GroupInfo[nGroupId].Type == MicroProfileTokenTypeGpu;
-
- float fToMs = MicroProfileTickToMsMultiplier(bGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());
-
- float fMs = fToMs * (nTime);
- float fFrameMs = fToMs * (S.Frame[nIndex].nTicks);
- float fAverage = fToMs * (S.Aggregate[nIndex].nTicks/nAggregateFrames);
- float fCallAverage = fToMs * (S.Aggregate[nIndex].nTicks / nAggregateCount);
- float fMax = fToMs * (S.AggregateMax[nIndex]);
- float fMin = fToMs * (S.AggregateMin[nIndex]);
-
- float fFrameMsExclusive = fToMs * (S.FrameExclusive[nIndex]);
- float fAverageExclusive = fToMs * (S.AggregateExclusive[nIndex]/nAggregateFrames);
- float fMaxExclusive = fToMs * (S.AggregateMaxExclusive[nIndex]);
-
- float fGroupAverage = fToMs * (S.AggregateGroup[nGroupId] / nAggregateFrames);
- float fGroupMax = fToMs * (S.AggregateGroupMax[nGroupId]);
- float fGroup = fToMs * (S.FrameGroup[nGroupId]);
-
-
- MicroProfileStringArray ToolTip;
- MicroProfileStringArrayClear(&ToolTip);
- const char* pGroupName = S.GroupInfo[nGroupId].pName;
- const char* pTimerName = S.TimerInfo[nTimerId].pName;
- MicroProfileStringArrayAddLiteral(&ToolTip, "Timer:");
- MicroProfileStringArrayFormat(&ToolTip, "%s", pTimerName);
-
-#if MICROPROFILE_DEBUG
- MicroProfileStringArrayFormat(&ToolTip,"0x%p", UI.nHoverAddressEnter);
- MicroProfileStringArrayFormat(&ToolTip,"0x%p", UI.nHoverAddressLeave);
-#endif
-
- if(nTime != (uint64_t)0)
- {
- MicroProfileStringArrayAddLiteral(&ToolTip, "Time:");
- MicroProfileStringArrayFormat(&ToolTip,"%6.3fms", fMs);
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
- }
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Frame Time:");
- MicroProfileStringArrayFormat(&ToolTip,"%6.3fms", fFrameMs);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Average:");
- MicroProfileStringArrayFormat(&ToolTip,"%6.3fms", fAverage);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Max:");
- MicroProfileStringArrayFormat(&ToolTip,"%6.3fms", fMax);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Min:");
- MicroProfileStringArrayFormat(&ToolTip, "%6.3fms", fMin);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Frame Call Average:");
- MicroProfileStringArrayFormat(&ToolTip,"%6.3fms", fCallAverage);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Frame Call Count:");
- MicroProfileStringArrayFormat(&ToolTip, "%6d", nAggregateCount / nAggregateFrames);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Exclusive Frame Time:");
- MicroProfileStringArrayFormat(&ToolTip, "%6.3fms", fFrameMsExclusive);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Exclusive Average:");
- MicroProfileStringArrayFormat(&ToolTip, "%6.3fms", fAverageExclusive);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Exclusive Max:");
- MicroProfileStringArrayFormat(&ToolTip, "%6.3fms", fMaxExclusive);
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
-
- MicroProfileStringArrayAddLiteral(&ToolTip, "Group:");
- MicroProfileStringArrayFormat(&ToolTip, "%s", pGroupName);
- MicroProfileStringArrayAddLiteral(&ToolTip, "Frame Time:");
- MicroProfileStringArrayFormat(&ToolTip, "%6.3f", fGroup);
- MicroProfileStringArrayAddLiteral(&ToolTip, "Frame Average:");
- MicroProfileStringArrayFormat(&ToolTip, "%6.3f", fGroupAverage);
- MicroProfileStringArrayAddLiteral(&ToolTip, "Frame Max:");
- MicroProfileStringArrayFormat(&ToolTip, "%6.3f", fGroupMax);
-
-
-
-
- MicroProfileToolTipMeta(&ToolTip);
-
-
- MicroProfileDrawFloatWindow(nX, nY+20, &ToolTip.ppStrings[0], ToolTip.nNumStrings, S.TimerInfo[nTimerId].nColor);
-
- if(UI.nMouseLeftMod)
- {
- int nIndex = (g_MicroProfileUI.LockedToolTipFront + MICROPROFILE_TOOLTIP_MAX_LOCKED - 1) % MICROPROFILE_TOOLTIP_MAX_LOCKED;
- g_MicroProfileUI.nLockedToolTipColor[nIndex] = S.TimerInfo[nTimerId].nColor;
- MicroProfileStringArrayCopy(&g_MicroProfileUI.LockedToolTips[nIndex], &ToolTip);
- g_MicroProfileUI.LockedToolTipFront = nIndex;
-
- }
-}
-
-
-void MicroProfileZoomTo(int64_t nTickStart, int64_t nTickEnd)
-{
- MicroProfile& S = *MicroProfileGet();
-
- int64_t nStart = S.Frames[S.nFrameCurrent].nFrameStartCpu;
- float fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- UI.fDetailedOffsetTarget = MicroProfileLogTickDifference(nStart, nTickStart) * fToMs;
- UI.fDetailedRangeTarget = MicroProfileLogTickDifference(nTickStart, nTickEnd) * fToMs;
-}
-
-void MicroProfileCenter(int64_t nTickCenter)
-{
- MicroProfile& S = *MicroProfileGet();
- int64_t nStart = S.Frames[S.nFrameCurrent].nFrameStartCpu;
- float fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- float fCenter = MicroProfileLogTickDifference(nStart, nTickCenter) * fToMs;
- UI.fDetailedOffsetTarget = UI.fDetailedOffset = fCenter - 0.5f * UI.fDetailedRange;
-}
-#ifdef MICROPROFILE_DEBUG
-uint64_t* g_pMicroProfileDumpStart = 0;
-uint64_t* g_pMicroProfileDumpEnd = 0;
-void MicroProfileDebugDumpRange()
-{
- MicroProfile& S = *MicroProfileGet();
- if(g_pMicroProfileDumpStart != g_pMicroProfileDumpEnd)
- {
- uint64_t* pStart = g_pMicroProfileDumpStart;
- uint64_t* pEnd = g_pMicroProfileDumpEnd;
- while(pStart != pEnd)
- {
- uint64_t nTick = MicroProfileLogGetTick(*pStart);
- uint64_t nToken = MicroProfileLogTimerIndex(*pStart);
- uint32_t nTimerId = MicroProfileGetTimerIndex(nToken);
-
- const char* pTimerName = S.TimerInfo[nTimerId].pName;
- char buffer[256];
- uint64_t type = MicroProfileLogType(*pStart);
-
- const char* pBegin = type == MP_LOG_LEAVE ? "END" :
- (type == MP_LOG_ENTER ? "BEGIN" : "META");
- snprintf(buffer, 255, "DUMP 0x%p: %s :: %" PRIx64 ": %s\n", pStart, pBegin, nTick, pTimerName);
-#ifdef _WIN32
- OutputDebugString(buffer);
-#else
- printf("%s", buffer);
-#endif
- pStart++;
- }
-
- g_pMicroProfileDumpStart = g_pMicroProfileDumpEnd;
- }
-}
-#define MP_DEBUG_DUMP_RANGE() MicroProfileDebugDumpRange();
-#else
-#define MP_DEBUG_DUMP_RANGE() do{} while(0)
-#endif
-
-#define MICROPROFILE_HOVER_DIST 0.5f
-
-void MicroProfileDrawDetailedContextSwitchBars(uint32_t nY, uint32_t nThreadId, uint32_t nContextSwitchStart, uint32_t nContextSwitchEnd, int64_t nBaseTicks, uint32_t nBaseY)
-{
- MicroProfile& S = *MicroProfileGet();
- int64_t nTickIn = -1;
- uint32_t nThreadBefore = -1;
- float fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- float fMsToScreen = UI.nWidth / UI.fDetailedRange;
- float fMouseX = (float)UI.nMouseX;
- float fMouseY = (float)UI.nMouseY;
-
-
- for(uint32_t j = nContextSwitchStart; j != nContextSwitchEnd; j = (j+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE)
- {
- MP_ASSERT(j < MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE);
- MicroProfileContextSwitch CS = S.ContextSwitch[j];
-
- if(nTickIn == -1)
- {
- if(CS.nThreadIn == nThreadId)
- {
- nTickIn = CS.nTicks;
- nThreadBefore = CS.nThreadOut;
- }
- }
- else
- {
- if(CS.nThreadOut == nThreadId)
- {
- int64_t nTickOut = CS.nTicks;
- float fMsStart = fToMs * MicroProfileLogTickDifference(nBaseTicks, nTickIn);
- float fMsEnd = fToMs * MicroProfileLogTickDifference(nBaseTicks, nTickOut);
- if(fMsStart <= fMsEnd)
- {
- float fXStart = fMsStart * fMsToScreen;
- float fXEnd = fMsEnd * fMsToScreen;
- float fYStart = (float)nY;
- float fYEnd = fYStart + (MICROPROFILE_DETAILED_CONTEXT_SWITCH_HEIGHT);
- uint32_t nColor = g_nMicroProfileContextSwitchThreadColors[CS.nCpu%MICROPROFILE_NUM_CONTEXT_SWITCH_COLORS];
- float fXDist = MicroProfileMax(fXStart - fMouseX, fMouseX - fXEnd);
- bool bHover = fXDist < MICROPROFILE_HOVER_DIST && fYStart <= fMouseY && fMouseY <= fYEnd && nBaseY < fMouseY;
- if(bHover)
- {
- UI.nRangeBegin = nTickIn;
- UI.nRangeEnd = nTickOut;
- S.nContextSwitchHoverTickIn = nTickIn;
- S.nContextSwitchHoverTickOut = nTickOut;
- S.nContextSwitchHoverThread = CS.nThreadOut;
- S.nContextSwitchHoverThreadBefore = nThreadBefore;
- S.nContextSwitchHoverThreadAfter = CS.nThreadIn;
- S.nContextSwitchHoverCpuNext = CS.nCpu;
- nColor = UI.nHoverColor;
- }
- if(CS.nCpu == S.nContextSwitchHoverCpu)
- {
- nColor = UI.nHoverColorShared;
- }
- MicroProfileDrawBox((int)fXStart, (int)fYStart, (int)fXEnd, (int)fYEnd, nColor|UI.nOpacityForeground, MicroProfileBoxTypeFlat);
- }
- nTickIn = -1;
- }
- }
- }
-}
-
-void MicroProfileDrawDetailedBars(uint32_t nWidth, uint32_t nHeight, int nBaseY, int nSelectedFrame)
-{
- MicroProfile& S = *MicroProfileGet();
- MP_DEBUG_DUMP_RANGE();
- int nY = nBaseY - UI.nOffsetY[MP_DRAW_DETAILED];
- int64_t nNumBoxes = 0;
- int64_t nNumLines = 0;
-
- uint32_t nFrameNext = (S.nFrameCurrent+1) % MICROPROFILE_MAX_FRAME_HISTORY;
- MicroProfileFrameState* pFrameCurrent = &S.Frames[S.nFrameCurrent];
- MicroProfileFrameState* pFrameNext = &S.Frames[nFrameNext];
-
- UI.nRangeBegin = 0;
- UI.nRangeEnd = 0;
- UI.nRangeBeginGpu = 0;
- UI.nRangeEndGpu = 0;
- UI.nRangeBeginIndex = UI.nRangeEndIndex = 0;
- UI.pRangeLog = 0;
- int64_t nFrameStartCpu = pFrameCurrent->nFrameStartCpu;
- int64_t nFrameStartGpu = pFrameCurrent->nFrameStartGpu;
- int64_t nTicksPerSecondCpu = MicroProfileTicksPerSecondCpu();
- int64_t nTicksPerSecondGpu = MicroProfileTicksPerSecondGpu();
- float fToMsCpu = MicroProfileTickToMsMultiplier(nTicksPerSecondCpu);
- float fToMsGpu = MicroProfileTickToMsMultiplier(nTicksPerSecondGpu);
-
- float fDetailedOffset = UI.fDetailedOffset;
- float fDetailedRange = UI.fDetailedRange;
-
-
- int64_t nDetailedOffsetTicksCpu = MicroProfileMsToTick(fDetailedOffset, MicroProfileTicksPerSecondCpu());
- int64_t nDetailedOffsetTicksGpu = MicroProfileMsToTick(fDetailedOffset, MicroProfileTicksPerSecondGpu());
- int64_t nBaseTicksCpu = nDetailedOffsetTicksCpu + nFrameStartCpu;
- int64_t nBaseTicksGpu = nDetailedOffsetTicksGpu + nFrameStartGpu;
- int64_t nBaseTicksEndCpu = nBaseTicksCpu + MicroProfileMsToTick(fDetailedRange, MicroProfileTicksPerSecondCpu());
-
- int64_t nTickReferenceCpu = 0, nTickReferenceGpu = 0;
- static int64_t nRefCpu = 0, nRefGpu = 0;
- if(MicroProfileGetGpuTickReference(&nTickReferenceCpu, &nTickReferenceGpu))
- {
- if(0 == nRefCpu || std::abs(nRefCpu-nBaseTicksCpu) > std::abs(nTickReferenceCpu-nBaseTicksCpu))
- {
- nRefCpu = nTickReferenceCpu;
- nRefGpu = nTickReferenceGpu;
- }
- else
- {
- nTickReferenceCpu = nRefCpu;
- nTickReferenceGpu = nRefGpu;
- }
- nBaseTicksGpu = (nBaseTicksCpu - nTickReferenceCpu) * nTicksPerSecondGpu / nTicksPerSecondCpu + nTickReferenceGpu;
- }
- int64_t nBaseTicksEndGpu = nBaseTicksCpu + MicroProfileMsToTick(fDetailedRange, MicroProfileTicksPerSecondCpu());
-
- MicroProfileFrameState* pFrameFirst = pFrameCurrent;
- int64_t nGapTime = MicroProfileTicksPerSecondCpu() * MICROPROFILE_GAP_TIME / 1000;
- for(uint32_t i = 0; i < MICROPROFILE_MAX_FRAME_HISTORY - MICROPROFILE_GPU_FRAME_DELAY; ++i)
- {
- uint32_t nNextIndex = (S.nFrameCurrent + MICROPROFILE_MAX_FRAME_HISTORY - i) % MICROPROFILE_MAX_FRAME_HISTORY;
- pFrameFirst = &S.Frames[nNextIndex];
- if(pFrameFirst->nFrameStartCpu <= nBaseTicksCpu-nGapTime)
- break;
- }
-
- float fMsBase = fToMsCpu * nDetailedOffsetTicksCpu;
- float fMs = fDetailedRange;
- float fMsEnd = fMs + fMsBase;
- float fWidth = (float)nWidth;
- float fMsToScreen = fWidth / fMs;
-
- {
- float fRate = floor(2*(log10(fMs)-1))/2;
- float fStep = powf(10.f, fRate);
- float fRcpStep = 1.f / fStep;
- int nColorIndex = (int)(floor(fMsBase*fRcpStep));
- float fStart = floor(fMsBase*fRcpStep) * fStep;
- for(float f = fStart; f < fMsEnd; )
- {
- float fStart = f;
- float fNext = f + fStep;
- MicroProfileDrawBox((int)((fStart-fMsBase) * fMsToScreen), nBaseY, (int)((fNext-fMsBase) * fMsToScreen+1), nBaseY + nHeight, UI.nOpacityBackground | g_nMicroProfileBackColors[nColorIndex++ & 1]);
- f = fNext;
- }
- }
-
- nY += MICROPROFILE_TEXT_HEIGHT+1;
- MicroProfileLogEntry* pMouseOver = UI.pDisplayMouseOver;
- MicroProfileLogEntry* pMouseOverNext = 0;
- uint64_t nMouseOverToken = pMouseOver ? MicroProfileLogTimerIndex(*pMouseOver) : MICROPROFILE_INVALID_TOKEN;
- float fMouseX = (float)UI.nMouseX;
- float fMouseY = (float)UI.nMouseY;
- uint64_t nHoverToken = MICROPROFILE_INVALID_TOKEN;
- int64_t nHoverTime = 0;
-
- static int nHoverCounter = 155;
- static int nHoverCounterDelta = 10;
- nHoverCounter += nHoverCounterDelta;
- if(nHoverCounter >= 245)
- nHoverCounterDelta = -10;
- else if(nHoverCounter < 100)
- nHoverCounterDelta = 10;
- UI.nHoverColor = (nHoverCounter<<24)|(nHoverCounter<<16)|(nHoverCounter<<8)|nHoverCounter;
- uint32_t nHoverCounterShared = nHoverCounter>>2;
- UI.nHoverColorShared = (nHoverCounterShared<<24)|(nHoverCounterShared<<16)|(nHoverCounterShared<<8)|nHoverCounterShared;
-
- uint32_t nLinesDrawn[MICROPROFILE_STACK_MAX]={0};
-
- uint32_t nContextSwitchHoverThreadAfter = S.nContextSwitchHoverThreadAfter;
- uint32_t nContextSwitchHoverThreadBefore = S.nContextSwitchHoverThreadBefore;
- S.nContextSwitchHoverThread = S.nContextSwitchHoverThreadAfter = S.nContextSwitchHoverThreadBefore = -1;
-
- uint32_t nContextSwitchStart = -1;
- uint32_t nContextSwitchEnd = -1;
- S.nContextSwitchHoverCpuNext = 0xff;
- S.nContextSwitchHoverTickIn = -1;
- S.nContextSwitchHoverTickOut = -1;
- if(S.bContextSwitchRunning)
- {
- MicroProfileContextSwitchSearch(&nContextSwitchStart, &nContextSwitchEnd, nBaseTicksCpu, nBaseTicksEndCpu);
- }
-
- bool bSkipBarView = S.bContextSwitchRunning && S.bContextSwitchNoBars;
-
- if(!bSkipBarView)
- {
- for(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)
- {
- MicroProfileThreadLog* pLog = S.Pool[i];
- if(!pLog)
- continue;
-
- uint32_t nPut = pFrameNext->nLogStart[i];
- ///note: this may display new samples as old data, but this will only happen when
- // unpaused, where the detailed view is hardly perceptible
- uint32_t nFront = S.Pool[i]->nPut.load(std::memory_order_relaxed);
- MicroProfileFrameState* pFrameLogFirst = pFrameCurrent;
- MicroProfileFrameState* pFrameLogLast = pFrameNext;
- uint32_t nGet = pFrameLogFirst->nLogStart[i];
- do
- {
- MP_ASSERT(pFrameLogFirst >= &S.Frames[0] && pFrameLogFirst < &S.Frames[MICROPROFILE_MAX_FRAME_HISTORY]);
- uint32_t nNewGet = pFrameLogFirst->nLogStart[i];
- bool bIsValid = false;
- if(nPut < nFront)
- {
- bIsValid = nNewGet <= nPut || nNewGet >= nFront;
- }
- else
- {
- bIsValid = nNewGet <= nPut && nNewGet >= nFront;
- }
- if(bIsValid)
- {
- nGet = nNewGet;
- pFrameLogFirst--;
- if(pFrameLogFirst < &S.Frames[0])
- pFrameLogFirst = &S.Frames[MICROPROFILE_MAX_FRAME_HISTORY-1];
- }
- else
- {
- break;
- }
- }while(pFrameLogFirst != pFrameFirst);
-
-
- if(nGet == (uint32_t)-1)
- continue;
- MP_ASSERT(nGet != (uint32_t)-1);
-
- nPut = pFrameLogLast->nLogStart[i];
-
- uint32_t nRange[2][2] = { {0, 0}, {0, 0}, };
-
- MicroProfileGetRange(nPut, nGet, nRange);
- if(nPut == nGet)
- continue;
- uint32_t nMaxStackDepth = 0;
-
- bool bGpu = pLog->nGpu != 0;
- float fToMs = bGpu ? fToMsGpu : fToMsCpu;
- int64_t nBaseTicks = bGpu ? nBaseTicksGpu : nBaseTicksCpu;
- char ThreadName[MicroProfileThreadLog::THREAD_MAX_LEN + 16];
- uint64_t nThreadId = pLog->nThreadId;
- snprintf(ThreadName, sizeof(ThreadName)-1, "%04" PRIx64 ": %s", nThreadId, &pLog->ThreadName[0] );
- nY += 3;
- uint32_t nThreadColor = -1;
- if(pLog->nThreadId == nContextSwitchHoverThreadAfter || pLog->nThreadId == nContextSwitchHoverThreadBefore)
- nThreadColor = UI.nHoverColorShared|0x906060;
- MicroProfileDrawText(0, nY, nThreadColor, &ThreadName[0], (uint32_t)strlen(&ThreadName[0]));
- nY += 3;
- nY += MICROPROFILE_TEXT_HEIGHT + 1;
-
- if(S.bContextSwitchRunning)
- {
- MicroProfileDrawDetailedContextSwitchBars(nY, pLog->nThreadId, nContextSwitchStart, nContextSwitchEnd, nBaseTicks, nBaseY);
- nY -= MICROPROFILE_DETAILED_BAR_HEIGHT;
- nY += MICROPROFILE_DETAILED_CONTEXT_SWITCH_HEIGHT+1;
- }
-
- uint32_t nYDelta = MICROPROFILE_DETAILED_BAR_HEIGHT;
- uint32_t nStack[MICROPROFILE_STACK_MAX];
- uint32_t nStackPos = 0;
- for(uint32_t j = 0; j < 2; ++j)
- {
- uint32_t nStart = nRange[j][0];
- uint32_t nEnd = nRange[j][1];
- for(uint32_t k = nStart; k < nEnd; ++k)
- {
- MicroProfileLogEntry* pEntry = pLog->Log + k;
- uint64_t nType = MicroProfileLogType(*pEntry);
- if(MP_LOG_ENTER == nType)
- {
- MP_ASSERT(nStackPos < MICROPROFILE_STACK_MAX);
- nStack[nStackPos++] = k;
- }
- else if(MP_LOG_META == nType)
- {
-
- }
- else if(MP_LOG_LEAVE == nType)
- {
- if(0 == nStackPos)
- {
- continue;
- }
-
- MicroProfileLogEntry* pEntryEnter = pLog->Log + nStack[nStackPos-1];
- if(MicroProfileLogTimerIndex(*pEntryEnter) != MicroProfileLogTimerIndex(*pEntry))
- {
- //uprintf("mismatch %llx %llx\n", pEntryEnter->nToken, pEntry->nToken);
- continue;
- }
- int64_t nTickStart = MicroProfileLogGetTick(*pEntryEnter);
- int64_t nTickEnd = MicroProfileLogGetTick(*pEntry);
- uint64_t nTimerIndex = MicroProfileLogTimerIndex(*pEntry);
- uint32_t nColor = S.TimerInfo[nTimerIndex].nColor;
- if(nMouseOverToken == nTimerIndex)
- {
- if(pEntry == pMouseOver)
- {
- nColor = UI.nHoverColor;
- if(bGpu)
- {
- UI.nRangeBeginGpu = *pEntryEnter;
- UI.nRangeEndGpu = *pEntry;
- uint32_t nCpuBegin = (nStack[nStackPos-1] + 1) % MICROPROFILE_BUFFER_SIZE;
- uint32_t nCpuEnd = (k + 1) % MICROPROFILE_BUFFER_SIZE;
- MicroProfileLogEntry LogCpuBegin = pLog->Log[nCpuBegin];
- MicroProfileLogEntry LogCpuEnd = pLog->Log[nCpuEnd];
- if(MicroProfileLogType(LogCpuBegin)==3 && MicroProfileLogType(LogCpuEnd) == 3)
- {
- UI.nRangeBegin = LogCpuBegin;
- UI.nRangeEnd = LogCpuEnd;
- }
- UI.nRangeBeginIndex = nStack[nStackPos-1];
- UI.nRangeEndIndex = k;
- UI.pRangeLog = pLog;
- }
- else
- {
- UI.nRangeBegin = *pEntryEnter;
- UI.nRangeEnd = *pEntry;
- UI.nRangeBeginIndex = nStack[nStackPos-1];
- UI.nRangeEndIndex = k;
- UI.pRangeLog = pLog;
-
- }
- }
- else
- {
- nColor = UI.nHoverColorShared;
- }
- }
-
- nMaxStackDepth = MicroProfileMax(nMaxStackDepth, nStackPos);
- float fMsStart = fToMs * MicroProfileLogTickDifference(nBaseTicks, nTickStart);
- float fMsEnd = fToMs * MicroProfileLogTickDifference(nBaseTicks, nTickEnd);
- float fXStart = fMsStart * fMsToScreen;
- float fXEnd = fMsEnd * fMsToScreen;
- float fYStart = (float)(nY + nStackPos * nYDelta);
- float fYEnd = fYStart + (MICROPROFILE_DETAILED_BAR_HEIGHT);
- float fXDist = MicroProfileMax(fXStart - fMouseX, fMouseX - fXEnd);
- bool bHover = fXDist < MICROPROFILE_HOVER_DIST && fYStart <= fMouseY && fMouseY <= fYEnd && nBaseY < fMouseY;
- uint32_t nIntegerWidth = (uint32_t)(fXEnd - fXStart);
- if(nIntegerWidth)
- {
- if(bHover && UI.nActiveMenu == (uint32_t)-1)
- {
- nHoverToken = MicroProfileLogTimerIndex(*pEntry);
- #if MICROPROFILE_DEBUG
- UI.nHoverAddressEnter = (uint64_t)pEntryEnter;
- UI.nHoverAddressLeave = (uint64_t)pEntry;
- #endif
- nHoverTime = MicroProfileLogTickDifference(nTickStart, nTickEnd);
- pMouseOverNext = pEntry;
- }
-
- MicroProfileDrawBox((int)fXStart, (int)fYStart, (int)fXEnd, (int)fYEnd, nColor|UI.nOpacityForeground, MicroProfileBoxTypeBar);
-#if MICROPROFILE_DETAILED_BAR_NAMES
- if(nIntegerWidth>3*MICROPROFILE_TEXT_WIDTH)
- {
- float fXStartText = MicroProfileMax(fXStart, 0.f);
- int nTextWidth = (int)(fXEnd - fXStartText);
- int nCharacters = (nTextWidth - 2*MICROPROFILE_TEXT_WIDTH) / MICROPROFILE_TEXT_WIDTH;
- if(nCharacters>0)
- {
- MicroProfileDrawText((int)(fXStartText+1), (int)(fYStart+1), -1, S.TimerInfo[nTimerIndex].pName, MicroProfileMin(S.TimerInfo[nTimerIndex].nNameLen, nCharacters));
- }
- }
-#endif
- ++nNumBoxes;
- }
- else
- {
- float fXAvg = 0.5f * (fXStart + fXEnd);
- int nLineX = (int)floor(fXAvg+0.5f);
- if(nLineX != (int)nLinesDrawn[nStackPos])
- {
- if(bHover && UI.nActiveMenu == (uint32_t)-1)
- {
- nHoverToken = (uint32_t)MicroProfileLogTimerIndex(*pEntry);
- nHoverTime = MicroProfileLogTickDifference(nTickStart, nTickEnd);
- pMouseOverNext = pEntry;
- }
- nLinesDrawn[nStackPos] = nLineX;
- MicroProfileDrawLineVertical(nLineX, (int)(fYStart + 0.5f), (int)(fYEnd + 0.5f), nColor|UI.nOpacityForeground);
- ++nNumLines;
- }
- }
- nStackPos--;
- if(0 == nStackPos)
- {
- if(bGpu ? (nTickStart > nBaseTicksEndGpu) : (nTickStart > nBaseTicksEndCpu))
- {
- break;
- }
- }
- }
- }
- }
- nY += nMaxStackDepth * nYDelta + MICROPROFILE_DETAILED_BAR_HEIGHT+1;
- }
- }
- if(S.bContextSwitchRunning && (S.bContextSwitchAllThreads||S.bContextSwitchNoBars))
- {
- uint32_t nNumThreads = 0;
- uint32_t nThreads[MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS];
- for(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS && S.Pool[i]; ++i)
- nThreads[nNumThreads++] = S.Pool[i]->nThreadId;
- uint32_t nNumThreadsBase = nNumThreads;
- if(S.bContextSwitchAllThreads)
- {
- for(uint32_t i = nContextSwitchStart; i != nContextSwitchEnd; i = (i+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE)
- {
- MicroProfileContextSwitch CS = S.ContextSwitch[i];
- ThreadIdType nThreadId = CS.nThreadIn;
- if(nThreadId)
- {
- bool bSeen = false;
- for(uint32_t j = 0; j < nNumThreads; ++j)
- {
- if(nThreads[j] == nThreadId)
- {
- bSeen = true;
- break;
- }
- }
- if(!bSeen)
- {
- nThreads[nNumThreads++] = nThreadId;
- }
- }
- if(nNumThreads == MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS)
- {
- S.nOverflow = 10;
- break;
- }
- }
- std::sort(&nThreads[nNumThreadsBase], &nThreads[nNumThreads]);
- }
- uint32_t nStart = nNumThreadsBase;
- if(S.bContextSwitchNoBars)
- nStart = 0;
- for(uint32_t i = nStart; i < nNumThreads; ++i)
- {
- ThreadIdType nThreadId = nThreads[i];
- if(nThreadId)
- {
- char ThreadName[MicroProfileThreadLog::THREAD_MAX_LEN + 16];
- const char* cLocal = MicroProfileIsLocalThread(nThreadId) ? "*": " ";
-
- int nStrLen = snprintf(ThreadName, sizeof(ThreadName)-1, "%04x: %s%s", (uint32_t)nThreadId, cLocal, i < nNumThreadsBase ? &S.Pool[i]->ThreadName[0] : MICROPROFILE_THREAD_NAME_FROM_ID(nThreadId) );
- uint32_t nThreadColor = -1;
- if(nThreadId == nContextSwitchHoverThreadAfter || nThreadId == nContextSwitchHoverThreadBefore)
- nThreadColor = UI.nHoverColorShared|0x906060;
- MicroProfileDrawDetailedContextSwitchBars(nY+2, nThreadId, nContextSwitchStart, nContextSwitchEnd, nBaseTicksCpu, nBaseY);
- MicroProfileDrawText(0, nY, nThreadColor, &ThreadName[0], nStrLen);
- nY += MICROPROFILE_TEXT_HEIGHT+1;
- }
- }
- }
-
- S.nContextSwitchHoverCpu = S.nContextSwitchHoverCpuNext;
-
-
-
-
- UI.pDisplayMouseOver = pMouseOverNext;
-
- if(!S.nRunning)
- {
- if(nHoverToken != MICROPROFILE_INVALID_TOKEN && nHoverTime)
- {
- UI.nHoverToken = nHoverToken;
- UI.nHoverTime = nHoverTime;
- }
-
- if(nSelectedFrame != -1)
- {
- UI.nRangeBegin = S.Frames[nSelectedFrame].nFrameStartCpu;
- UI.nRangeEnd = S.Frames[(nSelectedFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY].nFrameStartCpu;
- UI.nRangeBeginGpu = S.Frames[nSelectedFrame].nFrameStartGpu;
- UI.nRangeEndGpu = S.Frames[(nSelectedFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY].nFrameStartGpu;
- }
- if(UI.nRangeBegin != UI.nRangeEnd)
- {
- float fMsStart = fToMsCpu * MicroProfileLogTickDifference(nBaseTicksCpu, UI.nRangeBegin);
- float fMsEnd = fToMsCpu * MicroProfileLogTickDifference(nBaseTicksCpu, UI.nRangeEnd);
- float fXStart = fMsStart * fMsToScreen;
- float fXEnd = fMsEnd * fMsToScreen;
- MicroProfileDrawBox((int)fXStart, nBaseY, (int)fXEnd, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT, MicroProfileBoxTypeFlat);
- MicroProfileDrawLineVertical((int)fXStart, nBaseY, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT | 0x44000000);
- MicroProfileDrawLineVertical((int)fXEnd, nBaseY, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT | 0x44000000);
-
- fMsStart += fDetailedOffset;
- fMsEnd += fDetailedOffset;
- char sBuffer[32];
- uint32_t nLenStart = snprintf(sBuffer, sizeof(sBuffer)-1, "%.2fms", fMsStart);
- float fStartTextWidth = (float)((1+MICROPROFILE_TEXT_WIDTH) * nLenStart);
- float fStartTextX = fXStart - fStartTextWidth - 2;
- MicroProfileDrawBox((int)fStartTextX, nBaseY, (int)(fStartTextX + fStartTextWidth + 2), MICROPROFILE_TEXT_HEIGHT + 2 + nBaseY, 0x33000000, MicroProfileBoxTypeFlat);
- MicroProfileDrawText((int)fStartTextX+1, nBaseY, (uint32_t)-1, sBuffer, nLenStart);
- uint32_t nLenEnd = snprintf(sBuffer, sizeof(sBuffer)-1, "%.2fms", fMsEnd);
- MicroProfileDrawBox((int)(fXEnd+1), nBaseY, (int)(fXEnd+1+(1+MICROPROFILE_TEXT_WIDTH) * nLenEnd + 3), MICROPROFILE_TEXT_HEIGHT + 2 + nBaseY, 0x33000000, MicroProfileBoxTypeFlat);
- MicroProfileDrawText((int)(fXEnd+2), nBaseY+1, (uint32_t)-1, sBuffer, nLenEnd);
-
- if(UI.nMouseRight)
- {
- MicroProfileZoomTo(UI.nRangeBegin, UI.nRangeEnd);
- }
- }
-
- if(UI.nRangeBeginGpu != UI.nRangeEndGpu)
- {
- float fMsStart = fToMsGpu * MicroProfileLogTickDifference(nBaseTicksGpu, UI.nRangeBeginGpu);
- float fMsEnd = fToMsGpu * MicroProfileLogTickDifference(nBaseTicksGpu, UI.nRangeEndGpu);
- float fXStart = fMsStart * fMsToScreen;
- float fXEnd = fMsEnd * fMsToScreen;
- MicroProfileDrawBox((int)fXStart, nBaseY, (int)fXEnd, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT_GPU, MicroProfileBoxTypeFlat);
- MicroProfileDrawLineVertical((int)fXStart, nBaseY, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT_GPU | 0x44000000);
- MicroProfileDrawLineVertical((int)fXEnd, nBaseY, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT_GPU | 0x44000000);
-
- nBaseY += MICROPROFILE_TEXT_HEIGHT+1;
-
- fMsStart += fDetailedOffset;
- fMsEnd += fDetailedOffset;
- char sBuffer[32];
- uint32_t nLenStart = snprintf(sBuffer, sizeof(sBuffer)-1, "%.2fms", fMsStart);
- float fStartTextWidth = (float)((1+MICROPROFILE_TEXT_WIDTH) * nLenStart);
- float fStartTextX = fXStart - fStartTextWidth - 2;
- MicroProfileDrawBox((int)fStartTextX, nBaseY, (int)(fStartTextX + fStartTextWidth + 2), MICROPROFILE_TEXT_HEIGHT + 2 + nBaseY, 0x33000000, MicroProfileBoxTypeFlat);
- MicroProfileDrawText((int)(fStartTextX+1), nBaseY, (uint32_t)-1, sBuffer, nLenStart);
- uint32_t nLenEnd = snprintf(sBuffer, sizeof(sBuffer)-1, "%.2fms", fMsEnd);
- MicroProfileDrawBox((int)(fXEnd+1), nBaseY, (int)(fXEnd+1+(1+MICROPROFILE_TEXT_WIDTH) * nLenEnd + 3), MICROPROFILE_TEXT_HEIGHT + 2 + nBaseY, 0x33000000, MicroProfileBoxTypeFlat);
- MicroProfileDrawText((int)(fXEnd+2), nBaseY+1, (uint32_t)-1, sBuffer, nLenEnd);
- }
- }
-}
-
-
-void MicroProfileDrawDetailedFrameHistory(uint32_t nWidth, uint32_t nHeight, uint32_t nBaseY, uint32_t nSelectedFrame)
-{
- MicroProfile& S = *MicroProfileGet();
-
- const uint32_t nBarHeight = MICROPROFILE_FRAME_HISTORY_HEIGHT;
- float fBaseX = (float)nWidth;
- float fDx = fBaseX / MICROPROFILE_NUM_FRAMES;
-
- uint32_t nLastIndex = (S.nFrameCurrent+1) % MICROPROFILE_MAX_FRAME_HISTORY;
- MicroProfileDrawBox(0, nBaseY, nWidth, nBaseY+MICROPROFILE_FRAME_HISTORY_HEIGHT, 0xff000000 | g_nMicroProfileBackColors[0], MicroProfileBoxTypeFlat);
- float fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu()) * S.fRcpReferenceTime;
- float fToMsGpu = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondGpu()) * S.fRcpReferenceTime;
-
-
- MicroProfileFrameState* pFrameCurrent = &S.Frames[S.nFrameCurrent];
- uint64_t nFrameStartCpu = pFrameCurrent->nFrameStartCpu;
- int64_t nDetailedOffsetTicksCpu = MicroProfileMsToTick(UI.fDetailedOffset, MicroProfileTicksPerSecondCpu());
- int64_t nCpuStart = nDetailedOffsetTicksCpu + nFrameStartCpu;
- int64_t nCpuEnd = nCpuStart + MicroProfileMsToTick(UI.fDetailedRange, MicroProfileTicksPerSecondCpu());;
-
-
- float fSelectionStart = (float)nWidth;
- float fSelectionEnd = 0.f;
- for(uint32_t i = 0; i < MICROPROFILE_NUM_FRAMES; ++i)
- {
- uint32_t nIndex = (S.nFrameCurrent + MICROPROFILE_MAX_FRAME_HISTORY - i) % MICROPROFILE_MAX_FRAME_HISTORY;
- MicroProfileFrameState* pCurrent = &S.Frames[nIndex];
- MicroProfileFrameState* pNext = &S.Frames[nLastIndex];
-
- int64_t nTicks = pNext->nFrameStartCpu - pCurrent->nFrameStartCpu;
- int64_t nTicksGpu = pNext->nFrameStartGpu - pCurrent->nFrameStartGpu;
- float fScale = fToMs * nTicks;
- float fScaleGpu = fToMsGpu * nTicksGpu;
- fScale = fScale > 1.f ? 0.f : 1.f - fScale;
- fScaleGpu = fScaleGpu > 1.f ? 0.f : 1.f - fScaleGpu;
- float fXEnd = fBaseX;
- float fXStart = fBaseX - fDx;
- fBaseX = fXStart;
- uint32_t nColor = MICROPROFILE_FRAME_HISTORY_COLOR_CPU;
- if(nIndex == nSelectedFrame)
- nColor = (uint32_t)-1;
- MicroProfileDrawBox((int)fXStart, (int)(nBaseY + fScale * nBarHeight), (int)fXEnd, nBaseY+MICROPROFILE_FRAME_HISTORY_HEIGHT, nColor, MicroProfileBoxTypeBar);
- if(pNext->nFrameStartCpu > nCpuStart)
- {
- fSelectionStart = fXStart;
- }
- if(pCurrent->nFrameStartCpu < nCpuEnd && fSelectionEnd == 0.f)
- {
- fSelectionEnd = fXEnd;
- }
- nLastIndex = nIndex;
- }
- MicroProfileDrawBox((int)fSelectionStart, nBaseY, (int)fSelectionEnd, nBaseY+MICROPROFILE_FRAME_HISTORY_HEIGHT, MICROPROFILE_FRAME_HISTORY_COLOR_HIGHTLIGHT, MicroProfileBoxTypeFlat);
-}
-void MicroProfileDrawDetailedView(uint32_t nWidth, uint32_t nHeight)
-{
- MicroProfile& S = *MicroProfileGet();
-
- MICROPROFILE_SCOPE(g_MicroProfileDetailed);
- uint32_t nBaseY = MICROPROFILE_TEXT_HEIGHT + 1;
-
- int nSelectedFrame = -1;
- if(UI.nMouseY > nBaseY && UI.nMouseY <= nBaseY + MICROPROFILE_FRAME_HISTORY_HEIGHT && UI.nActiveMenu == (uint32_t)-1)
- {
-
- nSelectedFrame = ((MICROPROFILE_NUM_FRAMES) * (UI.nWidth-UI.nMouseX) / UI.nWidth);
- nSelectedFrame = (S.nFrameCurrent + MICROPROFILE_MAX_FRAME_HISTORY - nSelectedFrame) % MICROPROFILE_MAX_FRAME_HISTORY;
- UI.nHoverFrame = nSelectedFrame;
- if(UI.nMouseRight)
- {
- int64_t nRangeBegin = S.Frames[nSelectedFrame].nFrameStartCpu;
- int64_t nRangeEnd = S.Frames[(nSelectedFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY].nFrameStartCpu;
- MicroProfileZoomTo(nRangeBegin, nRangeEnd);
- }
- if(UI.nMouseDownLeft)
- {
- uint64_t nFrac = (1024 * (MICROPROFILE_NUM_FRAMES) * (UI.nMouseX) / UI.nWidth) % 1024;
- int64_t nRangeBegin = S.Frames[nSelectedFrame].nFrameStartCpu;
- int64_t nRangeEnd = S.Frames[(nSelectedFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY].nFrameStartCpu;
- MicroProfileCenter(nRangeBegin + (nRangeEnd-nRangeBegin) * nFrac / 1024);
- }
- }
- else
- {
- UI.nHoverFrame = -1;
- }
-
- MicroProfileDrawDetailedBars(nWidth, nHeight, nBaseY + MICROPROFILE_FRAME_HISTORY_HEIGHT, nSelectedFrame);
- MicroProfileDrawDetailedFrameHistory(nWidth, nHeight, nBaseY, nSelectedFrame);
-}
-
-void MicroProfileDrawTextRight(uint32_t nX, uint32_t nY, uint32_t nColor, const char* pStr, uint32_t nStrLen)
-{
- MicroProfileDrawText(nX - nStrLen * (MICROPROFILE_TEXT_WIDTH+1), nY, nColor, pStr, nStrLen);
-}
-void MicroProfileDrawHeader(int32_t nX, uint32_t nWidth, const char* pName)
-{
- if(pName)
- {
- MicroProfileDrawBox(nX-8, MICROPROFILE_TEXT_HEIGHT + 2, nX + nWidth+5, MICROPROFILE_TEXT_HEIGHT + 2 + (MICROPROFILE_TEXT_HEIGHT+1), 0xff000000|g_nMicroProfileBackColors[1]);
- MicroProfileDrawText(nX, MICROPROFILE_TEXT_HEIGHT + 2, (uint32_t)-1, pName, (uint32_t)strlen(pName));
- }
-}
-
-
-typedef void (*MicroProfileLoopGroupCallback)(uint32_t nTimer, uint32_t nIdx, uint64_t nGroupMask, uint32_t nX, uint32_t nY, void* pData);
-
-void MicroProfileLoopActiveGroupsDraw(int32_t nX, int32_t nY, const char* pName, MicroProfileLoopGroupCallback CB, void* pData)
-{
- MicroProfile& S = *MicroProfileGet();
- nY += MICROPROFILE_TEXT_HEIGHT + 2;
- uint64_t nGroup = S.nAllGroupsWanted ? S.nGroupMask : S.nActiveGroupWanted;
- uint32_t nCount = 0;
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- uint64_t nMask = 1ll << j;
- if(nMask & nGroup)
- {
- nY += MICROPROFILE_TEXT_HEIGHT + 1;
- for(uint32_t i = 0; i < S.nTotalTimers;++i)
- {
- uint64_t nTokenMask = MicroProfileGetGroupMask(S.TimerInfo[i].nToken);
- if(nTokenMask & nMask)
- {
- if(nY >= 0)
- CB(i, nCount, nMask, nX, nY, pData);
-
- nCount += 2;
- nY += MICROPROFILE_TEXT_HEIGHT + 1;
-
- if(nY > (int)UI.nHeight)
- return;
- }
- }
-
- }
- }
-}
-
-
-void MicroProfileCalcTimers(float* pTimers, float* pAverage, float* pMax, float* pMin, float* pCallAverage, float* pExclusive, float* pAverageExclusive, float* pMaxExclusive, uint64_t nGroup, uint32_t nSize)
-{
- MicroProfile& S = *MicroProfileGet();
-
- uint32_t nCount = 0;
- uint64_t nMask = 1;
-
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- if(nMask & nGroup)
- {
- const float fToMs = MicroProfileTickToMsMultiplier(S.GroupInfo[j].Type == MicroProfileTokenTypeGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());
- for(uint32_t i = 0; i < S.nTotalTimers;++i)
- {
- uint64_t nTokenMask = MicroProfileGetGroupMask(S.TimerInfo[i].nToken);
- if(nTokenMask & nMask)
- {
- {
- uint32_t nTimer = i;
- uint32_t nIdx = nCount;
- uint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;
- uint32_t nAggregateCount = S.Aggregate[nTimer].nCount ? S.Aggregate[nTimer].nCount : 1;
- float fToPrc = S.fRcpReferenceTime;
- float fMs = fToMs * (S.Frame[nTimer].nTicks);
- float fPrc = MicroProfileMin(fMs * fToPrc, 1.f);
- float fAverageMs = fToMs * (S.Aggregate[nTimer].nTicks / nAggregateFrames);
- float fAveragePrc = MicroProfileMin(fAverageMs * fToPrc, 1.f);
- float fMaxMs = fToMs * (S.AggregateMax[nTimer]);
- float fMaxPrc = MicroProfileMin(fMaxMs * fToPrc, 1.f);
- float fMinMs = fToMs * (S.AggregateMin[nTimer] != uint64_t(-1) ? S.AggregateMin[nTimer] : 0);
- float fMinPrc = MicroProfileMin(fMinMs * fToPrc, 1.f);
- float fCallAverageMs = fToMs * (S.Aggregate[nTimer].nTicks / nAggregateCount);
- float fCallAveragePrc = MicroProfileMin(fCallAverageMs * fToPrc, 1.f);
- float fMsExclusive = fToMs * (S.FrameExclusive[nTimer]);
- float fPrcExclusive = MicroProfileMin(fMsExclusive * fToPrc, 1.f);
- float fAverageMsExclusive = fToMs * (S.AggregateExclusive[nTimer] / nAggregateFrames);
- float fAveragePrcExclusive = MicroProfileMin(fAverageMsExclusive * fToPrc, 1.f);
- float fMaxMsExclusive = fToMs * (S.AggregateMaxExclusive[nTimer]);
- float fMaxPrcExclusive = MicroProfileMin(fMaxMsExclusive * fToPrc, 1.f);
- pTimers[nIdx] = fMs;
- pTimers[nIdx+1] = fPrc;
- pAverage[nIdx] = fAverageMs;
- pAverage[nIdx+1] = fAveragePrc;
- pMax[nIdx] = fMaxMs;
- pMax[nIdx+1] = fMaxPrc;
- pMin[nIdx] = fMinMs;
- pMin[nIdx + 1] = fMinPrc;
- pCallAverage[nIdx] = fCallAverageMs;
- pCallAverage[nIdx+1] = fCallAveragePrc;
- pExclusive[nIdx] = fMsExclusive;
- pExclusive[nIdx+1] = fPrcExclusive;
- pAverageExclusive[nIdx] = fAverageMsExclusive;
- pAverageExclusive[nIdx+1] = fAveragePrcExclusive;
- pMaxExclusive[nIdx] = fMaxMsExclusive;
- pMaxExclusive[nIdx+1] = fMaxPrcExclusive;
- }
- nCount += 2;
- }
- }
- }
- nMask <<= 1ll;
- }
-}
-
-#define SBUF_MAX 32
-
-void MicroProfileDrawBarArrayCallback(uint32_t nTimer, uint32_t nIdx, uint64_t nGroupMask, uint32_t nX, uint32_t nY, void* pExtra)
-{
- const uint32_t nHeight = MICROPROFILE_TEXT_HEIGHT;
- const uint32_t nTextWidth = 6 * (1+MICROPROFILE_TEXT_WIDTH);
- const float fWidth = (float)MICROPROFILE_BAR_WIDTH;
-
- float* pTimers = ((float**)pExtra)[0];
- float* pTimers2 = ((float**)pExtra)[1];
- MicroProfile& S = *MicroProfileGet();
- char sBuffer[SBUF_MAX];
- if (pTimers2 && pTimers2[nIdx] > 0.1f)
- snprintf(sBuffer, SBUF_MAX-1, "%5.2f %3.1fx", pTimers[nIdx], pTimers[nIdx] / pTimers2[nIdx]);
- else
- snprintf(sBuffer, SBUF_MAX-1, "%5.2f", pTimers[nIdx]);
- if (!pTimers2)
- MicroProfileDrawBox(nX + nTextWidth, nY, (int)(nX + nTextWidth + fWidth * pTimers[nIdx+1]), nY + nHeight, UI.nOpacityForeground|S.TimerInfo[nTimer].nColor, MicroProfileBoxTypeBar);
- MicroProfileDrawText(nX, nY, (uint32_t)-1, sBuffer, (uint32_t)strlen(sBuffer));
-}
-
-
-uint32_t MicroProfileDrawBarArray(int32_t nX, int32_t nY, float* pTimers, const char* pName, uint32_t nTotalHeight, float* pTimers2 = NULL)
-{
- const uint32_t nTextWidth = 6 * (1+MICROPROFILE_TEXT_WIDTH);
- const uint32_t nWidth = MICROPROFILE_BAR_WIDTH;
-
- MicroProfileDrawLineVertical(nX-5, 0, nTotalHeight+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);
- float* pTimersArray[2] = {pTimers, pTimers2};
- MicroProfileLoopActiveGroupsDraw(nX, nY, pName, MicroProfileDrawBarArrayCallback, pTimersArray);
- MicroProfileDrawHeader(nX, nTextWidth + nWidth, pName);
- return nWidth + 5 + nTextWidth;
-
-}
-void MicroProfileDrawBarCallCountCallback(uint32_t nTimer, uint32_t nIdx, uint64_t nGroupMask, uint32_t nX, uint32_t nY, void* pExtra)
-{
- MicroProfile& S = *MicroProfileGet();
- char sBuffer[SBUF_MAX];
- int nLen = snprintf(sBuffer, SBUF_MAX-1, "%5d", S.Frame[nTimer].nCount);//fix
- MicroProfileDrawText(nX, nY, (uint32_t)-1, sBuffer, nLen);
-}
-
-uint32_t MicroProfileDrawBarCallCount(int32_t nX, int32_t nY, const char* pName)
-{
- MicroProfileLoopActiveGroupsDraw(nX, nY, pName, MicroProfileDrawBarCallCountCallback, 0);
- const uint32_t nTextWidth = 6 * MICROPROFILE_TEXT_WIDTH;
- MicroProfileDrawHeader(nX, 5 + nTextWidth, pName);
- return 5 + nTextWidth;
-}
-
-struct MicroProfileMetaAverageArgs
-{
- uint64_t* pCounters;
- float fRcpFrames;
-};
-
-void MicroProfileDrawBarMetaAverageCallback(uint32_t nTimer, uint32_t nIdx, uint64_t nGroupMask, uint32_t nX, uint32_t nY, void* pExtra)
-{
- MicroProfileMetaAverageArgs* pArgs = (MicroProfileMetaAverageArgs*)pExtra;
- uint64_t* pCounters = pArgs->pCounters;
- float fRcpFrames = pArgs->fRcpFrames;
- char sBuffer[SBUF_MAX];
- int nLen = snprintf(sBuffer, SBUF_MAX-1, "%5.2f", pCounters[nTimer] * fRcpFrames);
- MicroProfileDrawText(nX - nLen * (MICROPROFILE_TEXT_WIDTH+1), nY, (uint32_t)-1, sBuffer, nLen);
-}
-
-uint32_t MicroProfileDrawBarMetaAverage(int32_t nX, int32_t nY, uint64_t* pCounters, const char* pName, uint32_t nTotalHeight)
-{
- if(!pName)
- return 0;
- MicroProfileDrawLineVertical(nX-5, 0, nTotalHeight+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);
- uint32_t nTextWidth = (1+MICROPROFILE_TEXT_WIDTH) * MicroProfileMax(6, (uint32_t)strlen(pName));
- float fRcpFrames = 1.f / (MicroProfileGet()->nAggregateFrames ? MicroProfileGet()->nAggregateFrames : 1);
- MicroProfileMetaAverageArgs Args = {pCounters, fRcpFrames};
- MicroProfileLoopActiveGroupsDraw(nX + nTextWidth, nY, pName, MicroProfileDrawBarMetaAverageCallback, &Args);
- MicroProfileDrawHeader(nX, 5 + nTextWidth, pName);
- return 5 + nTextWidth;
-}
-
-
-void MicroProfileDrawBarMetaCountCallback(uint32_t nTimer, uint32_t nIdx, uint64_t nGroupMask, uint32_t nX, uint32_t nY, void* pExtra)
-{
- uint64_t* pCounters = (uint64_t*)pExtra;
- char sBuffer[SBUF_MAX];
- int nLen = snprintf(sBuffer, SBUF_MAX-1, "%5" PRIu64, pCounters[nTimer]);
- MicroProfileDrawText(nX - nLen * (MICROPROFILE_TEXT_WIDTH+1), nY, (uint32_t)-1, sBuffer, nLen);
-}
-
-uint32_t MicroProfileDrawBarMetaCount(int32_t nX, int32_t nY, uint64_t* pCounters, const char* pName, uint32_t nTotalHeight)
-{
- if(!pName)
- return 0;
-
- MicroProfileDrawLineVertical(nX-5, 0, nTotalHeight+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);
- uint32_t nTextWidth = (1+MICROPROFILE_TEXT_WIDTH) * MicroProfileMax(6, (uint32_t)strlen(pName));
- MicroProfileLoopActiveGroupsDraw(nX + nTextWidth, nY, pName, MicroProfileDrawBarMetaCountCallback, pCounters);
- MicroProfileDrawHeader(nX, 5 + nTextWidth, pName);
- return 5 + nTextWidth;
-}
-
-void MicroProfileDrawBarLegendCallback(uint32_t nTimer, uint32_t nIdx, uint64_t nGroupMask, uint32_t nX, uint32_t nY, void* pExtra)
-{
- MicroProfile& S = *MicroProfileGet();
- if (S.TimerInfo[nTimer].bGraph)
- {
- MicroProfileDrawText(nX, nY, S.TimerInfo[nTimer].nColor, ">", 1);
- }
- MicroProfileDrawTextRight(nX, nY, S.TimerInfo[nTimer].nColor, S.TimerInfo[nTimer].pName, (uint32_t)strlen(S.TimerInfo[nTimer].pName));
- if(UI.nMouseY >= nY && UI.nMouseY < nY + MICROPROFILE_TEXT_HEIGHT+1)
- {
- UI.nHoverToken = nTimer;
- UI.nHoverTime = 0;
- }
-}
-
-uint32_t MicroProfileDrawBarLegend(int32_t nX, int32_t nY, uint32_t nTotalHeight, uint32_t nMaxWidth)
-{
- MicroProfileDrawLineVertical(nX-5, nY, nTotalHeight, UI.nOpacityBackground | g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);
- MicroProfileLoopActiveGroupsDraw(nMaxWidth, nY, 0, MicroProfileDrawBarLegendCallback, 0);
- return nX;
-}
-
-bool MicroProfileDrawGraph(uint32_t nScreenWidth, uint32_t nScreenHeight)
-{
- MicroProfile& S = *MicroProfileGet();
-
- MICROPROFILE_SCOPE(g_MicroProfileDrawGraph);
- bool bEnabled = false;
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- if(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)
- bEnabled = true;
- if(!bEnabled)
- return false;
-
- uint32_t nX = nScreenWidth - MICROPROFILE_GRAPH_WIDTH;
- uint32_t nY = nScreenHeight - MICROPROFILE_GRAPH_HEIGHT;
- MicroProfileDrawBox(nX, nY, nX + MICROPROFILE_GRAPH_WIDTH, nY + MICROPROFILE_GRAPH_HEIGHT, 0x88000000 | g_nMicroProfileBackColors[0]);
- bool bMouseOver = UI.nMouseX >= nX && UI.nMouseY >= nY;
- float fMouseXPrc =(float(UI.nMouseX - nX)) / MICROPROFILE_GRAPH_WIDTH;
- if(bMouseOver)
- {
- float fXAvg = fMouseXPrc * MICROPROFILE_GRAPH_WIDTH + nX;
- MicroProfileDrawLineVertical((int)fXAvg, nY, nY + MICROPROFILE_GRAPH_HEIGHT, (uint32_t)-1);
- }
-
-
- float fY = (float)nScreenHeight;
- float fDX = MICROPROFILE_GRAPH_WIDTH * 1.f / MICROPROFILE_GRAPH_HISTORY;
- float fDY = MICROPROFILE_GRAPH_HEIGHT;
- uint32_t nPut = S.nGraphPut;
- float* pGraphData = (float*)alloca(sizeof(float)* MICROPROFILE_GRAPH_HISTORY*2);
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- if(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)
- {
- uint32_t nGroupId = MicroProfileGetGroupIndex(S.Graph[i].nToken);
- bool bGpu = S.GroupInfo[nGroupId].Type == MicroProfileTokenTypeGpu;
- float fToMs = MicroProfileTickToMsMultiplier(bGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());
- float fToPrc = fToMs * S.fRcpReferenceTime * 3 / 4;
-
- float fX = (float)nX;
- for(uint32_t j = 0; j < MICROPROFILE_GRAPH_HISTORY; ++j)
- {
- float fWeigth = MicroProfileMin(fToPrc * (S.Graph[i].nHistory[(j+nPut)%MICROPROFILE_GRAPH_HISTORY]), 1.f);
- pGraphData[(j*2)] = fX;
- pGraphData[(j*2)+1] = fY - fDY * fWeigth;
- fX += fDX;
- }
- MicroProfileDrawLine2D(MICROPROFILE_GRAPH_HISTORY, pGraphData, S.TimerInfo[MicroProfileGetTimerIndex(S.Graph[i].nToken)].nColor);
- }
- }
- {
- float fY1 = 0.25f * MICROPROFILE_GRAPH_HEIGHT + nY;
- float fY2 = 0.50f * MICROPROFILE_GRAPH_HEIGHT + nY;
- float fY3 = 0.75f * MICROPROFILE_GRAPH_HEIGHT + nY;
- MicroProfileDrawLineHorizontal(nX, nX + MICROPROFILE_GRAPH_WIDTH, (int)fY1, 0xffdd4444);
- MicroProfileDrawLineHorizontal(nX, nX + MICROPROFILE_GRAPH_WIDTH, (int)fY2, 0xff000000| g_nMicroProfileBackColors[0]);
- MicroProfileDrawLineHorizontal(nX, nX + MICROPROFILE_GRAPH_WIDTH, (int)fY3, 0xff000000|g_nMicroProfileBackColors[0]);
-
- char buf[32];
- int nLen = snprintf(buf, sizeof(buf)-1, "%5.2fms", S.fReferenceTime);
- MicroProfileDrawText(nX+1, (int)(fY1 - (2+MICROPROFILE_TEXT_HEIGHT)), (uint32_t)-1, buf, nLen);
- }
-
-
-
- if(bMouseOver)
- {
- uint32_t pColors[MICROPROFILE_MAX_GRAPHS];
- MicroProfileStringArray Strings;
- MicroProfileStringArrayClear(&Strings);
- uint32_t nTextCount = 0;
- uint32_t nGraphIndex = (S.nGraphPut + MICROPROFILE_GRAPH_HISTORY - int(MICROPROFILE_GRAPH_HISTORY*(1.f - fMouseXPrc))) % MICROPROFILE_GRAPH_HISTORY;
-
- uint32_t nX = UI.nMouseX;
- uint32_t nY = UI.nMouseY + 20;
-
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- if(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)
- {
- uint32_t nGroupId = MicroProfileGetGroupIndex(S.Graph[i].nToken);
- bool bGpu = S.GroupInfo[nGroupId].Type == MicroProfileTokenTypeGpu;
- float fToMs = MicroProfileTickToMsMultiplier(bGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());
- uint32_t nIndex = MicroProfileGetTimerIndex(S.Graph[i].nToken);
- uint32_t nColor = S.TimerInfo[nIndex].nColor;
- const char* pName = S.TimerInfo[nIndex].pName;
- pColors[nTextCount++] = nColor;
- MicroProfileStringArrayAddLiteral(&Strings, pName);
- MicroProfileStringArrayFormat(&Strings, "%5.2fms", fToMs * (S.Graph[i].nHistory[nGraphIndex]));
- }
- }
- if(nTextCount)
- {
- MicroProfileDrawFloatWindow(nX, nY, Strings.ppStrings, Strings.nNumStrings, 0, pColors);
- }
-
- if(UI.nMouseRight)
- {
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- S.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;
- }
- }
- }
-
- return bMouseOver;
-}
-
-void MicroProfileDumpTimers()
-{
- MicroProfile& S = *MicroProfileGet();
-
- uint64_t nActiveGroup = S.nGroupMask;
-
- uint32_t nNumTimers = S.nTotalTimers;
- uint32_t nBlockSize = 2 * nNumTimers;
- float* pTimers = (float*)alloca(nBlockSize * 8 * sizeof(float));
- float* pAverage = pTimers + nBlockSize;
- float* pMax = pTimers + 2 * nBlockSize;
- float* pMin = pTimers + 3 * nBlockSize;
- float* pCallAverage = pTimers + 4 * nBlockSize;
- float* pTimersExclusive = pTimers + 5 * nBlockSize;
- float* pAverageExclusive = pTimers + 6 * nBlockSize;
- float* pMaxExclusive = pTimers + 7 * nBlockSize;
- MicroProfileCalcTimers(pTimers, pAverage, pMax, pMin, pCallAverage, pTimersExclusive, pAverageExclusive, pMaxExclusive, nActiveGroup, nNumTimers);
-
- MICROPROFILE_PRINTF("%11s, ", "Time");
- MICROPROFILE_PRINTF("%11s, ", "Average");
- MICROPROFILE_PRINTF("%11s, ", "Max");
- MICROPROFILE_PRINTF("%11s, ", "Min");
- MICROPROFILE_PRINTF("%11s, ", "Call Avg");
- MICROPROFILE_PRINTF("%9s, ", "Count");
- MICROPROFILE_PRINTF("%11s, ", "Excl");
- MICROPROFILE_PRINTF("%11s, ", "Avg Excl");
- MICROPROFILE_PRINTF("%11s, \n", "Max Excl");
-
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- uint64_t nMask = 1ll << j;
- if(nMask & nActiveGroup)
- {
- MICROPROFILE_PRINTF("%s\n", S.GroupInfo[j].pName);
- for(uint32_t i = 0; i < S.nTotalTimers;++i)
- {
- uint64_t nTokenMask = MicroProfileGetGroupMask(S.TimerInfo[i].nToken);
- if(nTokenMask & nMask)
- {
- uint32_t nIdx = i * 2;
- MICROPROFILE_PRINTF("%9.2fms, ", pTimers[nIdx]);
- MICROPROFILE_PRINTF("%9.2fms, ", pAverage[nIdx]);
- MICROPROFILE_PRINTF("%9.2fms, ", pMax[nIdx]);
- MICROPROFILE_PRINTF("%9.2fms, ", pMin[nIdx]);
- MICROPROFILE_PRINTF("%9.2fms, ", pCallAverage[nIdx]);
- MICROPROFILE_PRINTF("%9d, ", S.Frame[i].nCount);
- MICROPROFILE_PRINTF("%9.2fms, ", pTimersExclusive[nIdx]);
- MICROPROFILE_PRINTF("%9.2fms, ", pAverageExclusive[nIdx]);
- MICROPROFILE_PRINTF("%9.2fms, ", pMaxExclusive[nIdx]);
- MICROPROFILE_PRINTF("%s\n", S.TimerInfo[i].pName);
- }
- }
- }
- }
-}
-
-
-
-uint32_t MicroProfileDrawCounterRecursive(uint32_t nIndex, uint32_t nY, uint32_t nOffset, uint32_t nTimerWidth)
-{
- MicroProfile& S = *MicroProfileGet();
- const uint32_t nHeight = MICROPROFILE_TEXT_HEIGHT;
- const uint32_t nCounterWidth = UI.nCounterWidth;
- const uint32_t nLimitWidth = UI.nLimitWidth;
-
- uint32_t nY0 = nY + nOffset * (nHeight+1);
- MicroProfileCounterInfo& CI = S.CounterInfo[nIndex];
- bool bInside = (UI.nActiveMenu == (uint32_t)-1) && ((UI.nMouseY >= nY0) && (UI.nMouseY < (nY0 + nHeight + 1)));
- if(bInside && (UI.nMouseLeft || UI.nMouseRight))
- {
- CI.nClosed = !CI.nClosed;
- }
- uint32_t nTotalWidth = nTimerWidth + nCounterWidth + MICROPROFILE_COUNTER_WIDTH + nLimitWidth + 3 * (MICROPROFILE_TEXT_WIDTH+1);
- uint32_t nBackColor = 0xff000000 | (g_nMicroProfileBackColors[nOffset & 1] + ((bInside) ? 0x002c2c2c : 0));
- MicroProfileDrawBox(0, nY0, nTotalWidth, nY0 + (nHeight+1)+1, nBackColor);
- uint32_t nIndent = MICROPROFILE_COUNTER_INDENT*CI.nLevel * (MICROPROFILE_TEXT_WIDTH+1);
- if(CI.nFirstChild != -1 && CI.nClosed)
- {
- MicroProfileDrawText(nIndent, nY0, 0xffffffff, "*", 1);
- }
-
- MicroProfileDrawText(nIndent + MICROPROFILE_TEXT_WIDTH+1, nY0, 0xffffffff, CI.pName, CI.nNameLen);
- char buffer[64];
- int64_t nCounterValue = S.Counters[nIndex].load();
- uint32_t nX = nTimerWidth + nCounterWidth;
- int nLen = MicroProfileFormatCounter(S.CounterInfo[nIndex].eFormat, nCounterValue, buffer, sizeof(buffer));
- UI.nCounterWidthTemp = MicroProfileMax((uint32_t)nLen, UI.nCounterWidthTemp);
- MicroProfileDrawTextRight(nX, nY0, 0xffffffff, buffer, nLen);
- int64_t nLimit = S.CounterInfo[nIndex].nLimit;
- if(nLimit)
- {
- nX += MICROPROFILE_TEXT_WIDTH+1;
- MicroProfileDrawText(nX, nY0, 0xffffffff, "/", 1);
- nX += 2 * (MICROPROFILE_TEXT_WIDTH+1);
- int nLen = MicroProfileFormatCounter(S.CounterInfo[nIndex].eFormat, nLimit, buffer, sizeof(buffer));
- UI.nLimitWidthTemp = MicroProfileMax(UI.nLimitWidthTemp, (uint32_t)nLen);
- MicroProfileDrawText(nX, nY0, 0xffffffff, buffer, nLen);
- nX += nLimitWidth;
- nY0 += 1;
-
- float fCounterPrc = (float)nCounterValue / nLimit;
- float fBoxPrc = 1.f;
- if(fCounterPrc>1.f)
- {
- fBoxPrc = 1.f / fCounterPrc;
- fCounterPrc = 1.f;
- }
-
- MicroProfileDrawBox(nX, nY0, nX + (int)(fBoxPrc * MICROPROFILE_COUNTER_WIDTH), nY0 + nHeight, 0xffffffff, MicroProfileBoxTypeFlat);
- MicroProfileDrawBox(nX+1, nY0+1, nX + MICROPROFILE_COUNTER_WIDTH - 1, nY0 + nHeight - 1, nBackColor, MicroProfileBoxTypeFlat);
- MicroProfileDrawBox(nX+1, nY0+1, nX + (int)(fCounterPrc * (MICROPROFILE_COUNTER_WIDTH - 1)), nY0 + nHeight - 1, 0xff0088ff, MicroProfileBoxTypeFlat);
- }
-
- nOffset++;
- if(!CI.nClosed)
- {
- int nChild = CI.nFirstChild;
- while(nChild != -1)
- {
- nOffset = MicroProfileDrawCounterRecursive(nChild, nY, nOffset, nTimerWidth);
- nChild = S.CounterInfo[nChild].nSibling;
- }
- }
-
-
- return nOffset;
-}
-
-void MicroProfileDrawCounterView(uint32_t nScreenWidth, uint32_t nScreenHeight)
-{
- MicroProfile& S = *MicroProfileGet();
- MICROPROFILE_SCOPE(g_MicroProfileDrawBarView);
-
- UI.nCounterWidthTemp = 7;
- UI.nLimitWidthTemp = 7;
- const uint32_t nHeight = MICROPROFILE_TEXT_HEIGHT;
- uint32_t nTimerWidth = 7 * (MICROPROFILE_TEXT_WIDTH+1);
- for(uint32_t i = 0; i < S.nNumCounters; ++i)
- {
- uint32_t nWidth = (2+S.CounterInfo[i].nNameLen + MICROPROFILE_COUNTER_INDENT*S.CounterInfo[i].nLevel) * (MICROPROFILE_TEXT_WIDTH+1);
- nTimerWidth = MicroProfileMax(nTimerWidth, nWidth);
- }
- uint32_t nX = nTimerWidth + UI.nOffsetX[MP_DRAW_COUNTERS];
- uint32_t nY = nHeight + 3 - UI.nOffsetY[MP_DRAW_COUNTERS];
- uint32_t nNumCounters = S.nNumCounters;
- nX = 0;
- nY = (2*nHeight) + 3 - UI.nOffsetY[MP_DRAW_COUNTERS];
- uint32_t nOffset = 0;
- for(uint32_t i = 0; i < nNumCounters; ++i)
- {
- if(S.CounterInfo[i].nParent == -1)
- {
- nOffset = MicroProfileDrawCounterRecursive(i, nY, nOffset, nTimerWidth);
- }
- }
- nX = 0;
- MicroProfileDrawHeader(nX, nTimerWidth, "Name");
- nX += nTimerWidth;
- MicroProfileDrawHeader(nX, UI.nCounterWidth + 1 * (MICROPROFILE_TEXT_WIDTH*3), "Value");
- nX += UI.nCounterWidth;
- nX += 1 * (MICROPROFILE_TEXT_WIDTH*3);
- MicroProfileDrawHeader(nX, UI.nLimitWidth + MICROPROFILE_COUNTER_WIDTH, "Limit");
- uint32_t nTotalWidth = nTimerWidth + UI.nCounterWidth + MICROPROFILE_COUNTER_WIDTH + UI.nLimitWidth + 3 * (MICROPROFILE_TEXT_WIDTH+1);
-
-
- MicroProfileDrawLineVertical(nTimerWidth-2, 0, nOffset*(nHeight+1)+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);
- MicroProfileDrawLineHorizontal(0, nTotalWidth, 2*MICROPROFILE_TEXT_HEIGHT + 3, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);
-
- UI.nCounterWidth = (1+UI.nCounterWidthTemp) * (MICROPROFILE_TEXT_WIDTH+1);
- UI.nLimitWidth = (1+UI.nLimitWidthTemp) * (MICROPROFILE_TEXT_WIDTH+1);
-
-}
-
-
-
-void MicroProfileDrawBarView(uint32_t nScreenWidth, uint32_t nScreenHeight)
-{
- MicroProfile& S = *MicroProfileGet();
-
- uint64_t nActiveGroup = S.nAllGroupsWanted ? S.nGroupMask : S.nActiveGroupWanted;
- if(!nActiveGroup)
- return;
- MICROPROFILE_SCOPE(g_MicroProfileDrawBarView);
-
- const uint32_t nHeight = MICROPROFILE_TEXT_HEIGHT;
- int nColorIndex = 0;
- uint32_t nMaxTimerNameLen = 1;
- uint32_t nNumTimers = 0;
- uint32_t nNumGroups = 0;
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- if(nActiveGroup & (1ll << j))
- {
- nNumTimers += S.GroupInfo[j].nNumTimers;
- nNumGroups += 1;
- nMaxTimerNameLen = MicroProfileMax(nMaxTimerNameLen, S.GroupInfo[j].nMaxTimerNameLen);
- }
- }
- uint32_t nTimerWidth = 2+(4+nMaxTimerNameLen) * (MICROPROFILE_TEXT_WIDTH+1);
- uint32_t nX = nTimerWidth + UI.nOffsetX[MP_DRAW_BARS];
- uint32_t nY = nHeight + 3 - UI.nOffsetY[MP_DRAW_BARS];
- uint32_t nBlockSize = 2 * nNumTimers;
- float* pTimers = (float*)alloca(nBlockSize * 8 * sizeof(float));
- float* pAverage = pTimers + nBlockSize;
- float* pMax = pTimers + 2 * nBlockSize;
- float* pMin = pTimers + 3 * nBlockSize;
- float* pCallAverage = pTimers + 4 * nBlockSize;
- float* pTimersExclusive = pTimers + 5 * nBlockSize;
- float* pAverageExclusive = pTimers + 6 * nBlockSize;
- float* pMaxExclusive = pTimers + 7 * nBlockSize;
- MicroProfileCalcTimers(pTimers, pAverage, pMax, pMin, pCallAverage, pTimersExclusive, pAverageExclusive, pMaxExclusive, nActiveGroup, nNumTimers);
- uint32_t nWidth = 0;
- {
- uint32_t nMetaIndex = 0;
- for(uint32_t i = 1; i ; i <<= 1)
- {
- if(S.nBars & i)
- {
- if(i >= MP_DRAW_META_FIRST)
- {
- if(nMetaIndex < MICROPROFILE_META_MAX && S.MetaCounters[nMetaIndex].pName)
- {
- uint32_t nStrWidth = (uint32_t)strlen(S.MetaCounters[nMetaIndex].pName);
- if(S.nBars & MP_DRAW_TIMERS)
- nWidth += 6 + (1+MICROPROFILE_TEXT_WIDTH) * (nStrWidth);
- if(S.nBars & MP_DRAW_AVERAGE)
- nWidth += 6 + (1+MICROPROFILE_TEXT_WIDTH) * (nStrWidth + 4);
- if(S.nBars & MP_DRAW_MAX)
- nWidth += 6 + (1+MICROPROFILE_TEXT_WIDTH) * (nStrWidth + 4);
- if (S.nBars & MP_DRAW_MIN)
- nWidth += 6 + (1 + MICROPROFILE_TEXT_WIDTH) * (nStrWidth + 4);
- }
- }
- else
- {
- nWidth += MICROPROFILE_BAR_WIDTH + 6 + 6 * (1+MICROPROFILE_TEXT_WIDTH);
- if(i & MP_DRAW_CALL_COUNT)
- nWidth += 6 + 6 * MICROPROFILE_TEXT_WIDTH;
- }
- }
- if(i >= MP_DRAW_META_FIRST)
- {
- ++nMetaIndex;
- }
- }
- nWidth += (1+nMaxTimerNameLen) * (MICROPROFILE_TEXT_WIDTH+1);
- for(uint32_t i = 0; i < nNumTimers+nNumGroups+1; ++i)
- {
- uint32_t nY0 = nY + i * (nHeight + 1);
- bool bInside = (UI.nActiveMenu == (uint32_t)-1) && ((UI.nMouseY >= nY0) && (UI.nMouseY < (nY0 + nHeight + 1)));
- MicroProfileDrawBox(nX, nY0, nWidth+nX, nY0 + (nHeight+1)+1, UI.nOpacityBackground | (g_nMicroProfileBackColors[nColorIndex++ & 1] + ((bInside) ? 0x002c2c2c : 0)));
- }
- nX += 10;
- }
- int nTotalHeight = (nNumTimers+nNumGroups+1) * (nHeight+1);
- uint32_t nLegendOffset = 1;
- if(S.nBars & MP_DRAW_TIMERS)
- nX += MicroProfileDrawBarArray(nX, nY, pTimers, "Time", nTotalHeight) + 1;
- if(S.nBars & MP_DRAW_AVERAGE)
- nX += MicroProfileDrawBarArray(nX, nY, pAverage, "Average", nTotalHeight) + 1;
- if(S.nBars & MP_DRAW_MAX)
- nX += MicroProfileDrawBarArray(nX, nY, pMax, (!UI.bShowSpikes) ? "Max Time" : "Max Time, Spike", nTotalHeight, UI.bShowSpikes ? pAverage : NULL) + 1;
- if (S.nBars & MP_DRAW_MIN)
- nX += MicroProfileDrawBarArray(nX, nY, pMin, (!UI.bShowSpikes) ? "Min Time" : "Min Time, Spike", nTotalHeight, UI.bShowSpikes ? pAverage : NULL) + 1;
- if(S.nBars & MP_DRAW_CALL_COUNT)
- {
- nX += MicroProfileDrawBarArray(nX, nY, pCallAverage, "Call Average", nTotalHeight) + 1;
- nX += MicroProfileDrawBarCallCount(nX, nY, "Count") + 1;
- }
- if(S.nBars & MP_DRAW_TIMERS_EXCLUSIVE)
- nX += MicroProfileDrawBarArray(nX, nY, pTimersExclusive, "Exclusive Time", nTotalHeight) + 1;
- if(S.nBars & MP_DRAW_AVERAGE_EXCLUSIVE)
- nX += MicroProfileDrawBarArray(nX, nY, pAverageExclusive, "Exclusive Average", nTotalHeight) + 1;
- if(S.nBars & MP_DRAW_MAX_EXCLUSIVE)
- nX += MicroProfileDrawBarArray(nX, nY, pMaxExclusive, (!UI.bShowSpikes) ? "Exclusive Max Time" :"Excl Max Time, Spike", nTotalHeight, UI.bShowSpikes ? pAverageExclusive : NULL) + 1;
-
- for(int i = 0; i < MICROPROFILE_META_MAX; ++i)
- {
- if(0 != (S.nBars & (MP_DRAW_META_FIRST<= nY0) && (UI.nMouseY < (nY0 + nHeight + 1)));
- MicroProfileDrawBox(nX, nY0, nTimerWidth, nY0 + (nHeight+1)+1, 0xff000000 | (g_nMicroProfileBackColors[nColorIndex++ & 1] + ((bInside) ? 0x002c2c2c : 0)));
- }
- nX += MicroProfileDrawBarLegend(nX, nY, nTotalHeight, nTimerWidth-5) + 1;
-
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- if(nActiveGroup & (1ll << j))
- {
- MicroProfileDrawText(nX, nY + (1+nHeight) * nLegendOffset, (uint32_t)-1, S.GroupInfo[j].pName, S.GroupInfo[j].nNameLen);
- nLegendOffset += S.GroupInfo[j].nNumTimers+1;
- }
- }
- MicroProfileDrawHeader(nX, nTimerWidth-5, "Group");
- MicroProfileDrawTextRight(nTimerWidth-3, MICROPROFILE_TEXT_HEIGHT + 2, (uint32_t)-1, "Timer", 5);
- MicroProfileDrawLineVertical(nTimerWidth, 0, nTotalHeight+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);
- MicroProfileDrawLineHorizontal(0, nWidth, 2*MICROPROFILE_TEXT_HEIGHT + 3, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);
-}
-
-typedef const char* (*MicroProfileSubmenuCallback)(int, bool* bSelected);
-typedef void (*MicroProfileClickCallback)(int);
-
-
-const char* MicroProfileUIMenuMode(int nIndex, bool* bSelected)
-{
- MicroProfile& S = *MicroProfileGet();
- switch(nIndex)
- {
- case 0:
- *bSelected = S.nDisplay == MP_DRAW_DETAILED;
- return "Detailed";
- case 1:
- *bSelected = S.nDisplay == MP_DRAW_BARS;
- return "Timers";
- case 2:
- *bSelected = S.nDisplay == MP_DRAW_COUNTERS;
- return "Counters";
- case 3:
- *bSelected = S.nDisplay == MP_DRAW_HIDDEN;
- return "Hidden";
- case 4:
- *bSelected = false;
- return "Off";
- case 5:
- *bSelected = false;
- return "------";
- case 6:
- *bSelected = S.nForceEnable != 0;
- return "Force Enable";
-
- default: return 0;
- }
-}
-
-const char* MicroProfileUIMenuGroups(int nIndex, bool* bSelected)
-{
- MicroProfile& S = *MicroProfileGet();
- *bSelected = false;
- if(nIndex == 0)
- {
- *bSelected = S.nAllGroupsWanted != 0;
- return "[ALL]";
- }
- else
- {
- nIndex = nIndex-1;
- if(nIndex < (int)UI.GroupMenuCount)
- {
- MicroProfileGroupMenuItem& Item = UI.GroupMenu[nIndex];
- static char buffer[MICROPROFILE_NAME_MAX_LEN+32];
- if(Item.nIsCategory)
- {
- uint64_t nGroupMask = S.CategoryInfo[Item.nIndex].nGroupMask;
- *bSelected = nGroupMask == (nGroupMask & S.nActiveGroupWanted);
- snprintf(buffer, sizeof(buffer)-1, "[%s]", Item.pName);
- }
- else
- {
- *bSelected = 0 != (S.nActiveGroupWanted & (1ll << Item.nIndex));
- snprintf(buffer, sizeof(buffer)-1, " %s", Item.pName);
- }
- return buffer;
- }
- return 0;
- }
-}
-
-const char* MicroProfileUIMenuAggregate(int nIndex, bool* bSelected)
-{
- MicroProfile& S = *MicroProfileGet();
- int nNumPresets = (int)sizeof(g_MicroProfileAggregatePresets) / (int)sizeof(g_MicroProfileAggregatePresets[0]);
- if(nIndex < nNumPresets)
- {
- int val = g_MicroProfileAggregatePresets[nIndex];
- *bSelected = (int)S.nAggregateFlip == val;
- if(0 == val)
- return "Infinite";
- else
- {
- static char buf[128];
- snprintf(buf, sizeof(buf)-1, "%7d", val);
- return buf;
- }
- }
- return 0;
-
-}
-
-const char* MicroProfileUIMenuTimers(int nIndex, bool* bSelected)
-{
- MicroProfile& S = *MicroProfileGet();
- *bSelected = 0 != (S.nBars & (1 << nIndex));
- switch(nIndex)
- {
- case 0: return "Time";
- case 1: return "Average";
- case 2: return "Max";
- case 3: return "Min";
- case 4: return "Call Count";
- case 5: return "Exclusive Timers";
- case 6: return "Exclusive Average";
- case 7: return "Exclusive Max";
- }
- int nMetaIndex = nIndex - 7;
- if(nMetaIndex < MICROPROFILE_META_MAX)
- {
- return S.MetaCounters[nMetaIndex].pName;
- }
- return 0;
-}
-
-const char* MicroProfileUIMenuOptions(int nIndex, bool* bSelected)
-{
- MicroProfile& S = *MicroProfileGet();
- if(nIndex >= MICROPROFILE_OPTION_SIZE) return 0;
- switch(UI.Options[nIndex].nSubType)
- {
- case 0:
- *bSelected = S.fReferenceTime == g_MicroProfileReferenceTimePresets[UI.Options[nIndex].nIndex];
- break;
- case 1:
- *bSelected = UI.nOpacityBackground>>24 == g_MicroProfileOpacityPresets[UI.Options[nIndex].nIndex];
- break;
- case 2:
- *bSelected = UI.nOpacityForeground>>24 == g_MicroProfileOpacityPresets[UI.Options[nIndex].nIndex];
- break;
- case 3:
- *bSelected = UI.bShowSpikes;
- break;
-#if MICROPROFILE_CONTEXT_SWITCH_TRACE
- case 4:
- {
- switch(UI.Options[nIndex].nIndex)
- {
- case 0:
- *bSelected = S.bContextSwitchRunning;
- break;
- case 1:
- *bSelected = S.bContextSwitchAllThreads;
- break;
- case 2:
- *bSelected = S.bContextSwitchNoBars;
- break;
- }
- }
- break;
-#endif
- }
- return UI.Options[nIndex].Text;
-}
-
-const char* MicroProfileUIMenuPreset(int nIndex, bool* bSelected)
-{
- static char buf[128];
- *bSelected = false;
- int nNumPresets = sizeof(g_MicroProfilePresetNames) / sizeof(g_MicroProfilePresetNames[0]);
- int nIndexSave = nIndex - nNumPresets - 1;
- if(nIndex == nNumPresets)
- return "--";
- else if(nIndexSave >=0 && nIndexSave = 0 && nIndexSave < nNumPresets)
- {
- MicroProfileSavePreset(g_MicroProfilePresetNames[nIndexSave]);
- }
- else if(nIndex >= 0 && nIndex < nNumPresets)
- {
- MicroProfileLoadPreset(g_MicroProfilePresetNames[nIndex]);
- }
-}
-
-void MicroProfileUIClickCustom(int nIndex)
-{
- if(nIndex == 0)
- {
- MicroProfileCustomGroupDisable();
- }
- else
- {
- MicroProfileCustomGroupEnable(nIndex-2);
- }
-
-}
-
-void MicroProfileUIClickEmpty(int nIndex)
-{
-
-}
-
-
-void MicroProfileDrawMenu(uint32_t nWidth, uint32_t nHeight)
-{
- MicroProfile& S = *MicroProfileGet();
-
- uint32_t nX = 0;
- uint32_t nY = 0;
-#define SBUF_SIZE 256
- char buffer[256];
- MicroProfileDrawBox(nX, nY, nX + nWidth, nY + (MICROPROFILE_TEXT_HEIGHT+1)+1, 0xff000000|g_nMicroProfileBackColors[1]);
-
-#define MICROPROFILE_MENU_MAX 16
- const char* pMenuText[MICROPROFILE_MENU_MAX] = {0};
- uint32_t nMenuX[MICROPROFILE_MENU_MAX] = {0};
- uint32_t nNumMenuItems = 0;
-
- int nLen = snprintf(buffer, 127, "MicroProfile");
- MicroProfileDrawText(nX, nY, (uint32_t)-1, buffer, nLen);
- nX += (sizeof("MicroProfile")+2) * (MICROPROFILE_TEXT_WIDTH+1);
- pMenuText[nNumMenuItems++] = "Mode";
- pMenuText[nNumMenuItems++] = "Groups";
- char AggregateText[64];
- snprintf(AggregateText, sizeof(AggregateText)-1, "Aggregate[%d]", S.nAggregateFlip ? S.nAggregateFlip : S.nAggregateFlipCount);
- pMenuText[nNumMenuItems++] = &AggregateText[0];
- pMenuText[nNumMenuItems++] = "Timers";
- pMenuText[nNumMenuItems++] = "Options";
- pMenuText[nNumMenuItems++] = "Preset";
- pMenuText[nNumMenuItems++] = "Custom";
- const int nPauseIndex = nNumMenuItems;
- pMenuText[nNumMenuItems++] = S.nRunning ? "Pause" : "Unpause";
- pMenuText[nNumMenuItems++] = "Help";
-
- if(S.nOverflow)
- {
- pMenuText[nNumMenuItems++] = "!BUFFERSFULL!";
- }
-
-
- if(UI.GroupMenuCount != S.nGroupCount + S.nCategoryCount)
- {
- UI.GroupMenuCount = S.nGroupCount + S.nCategoryCount;
- for(uint32_t i = 0; i < S.nCategoryCount; ++i)
- {
- UI.GroupMenu[i].nIsCategory = 1;
- UI.GroupMenu[i].nCategoryIndex = i;
- UI.GroupMenu[i].nIndex = i;
- UI.GroupMenu[i].pName = S.CategoryInfo[i].pName;
- }
- for(uint32_t i = 0; i < S.nGroupCount; ++i)
- {
- uint32_t idx = i + S.nCategoryCount;
- UI.GroupMenu[idx].nIsCategory = 0;
- UI.GroupMenu[idx].nCategoryIndex = S.GroupInfo[i].nCategory;
- UI.GroupMenu[idx].nIndex = i;
- UI.GroupMenu[idx].pName = S.GroupInfo[i].pName;
- }
- std::sort(&UI.GroupMenu[0], &UI.GroupMenu[UI.GroupMenuCount],
- [] (const MicroProfileGroupMenuItem& l, const MicroProfileGroupMenuItem& r) -> bool
- {
- if(l.nCategoryIndex < r.nCategoryIndex)
- {
- return true;
- }
- else if(r.nCategoryIndex < l.nCategoryIndex)
- {
- return false;
- }
- if(r.nIsCategory || l.nIsCategory)
- {
- return l.nIsCategory > r.nIsCategory;
- }
- return MP_STRCASECMP(l.pName, r.pName)<0;
- }
- );
- }
-
- MicroProfileSubmenuCallback GroupCallback[MICROPROFILE_MENU_MAX] =
- {
- MicroProfileUIMenuMode,
- MicroProfileUIMenuGroups,
- MicroProfileUIMenuAggregate,
- MicroProfileUIMenuTimers,
- MicroProfileUIMenuOptions,
- MicroProfileUIMenuPreset,
- MicroProfileUIMenuCustom,
- MicroProfileUIMenuEmpty,
- MicroProfileUIMenuEmpty,
- MicroProfileUIMenuEmpty,
- };
-
- MicroProfileClickCallback CBClick[MICROPROFILE_MENU_MAX] =
- {
- MicroProfileUIClickMode,
- MicroProfileUIClickGroups,
- MicroProfileUIClickAggregate,
- MicroProfileUIClickTimers,
- MicroProfileUIClickOptions,
- MicroProfileUIClickPreset,
- MicroProfileUIClickCustom,
- MicroProfileUIClickEmpty,
- MicroProfileUIClickEmpty,
- MicroProfileUIClickEmpty,
- };
-
-
- uint32_t nSelectMenu = (uint32_t)-1;
- for(uint32_t i = 0; i < nNumMenuItems; ++i)
- {
- nMenuX[i] = nX;
- uint32_t nLen = (uint32_t)strlen(pMenuText[i]);
- uint32_t nEnd = nX + nLen * (MICROPROFILE_TEXT_WIDTH+1);
- if(UI.nMouseY <= MICROPROFILE_TEXT_HEIGHT && UI.nMouseX <= nEnd && UI.nMouseX >= nX)
- {
- MicroProfileDrawBox(nX-1, nY, nX + nLen * (MICROPROFILE_TEXT_WIDTH+1), nY +(MICROPROFILE_TEXT_HEIGHT+1)+1, 0xff888888);
- nSelectMenu = i;
- if((UI.nMouseLeft || UI.nMouseRight) && (int)i == nPauseIndex)
- {
- S.nToggleRunning = 1;
- }
- }
- MicroProfileDrawText(nX, nY, (uint32_t)-1, pMenuText[i], (uint32_t)strlen(pMenuText[i]));
- nX += (nLen+1) * (MICROPROFILE_TEXT_WIDTH+1);
- }
- uint32_t nMenu = nSelectMenu != (uint32_t)-1 ? nSelectMenu : UI.nActiveMenu;
- UI.nActiveMenu = nMenu;
- if((uint32_t)-1 != nMenu)
- {
- nX = nMenuX[nMenu];
- nY += MICROPROFILE_TEXT_HEIGHT+1;
- MicroProfileSubmenuCallback CB = GroupCallback[nMenu];
- int nNumLines = 0;
- bool bSelected = false;
- const char* pString = CB(nNumLines, &bSelected);
- uint32_t nWidth = 0, nHeight = 0;
- while(pString)
- {
- nWidth = MicroProfileMax(nWidth, (int)strlen(pString));
- nNumLines++;
- pString = CB(nNumLines, &bSelected);
- }
- nWidth = (2+nWidth) * (MICROPROFILE_TEXT_WIDTH+1);
- nHeight = nNumLines * (MICROPROFILE_TEXT_HEIGHT+1);
- if(UI.nMouseY <= nY + nHeight+0 && UI.nMouseY >= nY-0 && UI.nMouseX <= nX + nWidth + 0 && UI.nMouseX >= nX - 0)
- {
- UI.nActiveMenu = nMenu;
- }
- else if(nSelectMenu == (uint32_t)-1)
- {
- UI.nActiveMenu = (uint32_t)-1;
- }
- MicroProfileDrawBox(nX, nY, nX + nWidth, nY + nHeight, 0xff000000|g_nMicroProfileBackColors[1]);
- for(int i = 0; i < nNumLines; ++i)
- {
- bool bSelected = false;
- const char* pString = CB(i, &bSelected);
- if(UI.nMouseY >= nY && UI.nMouseY < nY + MICROPROFILE_TEXT_HEIGHT + 1)
- {
- if(UI.nMouseLeft || UI.nMouseRight)
- {
- CBClick[nMenu](i);
- }
- MicroProfileDrawBox(nX, nY, nX + nWidth, nY + MICROPROFILE_TEXT_HEIGHT + 1, 0xff888888);
- }
- int nLen = snprintf(buffer, SBUF_SIZE-1, "%c %s", bSelected ? '*' : ' ' ,pString);
- MicroProfileDrawText(nX, nY, (uint32_t)-1, buffer, nLen);
- nY += MICROPROFILE_TEXT_HEIGHT+1;
- }
- }
-
-
- {
- static char FrameTimeMessage[64];
- float fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- uint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;
- float fMs = fToMs * (S.nFlipTicks);
- float fAverageMs = fToMs * (S.nFlipAggregateDisplay / nAggregateFrames);
- float fMaxMs = fToMs * S.nFlipMaxDisplay;
- int nLen = snprintf(FrameTimeMessage, sizeof(FrameTimeMessage)-1, "Time[%6.2f] Avg[%6.2f] Max[%6.2f]", fMs, fAverageMs, fMaxMs);
- pMenuText[nNumMenuItems++] = &FrameTimeMessage[0];
- MicroProfileDrawText(nWidth - nLen * (MICROPROFILE_TEXT_WIDTH+1), 0, -1, FrameTimeMessage, nLen);
- }
-}
-
-
-void MicroProfileMoveGraph()
-{
-
- int nZoom = UI.nMouseWheelDelta;
- int nPanX = 0;
- int nPanY = 0;
- static int X = 0, Y = 0;
- if(UI.nMouseDownLeft && !UI.nModDown)
- {
- nPanX = UI.nMouseX - X;
- nPanY = UI.nMouseY - Y;
- }
- X = UI.nMouseX;
- Y = UI.nMouseY;
-
- if(nZoom)
- {
- float fOldRange = UI.fDetailedRange;
- if(nZoom>0)
- {
- UI.fDetailedRangeTarget = UI.fDetailedRange *= UI.nModDown ? 1.40f : 1.05f;
- }
- else
- {
- float fNewDetailedRange = UI.fDetailedRange / (UI.nModDown ? 1.40f : 1.05f);
- if(fNewDetailedRange < 1e-4f) //100ns
- fNewDetailedRange = 1e-4f;
- UI.fDetailedRangeTarget = UI.fDetailedRange = fNewDetailedRange;
- }
-
- float fDiff = fOldRange - UI.fDetailedRange;
- float fMousePrc = MicroProfileMax((float)UI.nMouseX / UI.nWidth ,0.f);
- UI.fDetailedOffsetTarget = UI.fDetailedOffset += fDiff * fMousePrc;
-
- }
- if(nPanX)
- {
- UI.fDetailedOffsetTarget = UI.fDetailedOffset += -nPanX * UI.fDetailedRange / UI.nWidth;
- }
- int nMode = MicroProfileGet()->nDisplay;
- if(nMode < MP_DRAW_SIZE)
- {
- UI.nOffsetY[nMode] -= nPanY;
- UI.nOffsetX[nMode] += nPanX;
- if(UI.nOffsetX[nMode] > 0)
- UI.nOffsetX[nMode] = 0;
- if(UI.nOffsetY[nMode] < 0)
- UI.nOffsetY[nMode] = 0;
- }
-}
-
-void MicroProfileDrawCustom(uint32_t nWidth, uint32_t nHeight)
-{
- if((uint32_t)-1 != UI.nCustomActive)
- {
- MicroProfile& S = *MicroProfileGet();
- MP_ASSERT(UI.nCustomActive < MICROPROFILE_CUSTOM_MAX);
- MicroProfileCustom* pCustom = &UI.Custom[UI.nCustomActive];
- uint32_t nCount = pCustom->nNumTimers;
- uint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;
- uint32_t nExtraOffset = 1 + ((pCustom->nFlags & MICROPROFILE_CUSTOM_STACK) != 0 ? 3 : 0);
- uint32_t nOffsetYBase = nHeight - (nExtraOffset+nCount)* (1+MICROPROFILE_TEXT_HEIGHT) - MICROPROFILE_CUSTOM_PADDING;
- uint32_t nOffsetY = nOffsetYBase;
- float fReference = pCustom->fReference;
- float fRcpReference = 1.f / fReference;
- uint32_t nReducedWidth = UI.nWidth - 2*MICROPROFILE_CUSTOM_PADDING - MICROPROFILE_GRAPH_WIDTH;
-
- char Buffer[MICROPROFILE_NAME_MAX_LEN*2+1];
- float* pTime = (float*)alloca(sizeof(float)*nCount);
- float* pTimeAvg = (float*)alloca(sizeof(float)*nCount);
- float* pTimeMax = (float*)alloca(sizeof(float)*nCount);
- uint32_t* pColors = (uint32_t*)alloca(sizeof(uint32_t)*nCount);
- uint32_t nMaxOffsetX = 0;
- MicroProfileDrawBox(MICROPROFILE_CUSTOM_PADDING-1, nOffsetY-1, MICROPROFILE_CUSTOM_PADDING+nReducedWidth+1, UI.nHeight - MICROPROFILE_CUSTOM_PADDING+1, 0x88000000|g_nMicroProfileBackColors[0]);
-
- for(uint32_t i = 0; i < nCount; ++i)
- {
- uint16_t nTimerIndex = MicroProfileGetTimerIndex(pCustom->pTimers[i]);
- uint16_t nGroupIndex = MicroProfileGetGroupIndex(pCustom->pTimers[i]);
- float fToMs = MicroProfileTickToMsMultiplier(S.GroupInfo[nGroupIndex].Type == MicroProfileTokenTypeGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());
- pTime[i] = S.Frame[nTimerIndex].nTicks * fToMs;
- pTimeAvg[i] = fToMs * (S.Aggregate[nTimerIndex].nTicks / nAggregateFrames);
- pTimeMax[i] = fToMs * (S.AggregateMax[nTimerIndex]);
- pColors[i] = S.TimerInfo[nTimerIndex].nColor;
- }
-
- MicroProfileDrawText(MICROPROFILE_CUSTOM_PADDING + 3*MICROPROFILE_TEXT_WIDTH, nOffsetY, (uint32_t)-1, "Avg", sizeof("Avg")-1);
- MicroProfileDrawText(MICROPROFILE_CUSTOM_PADDING + 13*MICROPROFILE_TEXT_WIDTH, nOffsetY, (uint32_t)-1, "Max", sizeof("Max")-1);
- for(uint32_t i = 0; i < nCount; ++i)
- {
- nOffsetY += (1+MICROPROFILE_TEXT_HEIGHT);
- uint16_t nTimerIndex = MicroProfileGetTimerIndex(pCustom->pTimers[i]);
- uint16_t nGroupIndex = MicroProfileGetGroupIndex(pCustom->pTimers[i]);
- MicroProfileTimerInfo* pTimerInfo = &S.TimerInfo[nTimerIndex];
- int nSize;
- uint32_t nOffsetX = MICROPROFILE_CUSTOM_PADDING;
- nSize = snprintf(Buffer, sizeof(Buffer)-1, "%6.2f", pTimeAvg[i]);
- MicroProfileDrawText(nOffsetX, nOffsetY, (uint32_t)-1, Buffer, nSize);
- nOffsetX += (nSize+2) * (MICROPROFILE_TEXT_WIDTH+1);
- nSize = snprintf(Buffer, sizeof(Buffer)-1, "%6.2f", pTimeMax[i]);
- MicroProfileDrawText(nOffsetX, nOffsetY, (uint32_t)-1, Buffer, nSize);
- nOffsetX += (nSize+2) * (MICROPROFILE_TEXT_WIDTH+1);
- nSize = snprintf(Buffer, sizeof(Buffer)-1, "%s:%s", S.GroupInfo[nGroupIndex].pName, pTimerInfo->pName);
- MicroProfileDrawText(nOffsetX, nOffsetY, pTimerInfo->nColor, Buffer, nSize);
- nOffsetX += (nSize+2) * (MICROPROFILE_TEXT_WIDTH+1);
- nMaxOffsetX = MicroProfileMax(nMaxOffsetX, nOffsetX);
- }
- uint32_t nMaxWidth = nReducedWidth- nMaxOffsetX;
-
- if(pCustom->nFlags & MICROPROFILE_CUSTOM_BARS)
- {
- nOffsetY = nOffsetYBase;
- float* pMs = pCustom->nFlags & MICROPROFILE_CUSTOM_BAR_SOURCE_MAX ? pTimeMax : pTimeAvg;
- const char* pString = pCustom->nFlags & MICROPROFILE_CUSTOM_BAR_SOURCE_MAX ? "Max" : "Avg";
- MicroProfileDrawText(nMaxOffsetX, nOffsetY, (uint32_t)-1, pString, (uint32_t)strlen(pString));
- int nSize = snprintf(Buffer, sizeof(Buffer)-1, "%6.2fms", fReference);
- MicroProfileDrawText(nReducedWidth - (1+nSize) * (MICROPROFILE_TEXT_WIDTH+1), nOffsetY, (uint32_t)-1, Buffer, nSize);
- for(uint32_t i = 0; i < nCount; ++i)
- {
- nOffsetY += (1+MICROPROFILE_TEXT_HEIGHT);
- uint32_t nWidth = MicroProfileMin(nMaxWidth, (uint32_t)(nMaxWidth * pMs[i] * fRcpReference));
- MicroProfileDrawBox(nMaxOffsetX, nOffsetY, nMaxOffsetX+nWidth, nOffsetY+MICROPROFILE_TEXT_HEIGHT, pColors[i]|0xff000000);
- }
- }
- if(pCustom->nFlags & MICROPROFILE_CUSTOM_STACK)
- {
- nOffsetY += 2*(1+MICROPROFILE_TEXT_HEIGHT);
- const char* pString = pCustom->nFlags & MICROPROFILE_CUSTOM_STACK_SOURCE_MAX ? "Max" : "Avg";
- MicroProfileDrawText(MICROPROFILE_CUSTOM_PADDING, nOffsetY, (uint32_t)-1, pString, (uint32_t)strlen(pString));
- int nSize = snprintf(Buffer, sizeof(Buffer)-1, "%6.2fms", fReference);
- MicroProfileDrawText(nReducedWidth - (1+nSize) * (MICROPROFILE_TEXT_WIDTH+1), nOffsetY, (uint32_t)-1, Buffer, nSize);
- nOffsetY += (1+MICROPROFILE_TEXT_HEIGHT);
- float fPosX = MICROPROFILE_CUSTOM_PADDING;
- float* pMs = pCustom->nFlags & MICROPROFILE_CUSTOM_STACK_SOURCE_MAX ? pTimeMax : pTimeAvg;
- for(uint32_t i = 0; i < nCount; ++i)
- {
- float fWidth = pMs[i] * fRcpReference * nReducedWidth;
- uint32_t nX = (uint32_t)fPosX;
- fPosX += fWidth;
- uint32_t nXEnd = (uint32_t)fPosX;
- if(nX < nXEnd)
- {
- MicroProfileDrawBox(nX, nOffsetY, nXEnd, nOffsetY+MICROPROFILE_TEXT_HEIGHT, pColors[i]|0xff000000);
- }
- }
- }
- }
-}
-void MicroProfileDraw(uint32_t nWidth, uint32_t nHeight)
-{
- MICROPROFILE_SCOPE(g_MicroProfileDraw);
- MicroProfile& S = *MicroProfileGet();
-
- {
- static int once = 0;
- if(0 == once)
- {
- std::recursive_mutex& m = MicroProfileGetMutex();
- m.lock();
- MicroProfileInitUI();
- uint32_t nDisplay = S.nDisplay;
- MicroProfileLoadPreset(MICROPROFILE_DEFAULT_PRESET);
- once++;
- S.nDisplay = nDisplay;// dont load display, just state
- m.unlock();
-
- }
- }
-
-
- if(S.nDisplay)
- {
- std::recursive_mutex& m = MicroProfileGetMutex();
- m.lock();
- UI.nWidth = nWidth;
- UI.nHeight = nHeight;
- UI.nHoverToken = MICROPROFILE_INVALID_TOKEN;
- UI.nHoverTime = 0;
- UI.nHoverFrame = -1;
- if(S.nDisplay != MP_DRAW_DETAILED)
- S.nContextSwitchHoverThread = S.nContextSwitchHoverThreadAfter = S.nContextSwitchHoverThreadBefore = -1;
- MicroProfileMoveGraph();
-
-
- if(S.nDisplay == MP_DRAW_DETAILED)
- {
- MicroProfileDrawDetailedView(nWidth, nHeight);
- }
- else if(S.nDisplay == MP_DRAW_BARS && S.nBars)
- {
- MicroProfileDrawBarView(nWidth, nHeight);
- }
- else if(S.nDisplay == MP_DRAW_COUNTERS)
- {
- MicroProfileDrawCounterView(nWidth, nHeight);
- }
-
- MicroProfileDrawMenu(nWidth, nHeight);
- bool bMouseOverGraph = MicroProfileDrawGraph(nWidth, nHeight);
- MicroProfileDrawCustom(nWidth, nHeight);
- bool bHidden = S.nDisplay == MP_DRAW_HIDDEN;
- if(!bHidden)
- {
- uint32_t nLockedToolTipX = 3;
- bool bDeleted = false;
- for(int i = 0; i < MICROPROFILE_TOOLTIP_MAX_LOCKED; ++i)
- {
- int nIndex = (g_MicroProfileUI.LockedToolTipFront + i) % MICROPROFILE_TOOLTIP_MAX_LOCKED;
- if(g_MicroProfileUI.LockedToolTips[nIndex].ppStrings[0])
- {
- uint32_t nToolTipWidth = 0, nToolTipHeight = 0;
- MicroProfileFloatWindowSize(g_MicroProfileUI.LockedToolTips[nIndex].ppStrings, g_MicroProfileUI.LockedToolTips[nIndex].nNumStrings, 0, nToolTipWidth, nToolTipHeight, 0);
- uint32_t nStartY = nHeight - nToolTipHeight - 2;
- if(!bDeleted && UI.nMouseY > nStartY && UI.nMouseX > nLockedToolTipX && UI.nMouseX <= nLockedToolTipX + nToolTipWidth && (UI.nMouseLeft || UI.nMouseRight) )
- {
- bDeleted = true;
- int j = i;
- for(; j < MICROPROFILE_TOOLTIP_MAX_LOCKED-1; ++j)
- {
- int nIndex0 = (g_MicroProfileUI.LockedToolTipFront + j) % MICROPROFILE_TOOLTIP_MAX_LOCKED;
- int nIndex1 = (g_MicroProfileUI.LockedToolTipFront + j+1) % MICROPROFILE_TOOLTIP_MAX_LOCKED;
- MicroProfileStringArrayCopy(&g_MicroProfileUI.LockedToolTips[nIndex0], &g_MicroProfileUI.LockedToolTips[nIndex1]);
- }
- MicroProfileStringArrayClear(&g_MicroProfileUI.LockedToolTips[(g_MicroProfileUI.LockedToolTipFront + j) % MICROPROFILE_TOOLTIP_MAX_LOCKED]);
- }
- else
- {
- MicroProfileDrawFloatWindow(nLockedToolTipX, nHeight-nToolTipHeight-2, &g_MicroProfileUI.LockedToolTips[nIndex].ppStrings[0], g_MicroProfileUI.LockedToolTips[nIndex].nNumStrings, g_MicroProfileUI.nLockedToolTipColor[nIndex]);
- nLockedToolTipX += nToolTipWidth + 4;
- }
- }
- }
-
- if(UI.nActiveMenu == 8)
- {
- if(S.nDisplay & MP_DRAW_DETAILED)
- {
- MicroProfileStringArray DetailedHelp;
- MicroProfileStringArrayClear(&DetailedHelp);
- MicroProfileStringArrayFormat(&DetailedHelp, "%s", MICROPROFILE_HELP_LEFT);
- MicroProfileStringArrayAddLiteral(&DetailedHelp, "Toggle Graph");
- MicroProfileStringArrayFormat(&DetailedHelp, "%s", MICROPROFILE_HELP_ALT);
- MicroProfileStringArrayAddLiteral(&DetailedHelp, "Zoom");
- MicroProfileStringArrayFormat(&DetailedHelp, "%s + %s", MICROPROFILE_HELP_MOD, MICROPROFILE_HELP_LEFT);
- MicroProfileStringArrayAddLiteral(&DetailedHelp, "Lock Tooltip");
- MicroProfileStringArrayAddLiteral(&DetailedHelp, "Drag");
- MicroProfileStringArrayAddLiteral(&DetailedHelp, "Pan View");
- MicroProfileStringArrayAddLiteral(&DetailedHelp, "Mouse Wheel");
- MicroProfileStringArrayAddLiteral(&DetailedHelp, "Zoom");
- MicroProfileDrawFloatWindow(nWidth, MICROPROFILE_FRAME_HISTORY_HEIGHT+20, DetailedHelp.ppStrings, DetailedHelp.nNumStrings, 0xff777777);
-
- MicroProfileStringArray DetailedHistoryHelp;
- MicroProfileStringArrayClear(&DetailedHistoryHelp);
- MicroProfileStringArrayFormat(&DetailedHistoryHelp, "%s", MICROPROFILE_HELP_LEFT);
- MicroProfileStringArrayAddLiteral(&DetailedHistoryHelp, "Center View");
- MicroProfileStringArrayFormat(&DetailedHistoryHelp, "%s", MICROPROFILE_HELP_ALT);
- MicroProfileStringArrayAddLiteral(&DetailedHistoryHelp, "Zoom to frame");
- MicroProfileDrawFloatWindow(nWidth, 20, DetailedHistoryHelp.ppStrings, DetailedHistoryHelp.nNumStrings, 0xff777777);
-
-
-
- }
- else if(0 != (S.nDisplay & MP_DRAW_BARS) && S.nBars)
- {
- MicroProfileStringArray BarHelp;
- MicroProfileStringArrayClear(&BarHelp);
- MicroProfileStringArrayFormat(&BarHelp, "%s", MICROPROFILE_HELP_LEFT);
- MicroProfileStringArrayAddLiteral(&BarHelp, "Toggle Graph");
- MicroProfileStringArrayFormat(&BarHelp, "%s + %s", MICROPROFILE_HELP_MOD, MICROPROFILE_HELP_LEFT);
- MicroProfileStringArrayAddLiteral(&BarHelp, "Lock Tooltip");
- MicroProfileStringArrayAddLiteral(&BarHelp, "Drag");
- MicroProfileStringArrayAddLiteral(&BarHelp, "Pan View");
- MicroProfileDrawFloatWindow(nWidth, MICROPROFILE_FRAME_HISTORY_HEIGHT+20, BarHelp.ppStrings, BarHelp.nNumStrings, 0xff777777);
-
- }
- MicroProfileStringArray Debug;
- MicroProfileStringArrayClear(&Debug);
- MicroProfileStringArrayAddLiteral(&Debug, "Memory Usage");
- MicroProfileStringArrayFormat(&Debug, "%4.2fmb", S.nMemUsage / (1024.f * 1024.f));
-#if MICROPROFILE_WEBSERVER
- MicroProfileStringArrayAddLiteral(&Debug, "Web Server Port");
- MicroProfileStringArrayFormat(&Debug, "%d", MicroProfileWebServerPort());
-#endif
- uint32_t nFrameNext = (S.nFrameCurrent+1) % MICROPROFILE_MAX_FRAME_HISTORY;
- MicroProfileFrameState* pFrameCurrent = &S.Frames[S.nFrameCurrent];
- MicroProfileFrameState* pFrameNext = &S.Frames[nFrameNext];
-
-
- MicroProfileStringArrayAddLiteral(&Debug, "");
- MicroProfileStringArrayAddLiteral(&Debug, "");
- MicroProfileStringArrayAddLiteral(&Debug, "Usage");
- MicroProfileStringArrayAddLiteral(&Debug, "markers [frames] ");
-
-#if MICROPROFILE_CONTEXT_SWITCH_TRACE
- MicroProfileStringArrayAddLiteral(&Debug, "Context Switch");
- MicroProfileStringArrayFormat(&Debug, "%9d [%7d]", S.nContextSwitchUsage, MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE / S.nContextSwitchUsage );
-#endif
-
- for(int i = 0; i < MICROPROFILE_MAX_THREADS; ++i)
- {
- if(pFrameCurrent->nLogStart[i] && S.Pool[i])
- {
- uint32_t nEnd = pFrameNext->nLogStart[i];
- uint32_t nStart = pFrameCurrent->nLogStart[i];
- uint32_t nUsage = nStart < nEnd ? (nEnd - nStart) : (nEnd + MICROPROFILE_BUFFER_SIZE - nStart);
- uint32_t nFrameSupport = MICROPROFILE_BUFFER_SIZE / nUsage;
- MicroProfileStringArrayFormat(&Debug, "%s", &S.Pool[i]->ThreadName[0]);
- MicroProfileStringArrayFormat(&Debug, "%9d [%7d]", nUsage, nFrameSupport);
- }
- }
-
- MicroProfileDrawFloatWindow(0, nHeight-10, Debug.ppStrings, Debug.nNumStrings, 0xff777777);
- }
-
-
-
- if(UI.nActiveMenu == (uint32_t)-1 && !bMouseOverGraph)
- {
- if(UI.nHoverToken != MICROPROFILE_INVALID_TOKEN)
- {
- MicroProfileDrawFloatTooltip(UI.nMouseX, UI.nMouseY, (uint32_t)UI.nHoverToken, UI.nHoverTime);
- }
- else if(S.nContextSwitchHoverThreadAfter != (uint32_t)-1 && S.nContextSwitchHoverThreadBefore != (uint32_t)-1)
- {
- float fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- MicroProfileStringArray ToolTip;
- MicroProfileStringArrayClear(&ToolTip);
- MicroProfileStringArrayAddLiteral(&ToolTip, "Context Switch");
- MicroProfileStringArrayFormat(&ToolTip, "%04x", S.nContextSwitchHoverThread);
- MicroProfileStringArrayAddLiteral(&ToolTip, "Before");
- MicroProfileStringArrayFormat(&ToolTip, "%04x", S.nContextSwitchHoverThreadBefore);
- MicroProfileStringArrayAddLiteral(&ToolTip, "After");
- MicroProfileStringArrayFormat(&ToolTip, "%04x", S.nContextSwitchHoverThreadAfter);
- MicroProfileStringArrayAddLiteral(&ToolTip, "Duration");
- int64_t nDifference = MicroProfileLogTickDifference(S.nContextSwitchHoverTickIn, S.nContextSwitchHoverTickOut);
- MicroProfileStringArrayFormat(&ToolTip, "%6.2fms", fToMs * nDifference );
- MicroProfileStringArrayAddLiteral(&ToolTip, "CPU");
- MicroProfileStringArrayFormat(&ToolTip, "%d", S.nContextSwitchHoverCpu);
- MicroProfileDrawFloatWindow(UI.nMouseX, UI.nMouseY+20, &ToolTip.ppStrings[0], ToolTip.nNumStrings, -1);
-
-
- }
- else if(UI.nHoverFrame != -1)
- {
- uint32_t nNextFrame = (UI.nHoverFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY;
- int64_t nTick = S.Frames[UI.nHoverFrame].nFrameStartCpu;
- int64_t nTickNext = S.Frames[nNextFrame].nFrameStartCpu;
- int64_t nTickGpu = S.Frames[UI.nHoverFrame].nFrameStartGpu;
- int64_t nTickNextGpu = S.Frames[nNextFrame].nFrameStartGpu;
-
- float fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
- float fToMsGpu = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondGpu());
- float fMs = fToMs * (nTickNext - nTick);
- float fMsGpu = fToMsGpu * (nTickNextGpu - nTickGpu);
- MicroProfileStringArray ToolTip;
- MicroProfileStringArrayClear(&ToolTip);
- MicroProfileStringArrayFormat(&ToolTip, "Frame %d", UI.nHoverFrame);
- #if MICROPROFILE_DEBUG
- MicroProfileStringArrayFormat(&ToolTip, "%p", &S.Frames[UI.nHoverFrame]);
- #else
- MicroProfileStringArrayAddLiteral(&ToolTip, "");
- #endif
- MicroProfileStringArrayAddLiteral(&ToolTip, "CPU Time");
- MicroProfileStringArrayFormat(&ToolTip, "%6.2fms", fMs);
- MicroProfileStringArrayAddLiteral(&ToolTip, "GPU Time");
- MicroProfileStringArrayFormat(&ToolTip, "%6.2fms", fMsGpu);
- #if MICROPROFILE_DEBUG
- for(int i = 0; i < MICROPROFILE_MAX_THREADS; ++i)
- {
- if(S.Frames[UI.nHoverFrame].nLogStart[i])
- {
- MicroProfileStringArrayFormat(&ToolTip, "%d", i);
- MicroProfileStringArrayFormat(&ToolTip, "%d", S.Frames[UI.nHoverFrame].nLogStart[i]);
- }
- }
- #endif
- MicroProfileDrawFloatWindow(UI.nMouseX, UI.nMouseY+20, &ToolTip.ppStrings[0], ToolTip.nNumStrings, -1);
- }
- if(UI.nMouseLeft)
- {
- if(UI.nHoverToken != MICROPROFILE_INVALID_TOKEN)
- MicroProfileToggleGraph(UI.nHoverToken);
- }
- }
- }
-
-#if MICROPROFILE_DRAWCURSOR
- {
- float fCursor[8] =
- {
- MicroProfileMax(0, (int)UI.nMouseX-3), UI.nMouseY,
- MicroProfileMin(nWidth, UI.nMouseX+3), UI.nMouseY,
- UI.nMouseX, MicroProfileMax((int)UI.nMouseY-3, 0),
- UI.nMouseX, MicroProfileMin(nHeight, UI.nMouseY+3),
- };
- MicroProfileDrawLine2D(2, &fCursor[0], 0xff00ff00);
- MicroProfileDrawLine2D(2, &fCursor[4], 0xff00ff00);
- }
-#endif
- m.unlock();
- }
- else if(UI.nCustomActive != (uint32_t)-1)
- {
- std::recursive_mutex& m = MicroProfileGetMutex();
- m.lock();
- MicroProfileDrawGraph(nWidth, nHeight);
- MicroProfileDrawCustom(nWidth, nHeight);
- m.unlock();
-
- }
- UI.nMouseLeft = UI.nMouseRight = 0;
- UI.nMouseLeftMod = UI.nMouseRightMod = 0;
- UI.nMouseWheelDelta = 0;
- if(S.nOverflow)
- S.nOverflow--;
-
- UI.fDetailedOffset = UI.fDetailedOffset + (UI.fDetailedOffsetTarget - UI.fDetailedOffset) * MICROPROFILE_ANIM_DELAY_PRC;
- UI.fDetailedRange = UI.fDetailedRange + (UI.fDetailedRangeTarget - UI.fDetailedRange) * MICROPROFILE_ANIM_DELAY_PRC;
-
-
-}
-
-bool MicroProfileIsDrawing()
-{
- MicroProfile& S = *MicroProfileGet();
- return S.nDisplay != 0;
-}
-
-void MicroProfileToggleGraph(MicroProfileToken nToken)
-{
- MicroProfile& S = *MicroProfileGet();
- uint32_t nTimerId = MicroProfileGetTimerIndex(nToken);
- nToken &= 0xffff;
- int32_t nMinSort = 0x7fffffff;
- int32_t nFreeIndex = -1;
- int32_t nMinIndex = 0;
- int32_t nMaxSort = 0x80000000;
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- if(S.Graph[i].nToken == MICROPROFILE_INVALID_TOKEN)
- nFreeIndex = i;
- if(S.Graph[i].nToken == nToken)
- {
- S.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;
- S.TimerInfo[nTimerId].bGraph = false;
- return;
- }
- if(S.Graph[i].nKey < nMinSort)
- {
- nMinSort = S.Graph[i].nKey;
- nMinIndex = i;
- }
- if(S.Graph[i].nKey > nMaxSort)
- {
- nMaxSort = S.Graph[i].nKey;
- }
- }
- int nIndex = nFreeIndex > -1 ? nFreeIndex : nMinIndex;
- if (nFreeIndex == -1)
- {
- uint32_t idx = MicroProfileGetTimerIndex(S.Graph[nIndex].nToken);
- S.TimerInfo[idx].bGraph = false;
- }
- S.Graph[nIndex].nToken = nToken;
- S.Graph[nIndex].nKey = nMaxSort+1;
- memset(&S.Graph[nIndex].nHistory[0], 0, sizeof(S.Graph[nIndex].nHistory));
- S.TimerInfo[nTimerId].bGraph = true;
-}
-
-
-void MicroProfileMousePosition(uint32_t nX, uint32_t nY, int nWheelDelta)
-{
- UI.nMouseX = nX;
- UI.nMouseY = nY;
- UI.nMouseWheelDelta = nWheelDelta;
-}
-
-void MicroProfileModKey(uint32_t nKeyState)
-{
- UI.nModDown = nKeyState ? 1 : 0;
-}
-
-void MicroProfileClearGraph()
-{
- MicroProfile& S = *MicroProfileGet();
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- if(S.Graph[i].nToken != 0)
- {
- S.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;
- }
- }
-}
-
-void MicroProfileMouseButton(uint32_t nLeft, uint32_t nRight)
-{
- bool bCanRelease = std::abs((int)(UI.nMouseDownX - UI.nMouseX)) + std::abs((int)(UI.nMouseDownY - UI.nMouseY)) < 3;
-
- if(0 == nLeft && UI.nMouseDownLeft && bCanRelease)
- {
- if(UI.nModDown)
- UI.nMouseLeftMod = 1;
- else
- UI.nMouseLeft = 1;
- }
-
- if(0 == nRight && UI.nMouseDownRight && bCanRelease)
- {
- if(UI.nModDown)
- UI.nMouseRightMod = 1;
- else
- UI.nMouseRight = 1;
- }
- if((nLeft || nRight) && !(UI.nMouseDownLeft || UI.nMouseDownRight))
- {
- UI.nMouseDownX = UI.nMouseX;
- UI.nMouseDownY = UI.nMouseY;
- }
-
- UI.nMouseDownLeft = nLeft;
- UI.nMouseDownRight = nRight;
-
-}
-
-void MicroProfileDrawLineVertical(int nX, int nTop, int nBottom, uint32_t nColor)
-{
- MicroProfileDrawBox(nX, nTop, nX + 1, nBottom, nColor);
-}
-
-void MicroProfileDrawLineHorizontal(int nLeft, int nRight, int nY, uint32_t nColor)
-{
- MicroProfileDrawBox(nLeft, nY, nRight, nY + 1, nColor);
-}
-
-
-
-#include
-
-#define MICROPROFILE_PRESET_HEADER_MAGIC 0x28586813
-#define MICROPROFILE_PRESET_HEADER_VERSION 0x00000102
-struct MicroProfilePresetHeader
-{
- uint32_t nMagic;
- uint32_t nVersion;
- //groups, threads, aggregate, reference frame, graphs timers
- uint32_t nGroups[MICROPROFILE_MAX_GROUPS];
- uint32_t nThreads[MICROPROFILE_MAX_THREADS];
- uint32_t nGraphName[MICROPROFILE_MAX_GRAPHS];
- uint32_t nGraphGroupName[MICROPROFILE_MAX_GRAPHS];
- uint32_t nAllGroupsWanted;
- uint32_t nAllThreadsWanted;
- uint32_t nAggregateFlip;
- float fReferenceTime;
- uint32_t nBars;
- uint32_t nDisplay;
- uint32_t nOpacityBackground;
- uint32_t nOpacityForeground;
- uint32_t nShowSpikes;
-};
-
-#ifndef MICROPROFILE_PRESET_FILENAME_FUNC
-#define MICROPROFILE_PRESET_FILENAME_FUNC MicroProfilePresetFilename
-static const char* MicroProfilePresetFilename(const char* pSuffix)
-{
- static char filename[512];
- snprintf(filename, sizeof(filename)-1, ".microprofilepreset.%s", pSuffix);
- return filename;
-}
-#endif
-
-void MicroProfileSavePreset(const char* pPresetName)
-{
- std::lock_guard Lock(MicroProfileGetMutex());
- FILE* F = fopen(MICROPROFILE_PRESET_FILENAME_FUNC(pPresetName), "wb");
- if(!F) return;
-
- MicroProfile& S = *MicroProfileGet();
-
- MicroProfilePresetHeader Header;
- memset(&Header, 0, sizeof(Header));
- Header.nAggregateFlip = S.nAggregateFlip;
- Header.nBars = S.nBars;
- Header.fReferenceTime = S.fReferenceTime;
- Header.nAllGroupsWanted = S.nAllGroupsWanted;
- Header.nAllThreadsWanted = S.nAllThreadsWanted;
- Header.nMagic = MICROPROFILE_PRESET_HEADER_MAGIC;
- Header.nVersion = MICROPROFILE_PRESET_HEADER_VERSION;
- Header.nDisplay = S.nDisplay;
- Header.nOpacityBackground = UI.nOpacityBackground;
- Header.nOpacityForeground = UI.nOpacityForeground;
- Header.nShowSpikes = UI.bShowSpikes ? 1 : 0;
- fwrite(&Header, sizeof(Header), 1, F);
- uint64_t nMask = 1;
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)
- {
- if(S.nActiveGroupWanted & nMask)
- {
- uint32_t offset = ftell(F);
- const char* pName = S.GroupInfo[i].pName;
- int nLen = (int)strlen(pName)+1;
- fwrite(pName, nLen, 1, F);
- Header.nGroups[i] = offset;
- }
- nMask <<= 1;
- }
- for(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)
- {
- MicroProfileThreadLog* pLog = S.Pool[i];
- if(pLog && S.nThreadActive[i])
- {
- uint32_t nOffset = ftell(F);
- const char* pName = &pLog->ThreadName[0];
- int nLen = (int)strlen(pName)+1;
- fwrite(pName, nLen, 1, F);
- Header.nThreads[i] = nOffset;
- }
- }
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- MicroProfileToken nToken = S.Graph[i].nToken;
- if(nToken != MICROPROFILE_INVALID_TOKEN)
- {
- uint32_t nGroupIndex = MicroProfileGetGroupIndex(nToken);
- uint32_t nTimerIndex = MicroProfileGetTimerIndex(nToken);
- const char* pGroupName = S.GroupInfo[nGroupIndex].pName;
- const char* pTimerName = S.TimerInfo[nTimerIndex].pName;
- MP_ASSERT(pGroupName);
- MP_ASSERT(pTimerName);
- int nGroupLen = (int)strlen(pGroupName)+1;
- int nTimerLen = (int)strlen(pTimerName)+1;
-
- uint32_t nOffsetGroup = ftell(F);
- fwrite(pGroupName, nGroupLen, 1, F);
- uint32_t nOffsetTimer = ftell(F);
- fwrite(pTimerName, nTimerLen, 1, F);
- Header.nGraphName[i] = nOffsetTimer;
- Header.nGraphGroupName[i] = nOffsetGroup;
- }
- }
- fseek(F, 0, SEEK_SET);
- fwrite(&Header, sizeof(Header), 1, F);
-
- fclose(F);
-
-}
-
-
-
-void MicroProfileLoadPreset(const char* pSuffix)
-{
- std::lock_guard Lock(MicroProfileGetMutex());
- FILE* F = fopen(MICROPROFILE_PRESET_FILENAME_FUNC(pSuffix), "rb");
- if(!F)
- {
- return;
- }
- fseek(F, 0, SEEK_END);
- int nSize = ftell(F);
- char* const pBuffer = (char*)alloca(nSize);
- fseek(F, 0, SEEK_SET);
- int nRead = (int)fread(pBuffer, nSize, 1, F);
- fclose(F);
- if(1 != nRead)
- return;
-
- MicroProfile& S = *MicroProfileGet();
-
- MicroProfilePresetHeader& Header = *(MicroProfilePresetHeader*)pBuffer;
-
- if(Header.nMagic != MICROPROFILE_PRESET_HEADER_MAGIC || Header.nVersion != MICROPROFILE_PRESET_HEADER_VERSION)
- {
- return;
- }
-
- S.nAggregateFlip = Header.nAggregateFlip;
- S.nBars = Header.nBars;
- S.fReferenceTime = Header.fReferenceTime;
- S.fRcpReferenceTime = 1.f / Header.fReferenceTime;
- S.nAllGroupsWanted = Header.nAllGroupsWanted;
- S.nAllThreadsWanted = Header.nAllThreadsWanted;
- S.nDisplay = Header.nDisplay;
- S.nActiveGroupWanted = 0;
- UI.nOpacityBackground = Header.nOpacityBackground;
- UI.nOpacityForeground = Header.nOpacityForeground;
- UI.bShowSpikes = Header.nShowSpikes == 1;
-
- memset(&S.nThreadActive[0], 0, sizeof(S.nThreadActive));
-
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)
- {
- if(Header.nGroups[i])
- {
- const char* pGroupName = pBuffer + Header.nGroups[i];
- for(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)
- {
- if(0 == MP_STRCASECMP(pGroupName, S.GroupInfo[j].pName))
- {
- S.nActiveGroupWanted |= (1ll << j);
- }
- }
- }
- }
- for(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)
- {
- if(Header.nThreads[i])
- {
- const char* pThreadName = pBuffer + Header.nThreads[i];
- for(uint32_t j = 0; j < MICROPROFILE_MAX_THREADS; ++j)
- {
- MicroProfileThreadLog* pLog = S.Pool[j];
- if(pLog && 0 == MP_STRCASECMP(pThreadName, &pLog->ThreadName[0]))
- {
- S.nThreadActive[j] = 1;
- }
- }
- }
- }
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- MicroProfileToken nPrevToken = S.Graph[i].nToken;
- S.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;
- if(Header.nGraphName[i] && Header.nGraphGroupName[i])
- {
- const char* pGraphName = pBuffer + Header.nGraphName[i];
- const char* pGraphGroupName = pBuffer + Header.nGraphGroupName[i];
- for(uint32_t j = 0; j < S.nTotalTimers; ++j)
- {
- uint64_t nGroupIndex = S.TimerInfo[j].nGroupIndex;
- if(0 == MP_STRCASECMP(pGraphName, S.TimerInfo[j].pName) && 0 == MP_STRCASECMP(pGraphGroupName, S.GroupInfo[nGroupIndex].pName))
- {
- MicroProfileToken nToken = MicroProfileMakeToken(1ll << nGroupIndex, (uint16_t)j);
- S.Graph[i].nToken = nToken; // note: group index is stored here but is checked without in MicroProfileToggleGraph()!
- S.TimerInfo[j].bGraph = true;
- if(nToken != nPrevToken)
- {
- memset(&S.Graph[i].nHistory, 0, sizeof(S.Graph[i].nHistory));
- }
- break;
- }
- }
- }
- }
-}
-
-uint32_t MicroProfileCustomGroupFind(const char* pCustomName)
-{
- for(uint32_t i = 0; i < UI.nCustomCount; ++i)
- {
- if(!MP_STRCASECMP(pCustomName, UI.Custom[i].pName))
- {
- return i;
- }
- }
- return (uint32_t)-1;
-}
-
-uint32_t MicroProfileCustomGroup(const char* pCustomName)
-{
- for(uint32_t i = 0; i < UI.nCustomCount; ++i)
- {
- if(!MP_STRCASECMP(pCustomName, UI.Custom[i].pName))
- {
- return i;
- }
- }
- MP_ASSERT(UI.nCustomCount < MICROPROFILE_CUSTOM_MAX);
- uint32_t nIndex = UI.nCustomCount;
- UI.nCustomCount++;
- memset(&UI.Custom[nIndex], 0, sizeof(UI.Custom[nIndex]));
- uint32_t nLen = (uint32_t)strlen(pCustomName);
- if(nLen > MICROPROFILE_NAME_MAX_LEN-1)
- nLen = MICROPROFILE_NAME_MAX_LEN-1;
- memcpy(&UI.Custom[nIndex].pName[0], pCustomName, nLen);
- UI.Custom[nIndex].pName[nLen] = '\0';
- return nIndex;
-}
-void MicroProfileCustomGroup(const char* pCustomName, uint32_t nMaxTimers, uint32_t nAggregateFlip, float fReferenceTime, uint32_t nFlags)
-{
- uint32_t nIndex = MicroProfileCustomGroup(pCustomName);
- MP_ASSERT(UI.Custom[nIndex].pTimers == 0);//only call once!
- UI.Custom[nIndex].pTimers = &UI.CustomTimer[UI.nCustomTimerCount];
- UI.Custom[nIndex].nMaxTimers = nMaxTimers;
- UI.Custom[nIndex].fReference = fReferenceTime;
- UI.nCustomTimerCount += nMaxTimers;
- MP_ASSERT(UI.nCustomTimerCount <= MICROPROFILE_CUSTOM_MAX_TIMERS); //bump MICROPROFILE_CUSTOM_MAX_TIMERS
- UI.Custom[nIndex].nFlags = nFlags;
- UI.Custom[nIndex].nAggregateFlip = nAggregateFlip;
-}
-
-void MicroProfileCustomGroupEnable(uint32_t nIndex)
-{
- if(nIndex < UI.nCustomCount)
- {
- MicroProfile& S = *MicroProfileGet();
- S.nForceGroupUI = UI.Custom[nIndex].nGroupMask;
- MicroProfileSetAggregateFrames(UI.Custom[nIndex].nAggregateFlip);
- S.fReferenceTime = UI.Custom[nIndex].fReference;
- S.fRcpReferenceTime = 1.f / UI.Custom[nIndex].fReference;
- UI.nCustomActive = nIndex;
-
- for(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)
- {
- if(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)
- {
- uint32_t nTimerId = MicroProfileGetTimerIndex(S.Graph[i].nToken);
- S.TimerInfo[nTimerId].bGraph = false;
- S.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;
- }
- }
-
- for(uint32_t i = 0; i < UI.Custom[nIndex].nNumTimers; ++i)
- {
- if(i == MICROPROFILE_MAX_GRAPHS)
- {
- break;
- }
- S.Graph[i].nToken = UI.Custom[nIndex].pTimers[i];
- S.Graph[i].nKey = i;
- uint32_t nTimerId = MicroProfileGetTimerIndex(S.Graph[i].nToken);
- S.TimerInfo[nTimerId].bGraph = true;
- }
- }
-}
-
-void MicroProfileCustomGroupToggle(const char* pCustomName)
-{
- uint32_t nIndex = MicroProfileCustomGroupFind(pCustomName);
- if(nIndex == (uint32_t)-1 || nIndex == UI.nCustomActive)
- {
- MicroProfileCustomGroupDisable();
- }
- else
- {
- MicroProfileCustomGroupEnable(nIndex);
- }
-}
-
-void MicroProfileCustomGroupEnable(const char* pCustomName)
-{
- uint32_t nIndex = MicroProfileCustomGroupFind(pCustomName);
- MicroProfileCustomGroupEnable(nIndex);
-}
-void MicroProfileCustomGroupDisable()
-{
- MicroProfile& S = *MicroProfileGet();
- S.nForceGroupUI = 0;
- UI.nCustomActive = (uint32_t)-1;
-}
-
-void MicroProfileCustomGroupAddTimer(const char* pCustomName, const char* pGroup, const char* pTimer)
-{
- uint32_t nIndex = MicroProfileCustomGroupFind(pCustomName);
- if((uint32_t)-1 == nIndex)
- {
- return;
- }
- uint32_t nTimerIndex = UI.Custom[nIndex].nNumTimers;
- MP_ASSERT(nTimerIndex < UI.Custom[nIndex].nMaxTimers);
- uint64_t nToken = MicroProfileFindToken(pGroup, pTimer);
- MP_ASSERT(nToken != MICROPROFILE_INVALID_TOKEN); //Timer must be registered first.
- UI.Custom[nIndex].pTimers[nTimerIndex] = nToken;
- uint16_t nGroup = MicroProfileGetGroupIndex(nToken);
- UI.Custom[nIndex].nGroupMask |= (1ll << nGroup);
- UI.Custom[nIndex].nNumTimers++;
-}
-
-#undef UI
-
-#endif
-#endif
diff --git a/src/core/profiler.c b/src/core/profiler.c
new file mode 100644
index 00000000..f2340a75
--- /dev/null
+++ b/src/core/profiler.c
@@ -0,0 +1,75 @@
+#include "core/profiler.h"
+#include "core/assert.h"
+#include "core/time.h"
+
+#define PROFILER_MAX_COUNTERS 32
+
+struct counter {
+ int aggregate;
+ int64_t value[2];
+};
+
+static struct {
+ struct counter counters[PROFILER_MAX_COUNTERS];
+ int num_counters;
+
+ int64_t last_aggregation;
+} prof;
+
+prof_token_t prof_get_next_token() {
+ prof_token_t tok = prof.num_counters++;
+ CHECK_LT(tok, PROFILER_MAX_COUNTERS);
+ return tok;
+}
+
+prof_token_t prof_get_counter_token(const char *name) {
+ prof_token_t tok = prof_get_next_token();
+ struct counter *c = &prof.counters[tok];
+ c->aggregate = 0;
+ return tok;
+}
+
+prof_token_t prof_get_aggregate_token(const char *name) {
+ prof_token_t tok = prof_get_next_token();
+ struct counter *c = &prof.counters[tok];
+ c->aggregate = 1;
+ return tok;
+}
+
+void prof_flip(int64_t now) {
+ /* update time-based aggregate counters every second */
+ int64_t next_aggregation = prof.last_aggregation + NS_PER_SEC;
+
+ if (now > next_aggregation) {
+ for (int i = 0; i < PROFILER_MAX_COUNTERS; i++) {
+ struct counter *c = &prof.counters[i];
+
+ if (c->aggregate) {
+ c->value[0] = c->value[1];
+ c->value[1] = 0;
+ }
+ }
+
+ prof.last_aggregation = now;
+ }
+}
+
+void prof_counter_set(prof_token_t tok, int64_t count) {
+ struct counter *c = &prof.counters[tok];
+ c->value[1] = count;
+}
+
+void prof_counter_add(prof_token_t tok, int64_t count) {
+ struct counter *c = &prof.counters[tok];
+ c->value[1] += count;
+}
+
+int64_t prof_counter_load(prof_token_t tok) {
+ struct counter *c = &prof.counters[tok];
+ if (c->aggregate) {
+ /* return the last aggregated value */
+ return c->value[0];
+ } else {
+ return c->value[1];
+ }
+}
diff --git a/src/core/profiler.cc b/src/core/profiler.cc
deleted file mode 100644
index 031fec4a..00000000
--- a/src/core/profiler.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-#include
-
-#ifdef HAVE_MICROPROFILE
-#include
-#endif
-
-extern "C" {
-
-#include "core/profiler.h"
-#include "core/time.h"
-
-static struct {
-#ifdef HAVE_MICROPROFILE
- std::atomic counters[MICROPROFILE_MAX_COUNTERS];
- int aggregate[MICROPROFILE_MAX_COUNTERS];
- int64_t last_aggregation;
-#else
- /* avoid having an empty struct in c (only valid through GCC extension) */
- int dummy;
-#endif
-} prof;
-
-static inline float hue_to_rgb(float p, float q, float t) {
- if (t < 0.0f) {
- t += 1.0f;
- }
- if (t > 1.0f) {
- t -= 1.0f;
- }
- if (t < 1.0f / 6.0f) {
- return p + (q - p) * 6.0f * t;
- }
- if (t < 1.0f / 2.0f) {
- return q;
- }
- if (t < 2.0f / 3.0f) {
- return p + (q - p) * (2.0f / 3.0f - t) * 6.0f;
- }
- return p;
-}
-
-static inline void hsl_to_rgb(float h, float s, float l, uint8_t *r, uint8_t *g,
- uint8_t *b) {
- float fr, fg, fb;
-
- if (s == 0.0f) {
- fr = fg = fb = l;
- } else {
- float q = l < 0.5f ? l * (1.0f + s) : l + s - l * s;
- float p = 2.0f * l - q;
- fr = hue_to_rgb(p, q, h + 1.0f / 3.0f);
- fg = hue_to_rgb(p, q, h);
- fb = hue_to_rgb(p, q, h - 1.0f / 3.0f);
- }
-
- *r = (uint8_t)(fr * 255);
- *g = (uint8_t)(fg * 255);
- *b = (uint8_t)(fb * 255);
-}
-
-static unsigned prof_hash(const char *name) {
- unsigned hash = 5381;
- char c;
- while ((c = *name++)) {
- hash = ((hash << 5) + hash) + c;
- }
- return hash;
-}
-
-static uint32_t prof_scope_color(const char *name) {
- unsigned name_hash = prof_hash(name);
- float h = (name_hash % 360) / 360.0f;
- float s = 0.7f;
- float l = 0.6f;
- uint8_t r, g, b;
- hsl_to_rgb(h, s, l, &r, &g, &b);
- return (r << 16) | (g << 8) | b;
-}
-
-prof_token_t prof_get_token(const char *group, const char *name) {
- prof_init();
-
-#ifdef HAVE_MICROPROFILE
- uint32_t color = prof_scope_color(name);
- return MicroProfileGetToken(group, name, color, MicroProfileTokenTypeCpu);
-#else
- return 0;
-#endif
-}
-
-prof_token_t prof_get_counter_token(const char *name) {
- prof_init();
-
-#ifdef HAVE_MICROPROFILE
- prof_token_t tok = MicroProfileGetCounterToken(name);
- prof.aggregate[tok] = 0;
- return tok;
-#else
- return 0;
-#endif
-}
-
-prof_token_t prof_get_aggregate_token(const char *name) {
- prof_init();
-#ifdef HAVE_MICROPROFILE
- prof_token_t tok = MicroProfileGetCounterToken(name);
- prof.aggregate[tok] = 1;
- return tok;
-#else
- return 0;
-#endif
-}
-
-void prof_flip(int64_t now) {
-#ifdef HAVE_MICROPROFILE
- /* update time-based aggregate counters every second */
- int64_t next_aggregation = prof.last_aggregation + NS_PER_SEC;
-
- if (now > next_aggregation) {
- for (int i = 0; i < MICROPROFILE_MAX_COUNTERS; i++) {
- if (!prof.aggregate[i]) {
- continue;
- }
-
- MicroProfileCounterSet(i, prof.counters[i].load());
- prof.counters[i].store(0);
- }
-
- prof.last_aggregation = now;
- }
-
- /* flip frame-based profile zones at the end of every frame */
- MicroProfileFlip();
-#endif
-}
-
-void prof_counter_set(prof_token_t tok, int64_t count) {
-#ifdef HAVE_MICROPROFILE
- if (prof.aggregate[tok]) {
- prof.counters[tok].store(count);
- } else {
- MicroProfileCounterSet(tok, count);
- }
-#endif
-}
-
-void prof_counter_add(prof_token_t tok, int64_t count) {
-#ifdef HAVE_MICROPROFILE
- if (prof.aggregate[tok]) {
- prof.counters[tok].fetch_add(count);
- } else {
- MicroProfileCounterAdd(tok, count);
- }
-#endif
-}
-
-int64_t prof_counter_load(prof_token_t tok) {
-#ifdef HAVE_MICROPROFILE
- return MicroProfileCounterLoad(tok);
-#else
- return 0;
-#endif
-}
-
-void prof_leave(prof_token_t tok, uint64_t tick) {
-#ifdef HAVE_MICROPROFILE
- MicroProfileLeave(tok, tick);
-#endif
-}
-
-uint64_t prof_enter(prof_token_t tok) {
-#ifdef HAVE_MICROPROFILE
- return MicroProfileEnter(tok);
-#else
- return 0;
-#endif
-}
-
-void prof_shutdown() {
-#ifdef HAVE_MICROPROFILE
- MicroProfileShutdown();
-#endif
-}
-
-void prof_init() {
-#ifdef HAVE_MICROPROFILE
- MicroProfileInit();
-#endif
-}
-}
diff --git a/src/core/profiler.h b/src/core/profiler.h
index 7bb2fa8e..ef32db85 100644
--- a/src/core/profiler.h
+++ b/src/core/profiler.h
@@ -5,7 +5,7 @@
#include "core/constructor.h"
#include "core/list.h"
-typedef uint64_t prof_token_t;
+typedef int prof_token_t;
#define DECLARE_COUNTER(name) extern prof_token_t COUNTER_##name;
@@ -22,27 +22,10 @@ typedef uint64_t prof_token_t;
COUNTER_##name = prof_get_aggregate_token(#name); \
}
-#define PROF_ENTER(group, name) \
- static int prof_init = 0; \
- static prof_token_t prof_tok; \
- if (!prof_init) { \
- prof_tok = prof_get_token(group, name); \
- prof_init = 1; \
- } \
- uint64_t prof_tick = prof_enter(prof_tok)
-
-#define PROF_LEAVE() prof_leave(prof_tok, prof_tick)
-
prof_token_t prof_get_token(const char *group, const char *name);
prof_token_t prof_get_counter_token(const char *name);
prof_token_t prof_get_aggregate_token(const char *name);
-void prof_init();
-void prof_shutdown();
-
-uint64_t prof_enter(prof_token_t tok);
-void prof_leave(prof_token_t tok, uint64_t tick);
-
int64_t prof_counter_load(prof_token_t tok);
void prof_counter_add(prof_token_t tok, int64_t count);
void prof_counter_set(prof_token_t tok, int64_t count);
diff --git a/src/guest/arm7/arm7.c b/src/guest/arm7/arm7.c
index 4020b6e4..89d82765 100644
--- a/src/guest/arm7/arm7.c
+++ b/src/guest/arm7/arm7.c
@@ -155,8 +155,6 @@ void arm7_suspend(struct arm7 *arm) {
}
static void arm7_run(struct device *dev, int64_t ns) {
- PROF_ENTER("cpu", "arm7_run");
-
struct arm7 *arm = (struct arm7 *)dev;
struct armv3_context *ctx = &arm->ctx;
struct jit *jit = arm->jit;
@@ -167,8 +165,6 @@ static void arm7_run(struct device *dev, int64_t ns) {
jit_run(arm->jit, cycles);
prof_counter_add(COUNTER_arm7_instrs, arm->ctx.ran_instrs);
-
- PROF_LEAVE();
}
static void arm7_guest_destroy(struct jit_guest *guest) {
diff --git a/src/guest/pvr/ta.c b/src/guest/pvr/ta.c
index 81f81585..238fbe6e 100644
--- a/src/guest/pvr/ta.c
+++ b/src/guest/pvr/ta.c
@@ -29,7 +29,6 @@
#include "guest/scheduler.h"
#include "guest/sh4/sh4.h"
-DEFINE_AGGREGATE_COUNTER(ta_data);
DEFINE_AGGREGATE_COUNTER(ta_renders);
struct ta {
@@ -410,9 +409,6 @@ static void ta_write_context(struct ta *ta, struct ta_context *ctx, void *ptr,
memcpy(&ctx->params[ctx->size], ptr, size);
ctx->size += size;
- /* track how much TA data is written per second */
- prof_counter_add(COUNTER_ta_data, size);
-
/* each TA command is either 32 or 64 bytes, with the pcw being in the first
32 bytes always. check every 32 bytes to see if the command has been
completely received or not */
@@ -731,8 +727,6 @@ static void ta_yuv_process_macroblock(struct ta *ta, void *data) {
* 3.) texture data - data that is written directly to vram
*/
static void ta_poly_write(struct ta *ta, uint32_t dst, void *ptr, int size) {
- PROF_ENTER("cpu", "ta_poly_write");
-
CHECK(size % 32 == 0);
uint8_t *src = ptr;
@@ -741,13 +735,9 @@ static void ta_poly_write(struct ta *ta, uint32_t dst, void *ptr, int size) {
ta_write_context(ta, ta->curr_context, src, 32);
src += 32;
}
-
- PROF_LEAVE();
}
static void ta_yuv_write(struct ta *ta, uint32_t dst, void *ptr, int size) {
- PROF_ENTER("cpu", "ta_yuv_write");
-
struct holly *holly = ta->holly;
struct pvr *pvr = ta->pvr;
@@ -759,18 +749,12 @@ static void ta_yuv_write(struct ta *ta, uint32_t dst, void *ptr, int size) {
ta_yuv_process_macroblock(ta, src);
src += ta->yuv_macroblock_size;
}
-
- PROF_LEAVE();
}
static void ta_texture_write(struct ta *ta, uint32_t dst, void *ptr, int size) {
- PROF_ENTER("cpu", "ta_texture_write");
-
uint8_t *src = ptr;
dst &= 0xeeffffff;
memcpy(&ta->video_ram[dst], src, size);
-
- PROF_LEAVE();
}
/*
diff --git a/src/guest/pvr/tr.c b/src/guest/pvr/tr.c
index ae8ace42..22489a4e 100644
--- a/src/guest/pvr/tr.c
+++ b/src/guest/pvr/tr.c
@@ -127,8 +127,6 @@ static inline uint32_t float_to_rgba(float r, float g, float b, float a) {
static texture_handle_t tr_convert_texture(struct tr *tr,
const struct ta_context *ctx,
union tsp tsp, union tcw tcw) {
- PROF_ENTER("gpu", "tr_convert_texture");
-
/* TODO it's bad that textures are only cached based off tsp / tcw yet the
TEXT_CONTROL registers and PAL_RAM_CTRL registers are used here to control
texture generation */
@@ -138,7 +136,6 @@ static texture_handle_t tr_convert_texture(struct tr *tr,
/* if there's a non-dirty handle, return it */
if (entry->handle && !entry->dirty) {
- PROF_LEAVE();
return entry->handle;
}
@@ -183,8 +180,6 @@ static texture_handle_t tr_convert_texture(struct tr *tr,
entry->height = height;
entry->dirty = 0;
- PROF_LEAVE();
-
return entry->handle;
}
@@ -712,8 +707,6 @@ static int tr_compare_surf(const void *a, const void *b) {
static void tr_sort_render_list(struct tr *tr, struct tr_context *rc,
int list_type) {
- PROF_ENTER("gpu", "tr_sort_render_list");
-
/* sort each surface from back to front based on its minz */
struct tr_list *list = &rc->lists[list_type];
@@ -735,8 +728,6 @@ static void tr_sort_render_list(struct tr *tr, struct tr_context *rc,
msort_noalloc(list->surfs, sort_tmp, list->num_surfs, sizeof(int),
&tr_compare_surf);
-
- PROF_LEAVE();
}
static void tr_parse_eol(struct tr *tr, const struct ta_context *ctx,
@@ -791,8 +782,6 @@ static void tr_render_list(struct render_backend *r,
void tr_render_context_until(struct render_backend *r,
const struct tr_context *rc, int end_surf) {
- PROF_ENTER("gpu", "tr_render_context_until");
-
int stopped = 0;
r_begin_ta_surfaces(r, rc->width, rc->height, rc->verts, rc->num_verts,
@@ -803,8 +792,6 @@ void tr_render_context_until(struct render_backend *r,
tr_render_list(r, rc, TA_LIST_TRANSLUCENT, end_surf, &stopped);
r_end_ta_surfaces(r);
-
- PROF_LEAVE();
}
void tr_render_context(struct render_backend *r, const struct tr_context *rc) {
@@ -814,8 +801,6 @@ void tr_render_context(struct render_backend *r, const struct tr_context *rc) {
void tr_convert_context(struct render_backend *r, void *userdata,
tr_find_texture_cb find_texture,
const struct ta_context *ctx, struct tr_context *rc) {
- PROF_ENTER("gpu", "tr_convert_context");
-
struct tr tr;
tr.r = r;
tr.userdata = userdata;
@@ -886,6 +871,4 @@ void tr_convert_context(struct render_backend *r, void *userdata,
LOG_INFO("tr_convert_convext merged %d / %d surfaces", tr.merged_surfs,
tr.merged_surfs + rc->num_surfs);
#endif
-
- PROF_LEAVE();
}
diff --git a/src/guest/sh4/sh4.c b/src/guest/sh4/sh4.c
index 4306e690..1785d2b3 100644
--- a/src/guest/sh4/sh4.c
+++ b/src/guest/sh4/sh4.c
@@ -25,7 +25,6 @@
#endif
DEFINE_AGGREGATE_COUNTER(sh4_instrs);
-DEFINE_AGGREGATE_COUNTER(sh4_sr_updates);
/* callbacks to service sh4_reg_read / sh4_reg_write calls */
struct reg_cb sh4_cb[SH4_NUM_REGS];
@@ -47,8 +46,6 @@ struct sh4_interrupt_info sh4_interrupts[SH4_NUM_INTERRUPTS] = {
static void sh4_sr_updated(struct sh4 *sh4, uint32_t old_sr) {
struct sh4_context *ctx = &sh4->ctx;
- prof_counter_add(COUNTER_sh4_sr_updates, 1);
-
if ((ctx->sr & RB_MASK) != (old_sr & RB_MASK)) {
sh4_swap_gpr_bank(ctx);
}
@@ -166,8 +163,6 @@ static void sh4_invalid_instr(struct sh4 *sh4) {
}
static void sh4_run(struct device *dev, int64_t ns) {
- PROF_ENTER("cpu", "sh4_run");
-
struct sh4 *sh4 = (struct sh4 *)dev;
struct sh4_context *ctx = &sh4->ctx;
struct jit *jit = sh4->jit;
@@ -178,8 +173,6 @@ static void sh4_run(struct device *dev, int64_t ns) {
jit_run(sh4->jit, cycles);
prof_counter_add(COUNTER_sh4_instrs, sh4->ctx.ran_instrs);
-
- PROF_LEAVE();
}
static void sh4_guest_destroy(struct jit_guest *guest) {
diff --git a/src/guest/sh4/sh4_ccn.c b/src/guest/sh4/sh4_ccn.c
index 5689316f..0afb54e6 100644
--- a/src/guest/sh4/sh4_ccn.c
+++ b/src/guest/sh4/sh4_ccn.c
@@ -29,8 +29,6 @@ static void sh4_ccn_reset(struct sh4 *sh4) {
}
void sh4_ccn_pref(struct sh4 *sh4, uint32_t addr) {
- PROF_ENTER("cpu", "sh4_ccn_pref");
-
/* make sure this is a sq related prefetch */
DCHECK(addr >= 0xe0000000 && addr <= 0xe3ffffff);
@@ -57,8 +55,6 @@ void sh4_ccn_pref(struct sh4 *sh4, uint32_t addr) {
}
as_memcpy_to_guest(sh4->memory_if->space, dst, sh4->ctx.sq[sqi], 32);
-
- PROF_LEAVE();
}
uint32_t sh4_ccn_cache_read(struct sh4 *sh4, uint32_t addr,
diff --git a/src/host/sdl_host.c b/src/host/sdl_host.c
index 56b84917..2830389c 100644
--- a/src/host/sdl_host.c
+++ b/src/host/sdl_host.c
@@ -10,7 +10,6 @@
#include "emulator.h"
#include "host/host.h"
#include "imgui.h"
-#include "microprofile.h"
#include "render/render_backend.h"
#include "tracer.h"
@@ -50,7 +49,6 @@ struct sdl_host {
int video_width;
int video_height;
struct imgui *imgui;
- struct microprofile *mp;
/* input */
int key_map[K_NUM_KEYS];
@@ -265,7 +263,6 @@ int video_can_fullscreen(struct host *base) {
}
static void video_shutdown(struct sdl_host *host) {
- mp_destroy(host->mp);
imgui_destroy(host->imgui);
r_destroy(host->video_rb);
video_destroy_context(host, host->video_ctx);
@@ -275,7 +272,6 @@ static int video_init(struct sdl_host *host) {
host->video_ctx = video_create_context(host);
host->video_rb = r_create();
host->imgui = imgui_create(host->video_rb);
- host->mp = mp_create(host->video_rb);
return 1;
}
@@ -452,7 +448,6 @@ static void input_handle_mousemove(struct sdl_host *host, int port, int x,
}
imgui_mousemove(host->imgui, x, y);
- mp_mousemove(host->mp, x, y);
}
static void input_handle_keydown(struct sdl_host *host, int port,
@@ -469,7 +464,6 @@ static void input_handle_keydown(struct sdl_host *host, int port,
}
imgui_keydown(host->imgui, key, value);
- mp_keydown(host->mp, key, value);
}
static void input_handle_controller_removed(struct sdl_host *host, int port) {
@@ -847,7 +841,6 @@ int main(int argc, char **argv) {
emu_render_frame(emu, host->video_width, host->video_height);
/* overlay user interface */
- mp_render_frame(host->mp, host->video_width, host->video_height);
imgui_end_frame(host->imgui);
/* flip profiler at end of frame */
diff --git a/src/jit/backend/x64/x64_backend.cc b/src/jit/backend/x64/x64_backend.cc
index 31f968f8..4ce43fb6 100644
--- a/src/jit/backend/x64/x64_backend.cc
+++ b/src/jit/backend/x64/x64_backend.cc
@@ -663,8 +663,6 @@ static void x64_backend_emit(struct x64_backend *backend, struct ir *ir,
static int x64_backend_assemble_code(struct jit_backend *base, struct ir *ir,
uint8_t **addr, int *size,
jit_emit_cb emit_cb, void *emit_data) {
- PROF_ENTER("cpu", "x64_backend_assemble_code");
-
struct x64_backend *backend = container_of(base, struct x64_backend, base);
auto &e = *backend->codegen;
@@ -686,8 +684,6 @@ static int x64_backend_assemble_code(struct jit_backend *base, struct ir *ir,
*addr = code;
*size = (int)(e.getCurr() - code);
- PROF_LEAVE();
-
return res;
}
diff --git a/src/jit/backend/x64/x64_dispatch.cc b/src/jit/backend/x64/x64_dispatch.cc
index 6a79b711..95dde64d 100644
--- a/src/jit/backend/x64/x64_dispatch.cc
+++ b/src/jit/backend/x64/x64_dispatch.cc
@@ -2,14 +2,10 @@
extern "C" {
#include "core/assert.h"
-#include "core/profiler.h"
#include "jit/jit.h"
#include "jit/jit_guest.h"
}
-DEFINE_COUNTER(edges_patched);
-DEFINE_COUNTER(edges_restored);
-
/* log out pc each time dispatch is entered for debugging */
#define LOG_DISPATCH_EVERY_N 0
@@ -39,8 +35,6 @@ void x64_dispatch_restore_edge(struct jit_backend *base, void *code,
uint32_t dst) {
struct x64_backend *backend = container_of(base, struct x64_backend, base);
- prof_counter_add(COUNTER_edges_restored, 1);
-
Xbyak::CodeGenerator e(32, code);
e.call(backend->dispatch_static);
}
@@ -48,8 +42,6 @@ void x64_dispatch_restore_edge(struct jit_backend *base, void *code,
void x64_dispatch_patch_edge(struct jit_backend *base, void *code, void *dst) {
struct x64_backend *backend = container_of(base, struct x64_backend, base);
- prof_counter_add(COUNTER_edges_patched, 1);
-
Xbyak::CodeGenerator e(32, code);
e.jmp(dst);
}
diff --git a/src/jit/frontend/sh4/sh4_frontend.c b/src/jit/frontend/sh4/sh4_frontend.c
index 3f4dae22..95049385 100644
--- a/src/jit/frontend/sh4/sh4_frontend.c
+++ b/src/jit/frontend/sh4/sh4_frontend.c
@@ -133,8 +133,6 @@ static void sh4_frontend_translate_code(struct jit_frontend *base,
struct sh4_guest *guest = (struct sh4_guest *)frontend->guest;
struct sh4_context *ctx = (struct sh4_context *)guest->ctx;
- PROF_ENTER("cpu", "sh4_frontend_translate_code");
-
int offset = 0;
int use_fpscr = 0;
int was_delay = 0;
@@ -271,8 +269,6 @@ static void sh4_frontend_translate_code(struct jit_frontend *base,
ir_alloc_i32(ir, ctx->fpscr & (PR_MASK | SZ_MASK));
ir_assert_eq(ir, actual, expected);
}
-
- PROF_LEAVE();
}
static void sh4_frontend_analyze_code(struct jit_frontend *base,
diff --git a/src/jit/jit.c b/src/jit/jit.c
index 51ce9ae6..908e8b93 100644
--- a/src/jit/jit.c
+++ b/src/jit/jit.c
@@ -100,8 +100,6 @@ static int jit_is_stale(struct jit *jit, struct jit_block *block) {
}
static void jit_patch_edges(struct jit *jit, struct jit_block *block) {
- PROF_ENTER("cpu", "jit_patch_edges");
-
/* patch incoming edges to this block to directly jump to it instead of
going through dispatch */
list_for_each_entry(edge, &block->in_edges, struct jit_edge, in_it) {
@@ -120,13 +118,9 @@ static void jit_patch_edges(struct jit *jit, struct jit_block *block) {
edge->dst->host_addr);
}
}
-
- PROF_LEAVE();
}
static void jit_restore_edges(struct jit *jit, struct jit_block *block) {
- PROF_ENTER("cpu", "jit_restore_edges");
-
/* restore any patched branches to go back through dispatch */
list_for_each_entry(edge, &block->in_edges, struct jit_edge, in_it) {
if (edge->patched) {
@@ -135,8 +129,6 @@ static void jit_restore_edges(struct jit *jit, struct jit_block *block) {
edge->dst->guest_addr);
}
}
-
- PROF_LEAVE();
}
static void jit_invalidate_block(struct jit *jit, struct jit_block *block,
@@ -338,8 +330,6 @@ static void jit_promote_fastmem(struct jit *jit, struct jit_block *block,
}
void jit_compile_code(struct jit *jit, uint32_t guest_addr) {
- PROF_ENTER("cpu", "jit_compile_block");
-
#if 0
LOG_INFO("jit_compile_block %s 0x%08x", jit->tag, guest_addr);
#endif
@@ -397,7 +387,6 @@ void jit_compile_code(struct jit *jit, uint32_t guest_addr) {
try to compile again */
LOG_INFO("backend overflow, resetting code cache");
jit_free_code(jit);
- PROF_LEAVE();
return;
}
@@ -415,8 +404,6 @@ void jit_compile_code(struct jit *jit, uint32_t guest_addr) {
(uintptr_t)block->host_addr, block->host_size, jit->tag,
block->guest_addr);
}
-
- PROF_LEAVE();
}
static int jit_handle_exception(void *data, struct exception_state *ex) {
diff --git a/src/microprofile.cc b/src/microprofile.cc
deleted file mode 100644
index 7aaa8b59..00000000
--- a/src/microprofile.cc
+++ /dev/null
@@ -1,349 +0,0 @@
-#ifdef HAVE_MICROPROFILE
-#define MICROPROFILE_WEBSERVER 0
-#define MICROPROFILE_GPU_TIMERS 0
-#define MICROPROFILE_ENABLED 1
-#define MICROPROFILEUI_ENABLED 1
-#define MICROPROFILE_IMPL 1
-#define MICROPROFILEUI_IMPL 1
-#define MICROPROFILE_PER_THREAD_BUFFER_SIZE (1024 * 1024 * 20)
-#define MICROPROFILE_CONTEXT_SWITCH_TRACE 0
-#include
-#include
-#endif
-
-extern "C" {
-#include "core/assert.h"
-#include "core/math.h"
-#include "microprofile.h"
-#include "render/render_backend.h"
-}
-
-static const int FONT_WIDTH = 1024;
-static const int FONT_HEIGHT = 9;
-#include "microprofile_font.inc"
-
-static const int MAX_2D_VERTICES = 32768;
-static const int MAX_2D_SURFACES = 256;
-
-struct microprofile {
- struct render_backend *r;
-
- texture_handle_t font_texture;
- struct ui_surface surfs[MAX_2D_SURFACES];
- int num_surfs;
- struct ui_vertex verts[MAX_2D_VERTICES];
- int num_verts;
-};
-
-static struct microprofile *s_mp;
-
-#define Q0(d, member, v) d[0].member = v
-#define Q1(d, member, v) \
- d[1].member = v; \
- d[3].member = v
-#define Q2(d, member, v) d[4].member = v
-#define Q3(d, member, v) \
- d[2].member = v; \
- d[5].member = v
-
-static struct ui_vertex *mp_alloc_verts(struct microprofile *mp,
- const struct ui_surface &desc,
- int count) {
-#ifdef HAVE_MICROPROFILE
- CHECK(mp->num_verts + count <= MAX_2D_VERTICES);
- uint32_t first_vert = mp->num_verts;
- mp->num_verts += count;
-
- /* try to batch with the last surface if possible */
- if (mp->num_surfs) {
- struct ui_surface &last_surf = mp->surfs[mp->num_surfs - 1];
-
- if (last_surf.prim_type == desc.prim_type &&
- last_surf.texture == desc.texture &&
- last_surf.src_blend == desc.src_blend &&
- last_surf.dst_blend == desc.dst_blend) {
- last_surf.num_verts += count;
- return &mp->verts[first_vert];
- }
- }
-
- /* else, allocate a new surface */
- CHECK(mp->num_surfs < MAX_2D_SURFACES);
- struct ui_surface &next_surf = mp->surfs[mp->num_surfs];
- next_surf.prim_type = desc.prim_type;
- next_surf.texture = desc.texture;
- next_surf.src_blend = desc.src_blend;
- next_surf.dst_blend = desc.dst_blend;
- next_surf.scissor = false;
- next_surf.first_vert = first_vert;
- next_surf.num_verts = count;
- mp->num_surfs++;
- return &mp->verts[first_vert];
-#endif
- return NULL;
-}
-
-static void mp_draw_text(struct microprofile *mp, int x, int y, uint32_t color,
- const char *text) {
-#ifdef HAVE_MICROPROFILE
- float fx = static_cast(x);
- float fy = static_cast(y);
- float fy2 = fy + (MICROPROFILE_TEXT_HEIGHT + 1);
- int text_len = static_cast(strlen(text));
-
- struct ui_vertex *vertex = mp_alloc_verts(mp, {PRIM_TRIANGLES,
- mp->font_texture,
- BLEND_SRC_ALPHA,
- BLEND_ONE_MINUS_SRC_ALPHA,
- false,
- {0.0f, 0.0f, 0.0f, 0.0f},
- 0,
- 0},
- 6 * text_len);
-
- for (int i = 0; i < text_len; i++) {
- float fx2 = fx + MICROPROFILE_TEXT_WIDTH;
- float fu = s_font_offsets[static_cast(text[i])] /
- static_cast(FONT_WIDTH);
- float fu2 = fu + MICROPROFILE_TEXT_WIDTH / static_cast(FONT_WIDTH);
-
- Q0(vertex, xy[0], fx);
- Q0(vertex, xy[1], fy);
- Q0(vertex, color, color);
- Q0(vertex, uv[0], fu);
- Q0(vertex, uv[1], 0.0f);
-
- Q1(vertex, xy[0], fx2);
- Q1(vertex, xy[1], fy);
- Q1(vertex, color, color);
- Q1(vertex, uv[0], fu2);
- Q1(vertex, uv[1], 0.0f);
-
- Q2(vertex, xy[0], fx2);
- Q2(vertex, xy[1], fy2);
- Q2(vertex, color, color);
- Q2(vertex, uv[0], fu2);
- Q2(vertex, uv[1], 1.0f);
-
- Q3(vertex, xy[0], fx);
- Q3(vertex, xy[1], fy2);
- Q3(vertex, color, color);
- Q3(vertex, uv[0], fu);
- Q3(vertex, uv[1], 1.0f);
-
- fx = fx2 + 1.0f;
-
- vertex += 6;
- }
-#endif
-}
-
-static void mp_draw_box(struct microprofile *mp, int x0, int y0, int x1, int y1,
- uint32_t color, enum box_type type) {
-#ifdef HAVE_MICROPROFILE
- struct ui_vertex *vertex = mp_alloc_verts(mp, {PRIM_TRIANGLES,
- 0,
- BLEND_SRC_ALPHA,
- BLEND_ONE_MINUS_SRC_ALPHA,
- false,
- {0.0f, 0.0f, 0.0f, 0.0f},
- 0,
- 0},
- 6);
-
- if (type == BOX_FLAT) {
- Q0(vertex, xy[0], (float)x0);
- Q0(vertex, xy[1], (float)y0);
- Q0(vertex, color, color);
- Q1(vertex, xy[0], (float)x1);
- Q1(vertex, xy[1], (float)y0);
- Q1(vertex, color, color);
- Q2(vertex, xy[0], (float)x1);
- Q2(vertex, xy[1], (float)y1);
- Q2(vertex, color, color);
- Q3(vertex, xy[0], (float)x0);
- Q3(vertex, xy[1], (float)y1);
- Q3(vertex, color, color);
- } else {
- uint32_t a = (color & 0xff000000) >> 24;
- uint32_t r = (color & 0xff0000) >> 16;
- uint32_t g = (color & 0xff00) >> 8;
- uint32_t b = color & 0xff;
- uint32_t max = MAX(MAX(MAX(r, g), b), 30u);
- uint32_t min = MIN(MIN(MIN(r, g), b), 180u);
-
- uint32_t r0 = 0xff & ((r + max) / 2);
- uint32_t g0 = 0xff & ((g + max) / 2);
- uint32_t b0 = 0xff & ((b + max) / 2);
- uint32_t r1 = 0xff & ((r + min) / 2);
- uint32_t g1 = 0xff & ((g + min) / 2);
- uint32_t b1 = 0xff & ((b + min) / 2);
- uint32_t color0 = (a << 24) | (b0 << 16) | (g0 << 8) | r0;
- uint32_t color1 = (a << 24) | (b1 << 16) | (g1 << 8) | r1;
-
- Q0(vertex, xy[0], (float)x0);
- Q0(vertex, xy[1], (float)y0);
- Q0(vertex, color, color0);
- Q1(vertex, xy[0], (float)x1);
- Q1(vertex, xy[1], (float)y0);
- Q1(vertex, color, color0);
- Q2(vertex, xy[0], (float)x1);
- Q2(vertex, xy[1], (float)y1);
- Q2(vertex, color, color1);
- Q3(vertex, xy[0], (float)x0);
- Q3(vertex, xy[1], (float)y1);
- Q3(vertex, color, color1);
- }
-#endif
-}
-
-static void mp_draw_line(struct microprofile *mp, float *verts, int num_verts,
- uint32_t color) {
-#ifdef HAVE_MICROPROFILE
- CHECK(num_verts);
-
- struct ui_vertex *vertex = mp_alloc_verts(mp, {PRIM_LINES,
- 0,
- BLEND_SRC_ALPHA,
- BLEND_ONE_MINUS_SRC_ALPHA,
- false,
- {0.0f, 0.0f, 0.0f, 0.0f},
- 0,
- 0},
- 2 * (num_verts - 1));
-
- for (int i = 0; i < num_verts - 1; ++i) {
- vertex[0].xy[0] = verts[i * 2];
- vertex[0].xy[1] = verts[i * 2 + 1];
- vertex[0].color = color;
- vertex[1].xy[0] = verts[(i + 1) * 2];
- vertex[1].xy[1] = verts[(i + 1) * 2 + 1];
- vertex[1].color = color;
- vertex += 2;
- }
-#endif
-}
-
-void mp_render_frame(struct microprofile *mp, int width, int height) {
-#ifdef HAVE_MICROPROFILE
- s_mp = mp;
-
- /* update draw surfaces */
- MicroProfileDraw(width, height);
-
- /* render the surfaces */
- r_viewport(mp->r, 0, 0, width, height);
-
- r_begin_ui_surfaces(mp->r, mp->verts, mp->num_verts, nullptr, 0);
-
- for (int i = 0; i < mp->num_surfs; i++) {
- struct ui_surface *surf = &mp->surfs[i];
- r_draw_ui_surface(mp->r, surf);
- }
-
- r_end_ui_surfaces(mp->r);
-
- /* reset surfaces */
- mp->num_surfs = 0;
- mp->num_verts = 0;
-#endif
-}
-
-void mp_mousemove(struct microprofile *mp, int x, int y) {
-#ifdef HAVE_MICROPROFILE
- MicroProfileMousePosition(x, y, 0);
-#endif
-}
-
-void mp_keydown(struct microprofile *mp, enum keycode key, int16_t value) {
-#ifdef HAVE_MICROPROFILE
- if (key == K_F2) {
- if (value > 0) {
- MicroProfileToggleDisplayMode();
- }
- } else if (key == K_MOUSE1) {
- int down = value > 0;
- MicroProfileMouseButton(down, 0);
- } else if (key == K_MOUSE2) {
- int down = value > 0;
- MicroProfileMouseButton(0, down);
- }
-#endif
-}
-
-void mp_destroy(struct microprofile *mp) {
-#ifdef HAVE_MICROPROFILE
- r_destroy_texture(mp->r, mp->font_texture);
-
- free(mp);
-#endif
-}
-
-struct microprofile *mp_create(struct render_backend *r) {
-#ifdef HAVE_MICROPROFILE
- struct microprofile *mp = reinterpret_cast(
- calloc(1, sizeof(struct microprofile)));
-
- mp->r = r;
-
- /* register and enable cpu and gpu groups by default */
- uint16_t cpu_group = MicroProfileGetGroup("cpu", MicroProfileTokenTypeCpu);
- g_MicroProfile.nActiveGroupWanted |= 1ll << cpu_group;
-
- uint16_t gpu_group = MicroProfileGetGroup("gpu", MicroProfileTokenTypeCpu);
- g_MicroProfile.nActiveGroupWanted |= 1ll << gpu_group;
-
- /* render time / average time bars by default */
- g_MicroProfile.nBars |= MP_DRAW_TIMERS | MP_DRAW_AVERAGE | MP_DRAW_CALL_COUNT;
-
- /* aggregate stats every 120 frames by default */
- g_MicroProfile.nAggregateFlip = 120;
-
- /* register the font texture */
- mp->font_texture =
- r_create_texture(mp->r, PXL_RGBA, FILTER_NEAREST, WRAP_CLAMP_TO_EDGE,
- WRAP_CLAMP_TO_EDGE, 0, FONT_WIDTH, FONT_HEIGHT,
- reinterpret_cast(s_font_data));
-
- return mp;
-#else
- return NULL;
-#endif
-}
-
-/* microprofile expects the following three functions to be defined, they're
- called during MicroProfileDraw */
-#ifdef HAVE_MICROPROFILE
-void MicroProfileDrawText(int x, int y, uint32_t color, const char *text,
- uint32_t len) {
- /* microprofile provides 24-bit rgb values for text color */
- color = 0xff000000 | color;
-
- /* convert color from argb -> abgr */
- color = (color & 0xff000000) | ((color & 0xff) << 16) | (color & 0xff00) |
- ((color & 0xff0000) >> 16);
-
- mp_draw_text(s_mp, x, y, color, text);
-}
-
-void MicroProfileDrawBox(int x0, int y0, int x1, int y1, uint32_t color,
- MicroProfileBoxType type) {
- /* convert color from argb -> abgr */
- color = (color & 0xff000000) | ((color & 0xff) << 16) | (color & 0xff00) |
- ((color & 0xff0000) >> 16);
-
- mp_draw_box(s_mp, x0, y0, x1, y1, color, (enum box_type)type);
-}
-
-void MicroProfileDrawLine2D(uint32_t num_vertices, float *vertices,
- uint32_t color) {
- /* microprofile provides 24-bit rgb values for line color */
- color = 0xff000000 | color;
-
- /* convert color from argb -> abgr */
- color = (color & 0xff000000) | ((color & 0xff) << 16) | (color & 0xff00) |
- ((color & 0xff0000) >> 16);
-
- mp_draw_line(s_mp, vertices, num_vertices, color);
-}
-#endif
diff --git a/src/microprofile.h b/src/microprofile.h
deleted file mode 100644
index 7cd190c2..00000000
--- a/src/microprofile.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef MICROPROFILE_IMPL_H
-#define MICROPROFILE_IMPL_H
-
-#include "host/keycode.h"
-
-struct microprofile;
-struct render_backend;
-
-struct microprofile *mp_create(struct render_backend *r);
-void mp_destroy(struct microprofile *mp);
-
-void mp_keydown(struct microprofile *mp, enum keycode key, int16_t value);
-void mp_mousemove(struct microprofile *mp, int x, int y);
-
-void mp_render_frame(struct microprofile *mp, int width, int height);
-
-#endif
diff --git a/src/microprofile_font.inc b/src/microprofile_font.inc
deleted file mode 100644
index 6825083a..00000000
--- a/src/microprofile_font.inc
+++ /dev/null
@@ -1,1558 +0,0 @@
-static const uint32_t s_font_data[] = {
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
- 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff,
- 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000};
-
-static const int s_font_offsets[] = {
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 513, 521, 529, 537, 545, 553, 561, 569, 577, 585, 593, 601,
- 609, 617, 625, 433, 441, 449, 457, 465, 473, 481, 489, 497, 505, 633, 641,
- 649, 657, 665, 673, 681, 1, 9, 17, 25, 33, 41, 49, 57, 65, 73,
- 81, 89, 97, 105, 113, 121, 129, 137, 145, 153, 161, 169, 177, 185, 193,
- 201, 689, 697, 705, 713, 721, 206, 217, 225, 233, 241, 249, 257, 265, 273,
- 281, 289, 297, 305, 313, 321, 329, 337, 345, 353, 361, 369, 377, 385, 393,
- 401, 409, 417, 729, 737, 745, 753, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206,
-};