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