summaryrefslogtreecommitdiffstats
path: root/src/Runtime/Source/system/Qt3DSDataLogger.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Runtime/Source/system/Qt3DSDataLogger.h')
-rw-r--r--src/Runtime/Source/system/Qt3DSDataLogger.h226
1 files changed, 226 insertions, 0 deletions
diff --git a/src/Runtime/Source/system/Qt3DSDataLogger.h b/src/Runtime/Source/system/Qt3DSDataLogger.h
new file mode 100644
index 00000000..b834edab
--- /dev/null
+++ b/src/Runtime/Source/system/Qt3DSDataLogger.h
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _DATA_LOGGER_H_
+#define _DATA_LOGGER_H_
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTypes.h"
+#include "Qt3DSDataLoggerEnums.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+typedef TTimeUnit TDataLoggerTimeUnit;
+
+//==============================================================================
+/**
+* The structure that holds all the info we collect
+*/
+struct SPerfLogEntry
+{
+ UINT32 m_EntryEnum : 31;
+ UINT32 m_StartBool : 1;
+
+ TDataLoggerTimeUnit m_Time;
+
+ SPerfLogEntry(UINT32 inEntryEnum, BOOL inStartFlag, TDataLoggerTimeUnit inTime)
+ : m_EntryEnum(inEntryEnum)
+ , m_StartBool(inStartFlag ? 1U : 0U)
+ , m_Time(inTime)
+ {
+ // Make sure our enums never use the high bit
+ Q3DStudio_ASSERT(false == (inEntryEnum & (1 << 31)));
+ }
+};
+
+//==============================================================================
+/**
+* The stack based helper class that wraps the actually logging of start and end messages
+* for use with start/end time logging.
+*/
+template <typename T>
+class CPerfLogPairedEventWrapper
+{
+public:
+ typedef void (*TLogEntryInternal)(UINT32 inEntryEnum, BOOL inStartFlag);
+
+private:
+ UINT32 m_EntryEnum;
+ static TLogEntryInternal m_InternalLogFunc;
+
+private:
+ static void LogEntry(UINT32 inEntryEnum, BOOL inStartFlag);
+
+public:
+ CPerfLogPairedEventWrapper(UINT32 inEntryEnum);
+ ~CPerfLogPairedEventWrapper();
+
+ static void Enable();
+ static void Disable();
+};
+
+//==============================================================================
+/**
+*/
+class CPerfLogPairedEventWrapperDummy
+{
+public:
+ CPerfLogPairedEventWrapperDummy(UINT32 /*inEntryEnum*/) {}
+ ~CPerfLogPairedEventWrapperDummy() {}
+};
+
+// Dummy structs, so we get one 'type' of class per log event
+// so we can turn things on and off
+struct SPerfLogGeneralEvent1
+{
+};
+struct SPerfLogGeneralEvent2
+{
+};
+
+struct SPerfLogRenderEvent1
+{
+};
+struct SPerfLogSceneEvent1
+{
+};
+
+struct SPerfLogMathEvent1
+{
+};
+struct SPerfLogPresentationEvent1
+{
+};
+struct SPerfLogRenderEvent2
+{
+};
+
+// level 0
+// no profiling at all...
+
+// level 1
+typedef CPerfLogPairedEventWrapper<SPerfLogGeneralEvent1>
+ TPerfLogGeneralEvent1; // Frame, update presentations, update scene, render scene
+typedef CPerfLogPairedEventWrapper<SPerfLogGeneralEvent2>
+ TPerfLogGeneralEvent2; // Event processing and manager updates,
+// call frame and slide callbacks,
+// opaque, transparent, layer render, finalize drawlist and pick
+// level 2
+typedef CPerfLogPairedEventWrapper<SPerfLogRenderEvent1>
+ TPerfLogRenderEvent1; // More detailed rendering
+typedef CPerfLogPairedEventWrapper<SPerfLogSceneEvent1>
+ TPerfLogSceneEvent1; // More detailed scene update
+
+// level 3
+typedef CPerfLogPairedEventWrapper<SPerfLogMathEvent1> TPerfLogMathEvent1; // vector and matrix math
+typedef CPerfLogPairedEventWrapper<SPerfLogPresentationEvent1>
+ TPerfLogPresentationEvent1; // More detailed scene update
+typedef CPerfLogPairedEventWrapper<SPerfLogRenderEvent2> TPerfLogRenderEvent2; //
+
+// Defines
+#ifdef _PERF_LOG
+#define PerfLogGeneralEvent1(inEventID) TPerfLogGeneralEvent1 thePerfLog(inEventID);
+#define PerfLogGeneralEvent2(inEventID) TPerfLogGeneralEvent2 thePerfLog(inEventID);
+
+#define PerfLogRenderEvent1(inEventID) TPerfLogRenderEvent1 thePerfLog(inEventID);
+#define PerfLogSceneEvent1(inEventID) TPerfLogSceneEvent1 thePerfLog(inEventID);
+
+#define PerfLogMathEvent1(inEventID) TPerfLogMathEvent1 thePerfLog(inEventID);
+#define PerfLogPresentationEvent1(inEventID) TPerfLogPresentationEvent1 thePerfLog(inEventID);
+#define PerfLogRenderEvent2(inEventID) TPerfLogRenderEvent2 thePerfLog(inEventID);
+#else
+#define PerfLogGeneralEvent1(inEventID)
+#define PerfLogGeneralEvent2(inEventID)
+
+#define PerfLogRenderEvent1(inEventID)
+#define PerfLogSceneEvent1(inEventID)
+
+#define PerfLogMathEvent1(inEventID)
+#define PerfLogPresentationEvent1(inEventID)
+#define PerfLogRenderEvent2(inEventID)
+#endif
+
+//==============================================================================
+/**
+*/
+class CDataLogger
+{
+private:
+ // App level function to write this out to a stream/file... set externally
+ typedef void (*TDataLoggerWriteFunc)(void *inUserData, SPerfLogEntry inEntry);
+ typedef TDataLoggerTimeUnit (*TGetTimeFunc)(void *inUserData);
+
+public:
+ struct SExternalFunctors
+ {
+ void *m_UserData;
+ TDataLoggerWriteFunc m_WriteFunc;
+ TGetTimeFunc m_GetTimeFunc;
+
+ SExternalFunctors()
+ : m_UserData(NULL)
+ , m_WriteFunc(NULL)
+ , m_GetTimeFunc(NULL)
+ {
+ }
+ };
+
+ enum EDataLoggerLevel {
+ LOG_LEVEL_NONE,
+ LOG_LEVEL_1,
+ LOG_LEVEL_2,
+ LOG_LEVEL_3,
+ LOG_LEVEL_INVALID, // use this if you want to selectively enable or disable loggers
+ };
+
+private:
+ static SExternalFunctors m_Functors;
+ static EDataLoggerLevel m_LogLevel;
+ static BOOL m_Enabled;
+
+public:
+ static void SetFunctors(SExternalFunctors inFunctors);
+ static void LogEntry(UINT32 inEntryEnum, BOOL inStartFlag);
+ static void Enable();
+ static void Disable();
+
+ static void SetLogLevel(EDataLoggerLevel inLogLevel);
+};
+
+} // namespace Q3DStudio
+
+#include "Qt3DSDataLogger.hpp"
+
+#endif // _DATA_LOGGER_H_