9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBoxVideo Display D3D User mode dll
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_GET_TIME_NANO() RTTimeNanoTS()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_GET_TIME_MILLI() RTTimeMilliTS()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync void dump(void *pvObj, uint64_t cTotalEntriesTime, uint64_t cTotalTime) const
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// VBOXDISPPROFILE_DUMP((pDevice, "Entry '%s': calls(%d), time: nanos(%I64u), micros(%I64u), millis(%I64u)\n",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// m_pName, m_cCalls,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// m_cTime, m_cTime/1000, m_cTime/1000000));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%u\t%u\t%f\t%f", m_pName, pvObj,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// m_cCalls,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// (uint32_t)m_cTime, (uint32_t)(m_cTime/1000), (uint32_t)(m_cTime/1000000),
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// (((double)m_cTime)/cTotalEntriesTime),
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// (((double)m_cTime)/cTotalTime)));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%f\t%f", m_pName, pvObj,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileEntry * entry = &m_Entries[m_cEntries];
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileEntry * get(uint32_t u32Entry, const char *pName)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileEntry * entry = &m_Entries[u32Entry];
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync for (uint32_t i = 0, e = 0; e < m_cEntries && i < RT_ELEMENTS(m_Entries); ++i) { \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBOXDISPPROFILESET_FOREACHENTRY( m_Entries[i].reset(); );
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBOXDISPPROFILESET_FOREACHENTRY( cEntriesTime += m_Entries[i].getTime(); );
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBOXDISPPROFILE_DUMP((">>>> '%s' [0x%p]: Start of VBox Disp Dump: num entries(%d), et(%u), tt(%u) >>>>>", m_pName, pvObj, m_cEntries,
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync (uint32_t)(cEntriesTime / 1000000), (uint32_t)(m_cTime / 1000000)));
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBOXDISPPROFILE_DUMP(("Name\tCalls\tNanos\tMicros\tMillis\tentries_quota\ttotal_quota"));
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Entries[i].dump(pvObj, cEntriesTime, m_cTime); );
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBOXDISPPROFILE_DUMP(("<<<< '%s' [0x%p]: End of VBox Disp Dump <<<<<", m_pName, pvObj));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileEntry m_Entries[VBOXDISPPROFILE_MAX_SETSIZE];
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsynctemplate<typename T, typename P> class VBoxDispProfileScopeLogger
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync VBoxDispProfileScopeLogger(T *pEntry, P PostProcess) :
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t cNewTime = VBOXDISPPROFILE_GET_TIME_NANO();
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync /* to be called in case fps counter was created with default constructor */
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Data.mpaPeriods = (uint64_t *)RTMemAllocZ(sizeof (m_Data.mpaPeriods[0]) * cPeriods);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Data.mpaCalls = (uint32_t *)RTMemAllocZ(sizeof (m_Data.mpaCalls[0]) * cPeriods);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Data.mpaTimes = (uint64_t *)RTMemAllocZ(sizeof (m_Data.mpaTimes[0]) * cPeriods);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mPeriodSum += curPeriod - m_Data.mpaPeriods[m_Data.miPeriod];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mCallsSum += m_Data.mCurCalls - m_Data.mpaCalls[m_Data.miPeriod];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mpaCalls[m_Data.miPeriod] = m_Data.mCurCalls;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mTimeUsedSum += m_Data.mCurTimeUsed - m_Data.mpaTimes[m_Data.miPeriod];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mpaTimes[m_Data.miPeriod] = m_Data.mCurTimeUsed;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return ((double)1000000000.0) / GetEveragePeriod();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return GetFps() * m_Data.mCallsSum / m_Data.mcPeriods;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return 100.0*m_Data.mTimeUsedSum/m_Data.mPeriodSum;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_FUNCTION_LOGGER_DISABLE_CURRENT() do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_FUNCTION_LOGGER_LOG_AND_DISABLE_CURRENT() do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#ifdef VBOXDISPPROFILE_FUNCTION_LOGGER_GLOBAL_PROFILE
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync# define VBOXDISPPROFILE_FUNCTION_LOGGER_DEFINE(_p, _T, _v) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync static VBoxDispProfileEntry * __pVBoxDispProfileEntry = NULL; \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!__pVBoxDispProfileEntry) { __pVBoxDispProfileEntry = _p.alloc(__FUNCTION__); } \
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync VBoxDispProfileScopeLogger<VBoxDispProfileEntry, _T> __vboxDispProfileFunctionLogger(__pVBoxDispProfileEntry, _v);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync# error "VBOXDISPPROFILE_FUNCTION_LOGGER_INDEX_GEN should be fedined!"
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync# define VBOXDISPPROFILE_FUNCTION_LOGGER_DEFINE(_p, _T, _v) \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync static uint32_t __u32VBoxDispProfileIndex = VBOXDISPPROFILE_FUNCTION_LOGGER_INDEX_GEN(); \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileEntry * __pVBoxDispProfileEntry = _p.get(__u32VBoxDispProfileIndex, __FUNCTION__); \
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync VBoxDispProfileScopeLogger<VBoxDispProfileEntry, _T> __vboxDispProfileFunctionLogger(__pVBoxDispProfileEntry, _v);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_STATISTIC_LOGGER_DISABLE_CURRENT() do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_STATISTIC_LOGGER_LOG_AND_DISABLE_CURRENT() do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync#define VBOXDISPPROFILE_STATISTIC_LOGGER_DEFINE(_p, _T, _v) \
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync VBoxDispProfileScopeLogger<VBoxDispProfileFpsCounter, _T> __vboxDispProfileStatisticLogger(_p, _v);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync//#define VBOXDISPPROFILE_FUNCTION_PROLOGUE(_p) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// VBOXDISPPROFILE_FUNCTION_LOGGER_DEFINE(_p)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif /* #ifndef ___VBoxDispProfile_h__ */