12a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org/*
22a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * Copyright 2014 Google Inc.
32a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org *
42a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
52a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * found in the LICENSE file.
62a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org */
72a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
82a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org#ifndef GrTracing_DEFINED
92a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org#define GrTracing_DEFINED
102a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
112a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org#include "GrDrawTarget.h"
12bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel#include "GrGpu.h"
13bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel#include "GrInOrderDrawBuffer.h"
142a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org#include "GrTraceMarker.h"
152a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org#include "SkTraceEvent.h"
162a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
172a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org/**
182a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * Marker generation class used for adding and removing markers around code blocks
192a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org */
202a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.orgclass GrGpuTraceMarkerGenerator : public ::SkNoncopyable {
212a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.orgpublic:
222a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    GrGpuTraceMarkerGenerator(GrDrawTarget* target) : fTarget(target) {}
232a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
242a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    ~GrGpuTraceMarkerGenerator() {
252a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org        if (fTraceMarker.isValid()) {
262a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org            fTarget->removeGpuTraceMarker(fTraceMarker.get());
272a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org        }
282a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    }
292a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
302a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    void initialize(const char* marker_str, int* marker_counter) {
312a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org        GrGpuTraceMarker* traceMarker = fTraceMarker.init();
322a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org        traceMarker->fMarker = marker_str;
332a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org        traceMarker->fID = *marker_counter;
342a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org        fTarget->addGpuTraceMarker(traceMarker);
352a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    }
362a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
372a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.orgprivate:
382a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    GrDrawTarget* fTarget;
392a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    SkTLazy<GrGpuTraceMarker> fTraceMarker;
402a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org};
412a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
42bbcb38df4f7477aa0a38da00a0757586a0125954egdanielclass GrGpuTraceMarkerGeneratorContext : public ::SkNoncopyable {
43bbcb38df4f7477aa0a38da00a0757586a0125954egdanielpublic:
44bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel    GrGpuTraceMarkerGeneratorContext(GrContext* context) : fContext(context) {}
45bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel
46bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel    ~GrGpuTraceMarkerGeneratorContext() {
47bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel        if (fTraceMarker.isValid()) {
48bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel            fContext->removeGpuTraceMarker(fTraceMarker.get());
49bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel        }
50bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel    }
51bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel
52bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel    void initialize(const char* marker_str, int* marker_counter) {
53bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel        GrGpuTraceMarker* traceMarker = fTraceMarker.init();
54bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel        traceMarker->fMarker = marker_str;
55bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel        traceMarker->fID = *marker_counter;
56bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel        fContext->addGpuTraceMarker(traceMarker);
57bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel    }
58bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel
59bbcb38df4f7477aa0a38da00a0757586a0125954egdanielprivate:
60bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel    GrContext* fContext;
61bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel    SkTLazy<GrGpuTraceMarker> fTraceMarker;
62bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel};
63bbcb38df4f7477aa0a38da00a0757586a0125954egdaniel
642a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org/**
652a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * GR_CREATE_TRACE_MARKER will place begin and end trace markers for both
662a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * cpu and gpu (if gpu tracing enabled) for the current scope.
672a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * marker is of type const char* and target is of type GrDrawTarget*
682a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org */
6993a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel#define GR_CREATE_TRACE_MARKER(name, target)                                      \
7093a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED(name, target)
7193a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
7293a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel#define GR_CREATE_TRACE_MARKER1(name, target, arg1_name, arg1_val)                \
7393a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED(name, target, arg1_name, arg1_val)
7493a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
7593a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel#define INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED(name, target, ...)                 \
7693a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    static const char* SK_MACRO_APPEND_LINE(static_name) = name;                  \
7793a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    static int SK_MACRO_APPEND_LINE(name_counter) = 0;                            \
7893a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    INTERNAL_GR_CREATE_TRACE_MARKER(SK_MACRO_APPEND_LINE(static_name),            \
7993a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel                                    SK_MACRO_APPEND_LINE(name_counter),           \
8093a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel                                    target, ##__VA_ARGS__)                        \
8193a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    sk_atomic_inc(&SK_MACRO_APPEND_LINE(name_counter));
8293a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
8393a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel#define INTERNAL_GR_CREATE_TRACE_MARKER(name, name_counter, target, ...)          \
8493a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    GR_CREATE_GPU_TRACE_MARKER(name, name_counter, target)                        \
8593a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    INTERNAL_TRACE_EVENT_ADD_SCOPED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),name,   \
8693a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel                       "id", name_counter, ##__VA_ARGS__);
8793a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
88bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel#if GR_FORCE_GPU_TRACE_DEBUGGING
89bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel#define GR_CREATE_GPU_TRACE_MARKER(name, name_counter, target)                     \
90bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel    GrGpuTraceMarkerGenerator SK_MACRO_APPEND_LINE(TMG)(target);                   \
91bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel    SK_MACRO_APPEND_LINE(TMG).initialize(name, &name_counter);
92bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel#else
936d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel#define GR_CREATE_GPU_TRACE_MARKER(name, name_counter, target)                     \
946d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel    GrGpuTraceMarkerGenerator SK_MACRO_APPEND_LINE(TMG)(target);                   \
956d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel    bool SK_MACRO_APPEND_LINE(gpuTracingEnabled);                                  \
966d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel    TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),      \
976d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel                                        &SK_MACRO_APPEND_LINE(gpuTracingEnabled)); \
986d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel    if (SK_MACRO_APPEND_LINE(gpuTracingEnabled)) {                                 \
996d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel        SK_MACRO_APPEND_LINE(TMG).initialize(name, &name_counter);                 \
10093a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    }
101bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel#endif
10293a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
10393a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel#define GR_CREATE_TRACE_MARKER_CONTEXT(name, context)                             \
10493a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED_C(name, context)
10593a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
10693a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel#define GR_CREATE_TRACE_MARKER_CONTEXT1(name, context, arg1_name, arg1_val)       \
10793a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED_C(name, context, arg1_name, arg1_val)
10893a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
10993a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel#define INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED_C(name, context, ...)              \
11093a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    static const char* SK_MACRO_APPEND_LINE(static_name) = name;                  \
11193a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    static int SK_MACRO_APPEND_LINE(name_counter) = 0;                            \
11293a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    INTERNAL_GR_CREATE_TRACE_MARKER_C(SK_MACRO_APPEND_LINE(static_name),          \
11393a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel                                      SK_MACRO_APPEND_LINE(name_counter),         \
11493a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel                                      context, ##__VA_ARGS__)                     \
11593a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    sk_atomic_inc(&SK_MACRO_APPEND_LINE(name_counter));
11693a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
11793a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel#define INTERNAL_GR_CREATE_TRACE_MARKER_C(name, name_counter, context, ...)       \
11893a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    GR_CREATE_GPU_TRACE_MARKER_C(name, name_counter, context)                     \
11993a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    INTERNAL_TRACE_EVENT_ADD_SCOPED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),name,   \
12093a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel                                    "id", name_counter, ##__VA_ARGS__);
12193a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel
122bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel#if GR_FORCE_GPU_TRACE_DEBUGGING
123bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel#define GR_CREATE_GPU_TRACE_MARKER_C(name, name_counter, context)                  \
124bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel    GrGpuTraceMarkerGeneratorContext SK_MACRO_APPEND_LINE(TMG)(context);           \
125bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel    SK_MACRO_APPEND_LINE(TMG).initialize(name, &name_counter);
126bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel#else
1276d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel#define GR_CREATE_GPU_TRACE_MARKER_C(name, name_counter, context)                  \
1286d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel    GrGpuTraceMarkerGeneratorContext SK_MACRO_APPEND_LINE(TMG)(context);           \
1296d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel    bool SK_MACRO_APPEND_LINE(gpuTracingEnabled);                                  \
1306d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel    TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),      \
1316d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel                                        &SK_MACRO_APPEND_LINE(gpuTracingEnabled)); \
1326d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel    if (SK_MACRO_APPEND_LINE(gpuTracingEnabled)) {                                 \
1336d7f5faeb3f1745bd1fb90c8a2a0655a9e416e4aegdaniel        SK_MACRO_APPEND_LINE(TMG).initialize(name, &name_counter);                 \
13493a37bc91a40a7cd14f9f8eca6097535ab1099e4egdaniel    }
135bdad9c34d8f15362d17ba8d7a9fb202b1f3a2ef3egdaniel#endif
1362a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
1372a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org#endif
138