1 /*
2  * Copyright 2014 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrTracing_DEFINED
9 #define GrTracing_DEFINED
10 
11 #include "GrGpu.h"
12 #include "GrTraceMarker.h"
13 #include "SkTLazy.h"
14 #include "SkTraceEvent.h"
15 
16 /**
17  * Marker generation class used for adding and removing markers around code blocks
18  */
19 class GrGpuTraceMarkerGenerator : public ::SkNoncopyable {
20 public:
GrGpuTraceMarkerGenerator()21     GrGpuTraceMarkerGenerator() {}
22 
~GrGpuTraceMarkerGenerator()23     ~GrGpuTraceMarkerGenerator() {
24         if (fTraceMarker.isValid()) {
25             // TODO remove trace marker
26         }
27     }
28 
initialize(const char * marker_str,int * marker_counter)29     void initialize(const char* marker_str, int* marker_counter) {
30         // GrGpuTraceMarker* traceMarker = fTraceMarker.init(marker_str, *marker_counter);
31         // TODO add trace marker
32     }
33 
34 private:
35     SkTLazy<GrGpuTraceMarker> fTraceMarker;
36 };
37 
38 class GrGpuTraceMarkerGeneratorContext : public ::SkNoncopyable {
39 public:
GrGpuTraceMarkerGeneratorContext(GrContext * context)40     GrGpuTraceMarkerGeneratorContext(GrContext* context) {}
41 
~GrGpuTraceMarkerGeneratorContext()42     ~GrGpuTraceMarkerGeneratorContext() {
43         if (fTraceMarker.isValid()) {
44             // TODO remove trace marker
45         }
46     }
47 
initialize(const char * marker_str,int * marker_counter)48     void initialize(const char* marker_str, int* marker_counter) {
49         // GrGpuTraceMarker* traceMarker = fTraceMarker.init(marker_str, *marker_counter);
50         // TODO add trace marker
51     }
52 
53 private:
54     SkTLazy<GrGpuTraceMarker> fTraceMarker;
55 };
56 
57 /**
58  * GR_CREATE_TRACE_MARKER will place begin and end trace markers for both
59  * cpu and gpu (if gpu tracing enabled) for the current scope.
60  * name is of type const char* and target is of type GrDrawTarget*
61  */
62 #define GR_CREATE_TRACE_MARKER(name, target)                                                       \
63     /* Chromium tracing */                                                                         \
64     static int SK_MACRO_APPEND_LINE(name_counter) = 0;                                             \
65     bool SK_MACRO_APPEND_LINE(gpuTracingEnabled);                                                  \
66     TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),                      \
67                                        &SK_MACRO_APPEND_LINE(gpuTracingEnabled));                  \
68     if (SK_MACRO_APPEND_LINE(gpuTracingEnabled)) {                                                 \
69         INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED(name, SK_MACRO_APPEND_LINE(name_counter), target)   \
70     }                                                                                              \
71     INTERNAL_TRACE_EVENT_ADD_SCOPED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), name,                   \
72                                     "id", SK_MACRO_APPEND_LINE(name_counter));
73 
74 #define INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED(name, name_counter, target)        \
75     static const char* SK_MACRO_APPEND_LINE(static_name) = name;                  \
76     INTERNAL_GR_CREATE_TRACE_MARKER(SK_MACRO_APPEND_LINE(static_name),            \
77                                     name_counter,                                 \
78                                     target)                                       \
79     sk_atomic_inc(&name_counter);
80 
81 #define INTERNAL_GR_CREATE_TRACE_MARKER(name, name_counter, target, ...)          \
82     GR_CREATE_GPU_TRACE_MARKER(name, name_counter, target)                        \
83 
84 #define GR_CREATE_GPU_TRACE_MARKER(name, name_counter, target)                    \
85     GrGpuTraceMarkerGenerator SK_MACRO_APPEND_LINE(TMG)(target);                  \
86     SK_MACRO_APPEND_LINE(TMG).initialize(name, &name_counter);                    \
87 
88 /**
89  * Context level GrTracing macros, classname and op are const char*, context is GrContext
90  * TODO can we just have one set of macros?  Probably.
91  */
92 #define GR_CREATE_TRACE_MARKER_CONTEXT(classname, op, context)                                     \
93     /* Chromium tracing */                                                                         \
94     static int SK_MACRO_APPEND_LINE(name_counter) = 0;                                             \
95     bool SK_MACRO_APPEND_LINE(gpuTracingEnabled);                                                  \
96     TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),                      \
97                                        &SK_MACRO_APPEND_LINE(gpuTracingEnabled));                  \
98     if (SK_MACRO_APPEND_LINE(gpuTracingEnabled)) {                                                 \
99         INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED_C(classname "::" op,                                \
100                                                  SK_MACRO_APPEND_LINE(name_counter), context)      \
101     }                                                                                              \
102     GR_AUDIT_TRAIL_AUTO_FRAME(context->getAuditTrail(), classname "::" op);                        \
103     INTERNAL_TRACE_EVENT_ADD_SCOPED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), classname "::" op,      \
104                                     "id", SK_MACRO_APPEND_LINE(name_counter));
105 
106 #define INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED_C(name, name_counter, context)     \
107     static const char* SK_MACRO_APPEND_LINE(static_name) = name;                  \
108     INTERNAL_GR_CREATE_TRACE_MARKER_C(SK_MACRO_APPEND_LINE(static_name),          \
109                                       name_counter,                               \
110                                       context)                                    \
111     sk_atomic_inc(&name_counter);
112 
113 #define INTERNAL_GR_CREATE_TRACE_MARKER_C(name, name_counter, context, ...)       \
114     GR_CREATE_GPU_TRACE_MARKER_C(name, name_counter, context)                     \
115 
116 #define GR_CREATE_GPU_TRACE_MARKER_C(name, name_counter, context)                 \
117     GrGpuTraceMarkerGeneratorContext SK_MACRO_APPEND_LINE(TMG)(context);          \
118     SK_MACRO_APPEND_LINE(TMG).initialize(name, &name_counter);                    \
119 
120 #endif
121