1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2  * This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef GFX_CONTEXTSTATETRACKER_H
7 #define GFX_CONTEXTSTATETRACKER_H
8 
9 #include "GLTypes.h"
10 #include "mozilla/TimeStamp.h"
11 #include "nsTArray.h"
12 #include <string.h>
13 
14 namespace mozilla {
15 namespace gl {
16 class GLContext;
17 } // namespace gl
18 
19 /**
20  * This class tracks the state of the context for debugging and profiling.
21  * Each section pushes a new stack entry and must be matched by an end section.
22  * All nested section must be ended before ending a parent section.
23  */
24 class ContextStateTracker {
25 public:
ContextStateTracker()26   ContextStateTracker() {}
27 
28 private:
29 
IsProfiling()30   bool IsProfiling() { return true; }
31 
32 protected:
33   typedef GLuint TimerQueryHandle;
34 
35   class ContextState {
36   public:
ContextState(const char * aSectionName)37     explicit ContextState(const char* aSectionName)
38       : mSectionName(aSectionName)
39     {}
40 
41     const char* mSectionName;
42     mozilla::TimeStamp mCpuTimeStart;
43     mozilla::TimeStamp mCpuTimeEnd;
44     TimerQueryHandle mStartQueryHandle;
45   };
46 
Top()47   ContextState& Top() {
48     MOZ_ASSERT(mSectionStack.Length());
49     return mSectionStack[mSectionStack.Length() - 1];
50   }
51 
52   nsTArray<ContextState> mCompletedSections;
53   nsTArray<ContextState> mSectionStack;
54 };
55 
56 /*
57 class ID3D11DeviceContext;
58 
59 class ContextStateTrackerD3D11 final : public ContextStateTracker {
60 public:
61   // TODO Implement me
62   void PushD3D11Section(ID3D11DeviceContext* aCtxt, const char* aSectionName) {}
63   void PopD3D11Section(ID3D11DeviceContext* aCtxt, const char* aSectionName) {}
64   void DestroyD3D11(ID3D11DeviceContext* aCtxt) {}
65 
66 private:
67   void Flush();
68 };
69 */
70 
71 class ContextStateTrackerOGL final : public ContextStateTracker {
72   typedef mozilla::gl::GLContext GLContext;
73 public:
74   void PushOGLSection(GLContext* aGL, const char* aSectionName);
75   void PopOGLSection(GLContext* aGL, const char* aSectionName);
76   void DestroyOGL(GLContext* aGL);
77 private:
78   void Flush(GLContext* aGL);
79 };
80 
81 } // namespace mozilla
82 
83 #endif
84 
85