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