Index: src/gpu/GrTracing.h |
diff --git a/src/gpu/GrTracing.h b/src/gpu/GrTracing.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..33ecbefafbdb15e642afdf78a8f347742eb421f4 |
--- /dev/null |
+++ b/src/gpu/GrTracing.h |
@@ -0,0 +1,78 @@ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef GrTracing_DEFINED |
+#define GrTracing_DEFINED |
+ |
+#include "GrDrawTarget.h" |
+#include "GrTraceMarker.h" |
+#include "SkTraceEvent.h" |
+ |
+/** |
+ * Marker generation class used for adding and removing markers around code blocks |
+ */ |
+class GrGpuTraceMarkerGenerator : public ::SkNoncopyable { |
+public: |
+ GrGpuTraceMarkerGenerator() : p_data_(NULL) {} |
+ |
+ ~GrGpuTraceMarkerGenerator() { |
+ if (p_data_) { |
+ data_.fTarget->removeGpuTraceMarker(&(data_.fTraceMarker)); |
+ } |
+ } |
+ |
+ void Initialize(const char* marker_str, int* marker_counter, GrDrawTarget* target) { |
+ data_.fTarget = target; |
+ data_.fTraceMarker.fMarker = marker_str; |
+ data_.fTraceMarker.fID = *marker_counter; |
+ p_data_ = &data_; |
+ data_.fTarget->addGpuTraceMarker(&(data_.fTraceMarker)); |
+ } |
+ |
+private: |
+ /** |
+ * This Data struct workaround is to avoid initializing all the members |
+ * in Data during construction of this object, since this object is always |
+ * constructed, even when tracing is disabled. If the members of Data were |
+ * members of this class instead, compiler warnings occur about potential |
+ * uninitialized accesses. |
+ */ |
+ struct Data { |
bsalomon
2014/03/24 14:34:38
Check out SkTLazy.
|
+ GrDrawTarget* fTarget; |
+ GrGpuTraceMarker fTraceMarker; |
+ }; |
+ Data* p_data_; |
+ Data data_; |
+}; |
+ |
+/** |
+ * GR_CREATE_TRACE_MARKER will place begin and end trace markers for both |
+ * cpu and gpu (if gpu tracing enabled) for the current scope. |
+ * marker is of type const char* and target is of type GrDrawTarget* |
+ */ |
+#define GR_CREATE_TRACE_MARKER(name, target) \ |
+ static const char* SK_MACRO_APPEND_LINE(static_name) = name; \ |
+ static int SK_MACRO_APPEND_LINE(name_counter) = 0; \ |
+ INTERNAL_GR_CREATE_TRACE_MARKER(SK_MACRO_APPEND_LINE(static_name), \ |
+ SK_MACRO_APPEND_LINE(name_counter), \ |
+ target) \ |
+ |
+#define INTERNAL_GR_CREATE_TRACE_MARKER(name, name_counter, target) \ |
+ GR_CREATE_GPU_TRACE_MARKER(name, name_counter, target) \ |
+ TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),name, \ |
+ "id", name_counter) \ |
+ sk_atomic_inc(&name_counter); \ |
+ |
+#define GR_CREATE_GPU_TRACE_MARKER(name, name_counter, target) \ |
+ GrGpuTraceMarkerGenerator SK_MACRO_APPEND_LINE(TMG); \ |
+ if (target->isGpuTracingEnabled()) { \ |
+ SK_MACRO_APPEND_LINE(TMG).Initialize(name, &name_counter, target);\ |
+ } \ |
+ |
+ |
+#endif |
+ |