Convert GrAuditTrail to use scoped frames
authorjoshualitt <joshualitt@chromium.org>
Tue, 12 Jan 2016 20:59:28 +0000 (12:59 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 12 Jan 2016 20:59:28 +0000 (12:59 -0800)
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1579193002

Review URL: https://codereview.chromium.org/1579193002

include/private/GrAuditTrail.h
src/gpu/GrAuditTrail.cpp
src/gpu/GrTracing.h

index 53f44f2173e64f7b87df0c5597bec31a5883e8ba..38730ede1aa491b3e30d8dc40fbfefbda3d259f9 100644 (file)
  */
 class GrAuditTrail {
 public:
-    void addOp(const SkString& name) {
+    GrAuditTrail() : fUniqueID(0) {}
+
+    class AutoFrame {
+    public:
+        AutoFrame(GrAuditTrail* auditTrail, const char* name)
+            : fAuditTrail(auditTrail) {
+            if (GR_BATCH_DEBUGGING_OUTPUT) {
+                fAuditTrail->pushFrame(name);
+            }
+        }
+
+        ~AutoFrame() {
+            if (GR_BATCH_DEBUGGING_OUTPUT) {
+                fAuditTrail->popFrame();
+            }
+        }
+
+    private:
+        GrAuditTrail* fAuditTrail;
+    };
+
+    void pushFrame(const char* name) {
         SkASSERT(GR_BATCH_DEBUGGING_OUTPUT);
-        fOps.push_back().fName = name;
+        Frame* frame;
+        if (fStack.empty()) {
+            frame = &fFrames.push_back();
+        } else {
+            frame = &fStack.back()->fChildren.push_back();
+        }
+
+        frame->fUniqueID = fUniqueID++;
+        frame->fName = name;
+        fStack.push_back(frame);
     }
 
-    void addBatch(const SkString& name, const SkRect& bounds) {
+    void popFrame() {
         SkASSERT(GR_BATCH_DEBUGGING_OUTPUT);
-        Op::Batch& batch = fOps.back().fBatches.push_back();
+        fStack.pop_back();
+    }
+
+    void addBatch(const char* name, const SkRect& bounds) {
+        // TODO when every internal callsite pushes a frame, we can add the assert
+        SkASSERT(GR_BATCH_DEBUGGING_OUTPUT /*&& !fStack.empty()*/);
+        Frame::Batch& batch = fStack.back()->fBatches.push_back();
         batch.fName = name;
         batch.fBounds = bounds;
     }
 
     SkString toJson() const;
 
-    void reset() { SkASSERT(GR_BATCH_DEBUGGING_OUTPUT); fOps.reset(); }
+    void reset() { SkASSERT(GR_BATCH_DEBUGGING_OUTPUT && fStack.empty()); fFrames.reset(); }
 
 private:
-    struct Op {
+    struct Frame {
         SkString toJson() const;
         struct Batch {
             SkString toJson() const;
-            SkString fName;
+            const char* fName;
             SkRect fBounds;
         };
 
-        SkString fName;
+        const char* fName;
+        // TODO combine these into a single array
         SkTArray<Batch> fBatches;
+        SkTArray<Frame> fChildren;
+        uint64_t fUniqueID;
     };
 
-    SkTArray<Op> fOps;
+    SkTArray<Frame> fFrames;
+    SkTArray<Frame*> fStack;
+    uint64_t fUniqueID;
 };
 
 #define GR_AUDIT_TRAIL_INVOKE_GUARD(invoke, ...) \
@@ -56,13 +97,13 @@ private:
         invoke(__VA_ARGS__);                     \
     }
 
-#define GR_AUDIT_TRAIL_ADDOP(audit_trail, opname) \
-    GR_AUDIT_TRAIL_INVOKE_GUARD(audit_trail->addOp, opname);
+#define GR_AUDIT_TRAIL_AUTO_FRAME(audit_trail, framename) \
+    GrAuditTrail::AutoFrame SK_MACRO_APPEND_LINE(auto_frame)(audit_trail, framename);
 
 #define GR_AUDIT_TRAIL_RESET(audit_trail) \
     GR_AUDIT_TRAIL_INVOKE_GUARD(audit_trail->reset);
 
 #define GR_AUDIT_TRAIL_ADDBATCH(audit_trail, batchname, bounds) \
-    GR_AUDIT_TRAIL_INVOKE_GUARD(audit_trail->addBatch, SkString(batchname), bounds);
+    GR_AUDIT_TRAIL_INVOKE_GUARD(audit_trail->addBatch, batchname, bounds);
 
 #endif
index aa87af2cbde12c674ced1f9aea3f921df3f43416..1113017b2d3e2e201f7e832e4df01c7e752c8d39 100644 (file)
@@ -8,12 +8,16 @@
 #include "GrAuditTrail.h"
 
 template <class T>
-static void jsonify_tarray(SkString* json, const SkTArray<T>& array) {
-    for (int i = 0; i < array.count(); i++) {
-        json->append(array[i].toJson());
-        if (i < array.count() - 1) {
-            json->append(",");
+static void jsonify_tarray(SkString* json, const char* name, const SkTArray<T>& array) {
+    if (array.count()) {
+        json->appendf("\"%s\": [", name);
+        for (int i = 0; i < array.count(); i++) {
+            json->append(array[i].toJson());
+            if (i < array.count() - 1) {
+                json->append(",");
+            }
         }
+        json->append("]");
     }
 }
 
@@ -87,30 +91,27 @@ static SkString pretty_print_json(SkString json) {
 SkString GrAuditTrail::toJson() const {
     SkString json;
     json.append("{");
-    json.append("\"Ops\": [");
-    jsonify_tarray(&json, fOps);
-    json.append("]");
+    jsonify_tarray(&json, "Stacks", fFrames);
     json.append("}");
 
     // TODO if this becomes a performance issue we should make pretty print configurable
     return pretty_print_json(json);
 }
 
-SkString GrAuditTrail::Op::toJson() const {
+SkString GrAuditTrail::Frame::toJson() const {
     SkString json;
     json.append("{");
-    json.appendf("\"Name\": \"%s\",", fName.c_str());
-    json.append("\"Batches\": [");
-    jsonify_tarray(&json, fBatches);
-    json.append("]");
+    json.appendf("\"Name\": \"%s\",", fName);
+    jsonify_tarray(&json, "Batches", fBatches);
+    jsonify_tarray(&json, "Frames", fChildren);
     json.append("}");
     return json;
 }
 
-SkString GrAuditTrail::Op::Batch::toJson() const {
+SkString GrAuditTrail::Frame::Batch::toJson() const {
     SkString json;
     json.append("{");
-    json.appendf("\"Name\": \"%s\",", fName.c_str());
+    json.appendf("\"Name\": \"%s\",", fName);
     json.append("\"Bounds\": {");
     json.appendf("\"Left\": %f,", fBounds.fLeft);
     json.appendf("\"Right\": %f,", fBounds.fRight);
index 4cdcace6ff409f969266ad8576139d869e038122..3dbc0ef17e0296f71a754e691a29d35418d188e1 100644 (file)
@@ -58,7 +58,7 @@ private:
 /**
  * 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*
+ * name is of type const char* and target is of type GrDrawTarget*
  */
 #define GR_CREATE_TRACE_MARKER(name, target)                                                       \
     /* Chromium tracing */                                                                         \
@@ -86,6 +86,10 @@ private:
     GrGpuTraceMarkerGenerator SK_MACRO_APPEND_LINE(TMG)(target);                  \
     SK_MACRO_APPEND_LINE(TMG).initialize(name, &name_counter);                    \
 
+/**
+ * Context level GrTracing macros, classname and op are const char*, context is GrContext
+ * TODO can we just have one set of macros?  Probably.
+ */
 #define GR_CREATE_TRACE_MARKER_CONTEXT(classname, op, context)                                     \
     /* Chromium tracing */                                                                         \
     static int SK_MACRO_APPEND_LINE(name_counter) = 0;                                             \
@@ -96,7 +100,7 @@ private:
         INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED_C(classname "::" op,                                \
                                                  SK_MACRO_APPEND_LINE(name_counter), context)      \
     }                                                                                              \
-    GR_AUDIT_TRAIL_ADDOP(context->getAuditTrail(), SkString(op));                                  \
+    GR_AUDIT_TRAIL_AUTO_FRAME(context->getAuditTrail(), classname "::" op);                        \
     INTERNAL_TRACE_EVENT_ADD_SCOPED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), classname "::" op,      \
                                     "id", SK_MACRO_APPEND_LINE(name_counter));