9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBoxVideo Display D3D User mode dll
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
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 */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifndef ___VBoxDispProfile_h__
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define ___VBoxDispProfile_h__
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#include "VBoxDispD3DCmn.h"
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/ctype.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/time.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_MAX_SETSIZE 512
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_GET_TIME_NANO() RTTimeNanoTS()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_GET_TIME_MILLI() RTTimeMilliTS()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_DUMP(_m) do {\
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync LOGREL_EXACT(_m); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncclass VBoxDispProfileEntry
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncpublic:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileEntry() :
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cCalls(0),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cTime(0),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_pName(NULL)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileEntry(const char *pName) :
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cCalls(0),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cTime(0),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_pName(pName)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void step(uint64_t cTime)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++m_cCalls;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cTime+= cTime;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void reset()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cCalls = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cTime = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync uint64_t getTime() const
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return m_cTime;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync uint32_t getNumCalls() const
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return m_cCalls;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync const char* getName() const
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return m_pName;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync void dump(void *pvObj, uint64_t cTotalEntriesTime, uint64_t cTotalTime) const
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
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
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
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%f\t%f", m_pName, pvObj,
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cCalls,
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync (uint32_t)(m_cTime/1000000),
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync (((double)m_cTime)/cTotalEntriesTime),
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync (((double)m_cTime)/cTotalTime)));
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncprivate:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t m_cCalls;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t m_cTime;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const char * m_pName;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncclass VBoxDispProfileSet
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncpublic:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileSet(const char *pName) :
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cEntries(0),
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cIterations(0),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_pName(pName)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cTime = VBOXDISPPROFILE_GET_TIME_NANO();
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileSet() :
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cEntries(0),
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cIterations(0),
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_pName("global")
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cTime = VBOXDISPPROFILE_GET_TIME_NANO();
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileEntry * alloc(const char *pName)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (m_cEntries < RT_ELEMENTS(m_Entries))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileEntry * entry = &m_Entries[m_cEntries];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++m_cEntries;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *entry = VBoxDispProfileEntry(pName);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return entry;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileEntry * get(uint32_t u32Entry, const char *pName)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync if (u32Entry < RT_ELEMENTS(m_Entries))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileEntry * entry = &m_Entries[u32Entry];
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync if (entry->getName())
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return entry;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync ++m_cEntries;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync *entry = VBoxDispProfileEntry(pName);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return entry;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync uint32_t reportIteration()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return ++m_cIterations;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync uint32_t getNumIterations() const
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return m_cIterations;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync uint32_t getNumEntries() const
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync return m_cEntries;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#define VBOXDISPPROFILESET_FOREACHENTRY(_op) \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync for (uint32_t i = 0, e = 0; e < m_cEntries && i < RT_ELEMENTS(m_Entries); ++i) { \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync if (m_Entries[i].getName()) { \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync { \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync _op \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync } \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync ++e; \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync } \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync } \
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync void resetEntries()
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBOXDISPPROFILESET_FOREACHENTRY( m_Entries[i].reset(); );
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cTime = VBOXDISPPROFILE_GET_TIME_NANO();
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync void reset()
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cEntries = 0;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_cTime = VBOXDISPPROFILE_GET_TIME_NANO();
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync void dump(void *pvObj)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync uint64_t cEntriesTime = 0;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBOXDISPPROFILESET_FOREACHENTRY( cEntriesTime += m_Entries[i].getTime(); );
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
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 VBOXDISPPROFILESET_FOREACHENTRY(
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync if (m_Entries[i].getNumCalls())
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Entries[i].dump(pvObj, cEntriesTime, m_cTime); );
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBOXDISPPROFILE_DUMP(("<<<< '%s' [0x%p]: End of VBox Disp Dump <<<<<", m_pName, pvObj));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncprivate:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileEntry m_Entries[VBOXDISPPROFILE_MAX_SETSIZE];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t m_cEntries;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync uint32_t m_cIterations;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync uint64_t m_cTime;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const char * m_pName;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsyncclass VBoxDispProfileDummyPostProcess
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncpublic:
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync void postProcess(){}
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync};
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsynctemplate<typename T, typename P> class VBoxDispProfileScopeLogger
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync{
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsyncpublic:
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync VBoxDispProfileScopeLogger(T *pEntry, P PostProcess) :
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_pEntry(pEntry),
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync m_PostProcess(PostProcess),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_bDisable(FALSE)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_cTime = VBOXDISPPROFILE_GET_TIME_NANO();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ~VBoxDispProfileScopeLogger()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!m_bDisable)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync logStep();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void disable()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_bDisable = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void logAndDisable()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync logStep();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync disable();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncprivate:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void logStep()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync m_PostProcess.postProcess();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t cNewTime = VBOXDISPPROFILE_GET_TIME_NANO();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_pEntry->step(cNewTime - m_cTime);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync T *m_pEntry;
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync P m_PostProcess;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t m_cTime;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL m_bDisable;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncclass VBoxDispProfileFpsCounter
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncpublic:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispProfileFpsCounter(uint32_t cPeriods)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync init(cPeriods);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileFpsCounter()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(&m_Data, 0, sizeof (m_Data));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ~VBoxDispProfileFpsCounter()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync term();
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync void term()
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync if (m_Data.mpaPeriods)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync RTMemFree(m_Data.mpaPeriods);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Data.mpaPeriods = NULL;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync if (m_Data.mpaCalls)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync RTMemFree(m_Data.mpaCalls);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Data.mpaCalls = NULL;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync if (m_Data.mpaTimes)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync RTMemFree(m_Data.mpaTimes);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Data.mpaTimes = NULL;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Data.mcPeriods = 0;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync /* to be called in case fps counter was created with default constructor */
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync void init(uint32_t cPeriods)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync memset(&m_Data, 0, sizeof (m_Data));
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync m_Data.mcPeriods = cPeriods;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync if (cPeriods)
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync {
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);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void ReportFrame()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t cur = VBOXDISPPROFILE_GET_TIME_NANO();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(m_Data.mPrevTime)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t curPeriod = cur - m_Data.mPrevTime;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mPeriodSum += curPeriod - m_Data.mpaPeriods[m_Data.miPeriod];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mpaPeriods[m_Data.miPeriod] = curPeriod;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mCallsSum += m_Data.mCurCalls - m_Data.mpaCalls[m_Data.miPeriod];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mpaCalls[m_Data.miPeriod] = m_Data.mCurCalls;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mTimeUsedSum += m_Data.mCurTimeUsed - m_Data.mpaTimes[m_Data.miPeriod];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mpaTimes[m_Data.miPeriod] = m_Data.mCurTimeUsed;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++m_Data.miPeriod;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.miPeriod %= m_Data.mcPeriods;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mPrevTime = cur;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++m_Data.mcFrames;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mCurTimeUsed = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mCurCalls = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void step(uint64_t Time)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_Data.mCurTimeUsed += Time;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++m_Data.mCurCalls;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t GetEveragePeriod()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return m_Data.mPeriodSum / m_Data.mcPeriods;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync double GetFps()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return ((double)1000000000.0) / GetEveragePeriod();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync double GetCps()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return GetFps() * m_Data.mCallsSum / m_Data.mcPeriods;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync double GetTimeProcPercent()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return 100.0*m_Data.mTimeUsedSum/m_Data.mPeriodSum;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t GetNumFrames()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return m_Data.mcFrames;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncprivate:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t mPeriodSum;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t *mpaPeriods;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t mPrevTime;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t mcFrames;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t mcPeriods;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t miPeriod;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t mCallsSum;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t *mpaCalls;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t mTimeUsedSum;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t *mpaTimes;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t mCurTimeUsed;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t mCurCalls;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } m_Data;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_FUNCTION_LOGGER_DISABLE_CURRENT() do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync __vboxDispProfileFunctionLogger.disable();\
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_FUNCTION_LOGGER_LOG_AND_DISABLE_CURRENT() do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync __vboxDispProfileFunctionLogger.logAndDisable();\
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
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#else
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync# ifndef VBOXDISPPROFILE_FUNCTION_LOGGER_INDEX_GEN
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync# error "VBOXDISPPROFILE_FUNCTION_LOGGER_INDEX_GEN should be fedined!"
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync# endif
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);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_STATISTIC_LOGGER_DISABLE_CURRENT() do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync __vboxDispProfileStatisticLogger.disable();\
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPPROFILE_STATISTIC_LOGGER_LOG_AND_DISABLE_CURRENT() do { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync __vboxDispProfileStatisticLogger.logAndDisable();\
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync#define VBOXDISPPROFILE_STATISTIC_LOGGER_DEFINE(_p, _T, _v) \
7fde7f7bd127420c68c4899ccbafe895a5459b15vboxsync VBoxDispProfileScopeLogger<VBoxDispProfileFpsCounter, _T> __vboxDispProfileStatisticLogger(_p, _v);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync//#define VBOXDISPPROFILE_FUNCTION_PROLOGUE(_p) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// VBOXDISPPROFILE_FUNCTION_LOGGER_DEFINE(_p)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif /* #ifndef ___VBoxDispProfile_h__ */