Index: src/gpu/GrTraceMarker.cpp |
diff --git a/src/gpu/GrTraceMarker.cpp b/src/gpu/GrTraceMarker.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..470f36409fe1ca8d6b41d0fb129e9f06170e2c84 |
--- /dev/null |
+++ b/src/gpu/GrTraceMarker.cpp |
@@ -0,0 +1,117 @@ |
+ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "GrTraceMarker.h" |
+#include "GrTracing.h" |
+#include "SkString.h" |
+#include "SkTSort.h" |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+class GrTraceMarkerSet::Iter { |
+public: |
+ Iter() {}; |
+ Iter& operator=(const Iter& i) { |
+ fCurrentIndex = i.fCurrentIndex; |
+ fMarkers = i.fMarkers; |
+ return *this; |
+ } |
+ bool operator==(const Iter& i) const { |
+ return fCurrentIndex == i.fCurrentIndex && fMarkers == i.fMarkers; |
+ } |
+ bool operator!=(const Iter& i) const { return !(*this == i); } |
+ const GrGpuTraceMarker& operator*() const { return fMarkers->fMarkerArray[fCurrentIndex]; } |
+ Iter& operator++() { |
+ SkASSERT(*this != fMarkers->end()); |
+ ++fCurrentIndex; |
+ return *this; |
+ } |
+ |
+private: |
+ friend class GrTraceMarkerSet; |
+ Iter(const GrTraceMarkerSet* markers, int index) |
+ : fMarkers(markers), fCurrentIndex(index) { |
+ SkASSERT(markers); |
+ } |
+ |
+ const GrTraceMarkerSet* fMarkers; |
+ int fCurrentIndex; |
+}; |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+GrTraceMarkerSet::GrTraceMarkerSet(const GrTraceMarkerSet& other) { |
+ this->addSet(other); |
+} |
+ |
+void GrTraceMarkerSet::add(const GrGpuTraceMarker& marker) { |
+ this->fMarkerArray.push(marker); |
+} |
+ |
+void GrTraceMarkerSet::addSet(const GrTraceMarkerSet& markerSet) { |
+ for (Iter iter = markerSet.begin(); iter != markerSet.end(); ++iter) { |
+ this->add(*iter); |
+ } |
+} |
+ |
+void GrTraceMarkerSet::remove(const GrGpuTraceMarker& marker) { |
+ SkASSERT(-1 != fMarkerArray.find(marker)); |
+ int index = this->fMarkerArray.find(marker); |
+ this->fMarkerArray.remove(index); |
+} |
+ |
+int GrTraceMarkerSet::count() const { |
+ return this->fMarkerArray.count(); |
+} |
+ |
+SkString GrTraceMarkerSet::toString() const { |
+ SkTQSort<GrGpuTraceMarker>(this->fMarkerArray.begin(), this->fMarkerArray.end() - 1); |
+ SkString marker_string; |
+ const char* prevMarkerName = ""; |
+ int prevMarkerID = -1; |
+ int counter = 0; |
+ const int numMarkers = this->fMarkerArray.count(); |
+ |
+ // check used for GrGpuGL device after we've already collapsed all markers |
+ if (1 == numMarkers && -1 == this->fMarkerArray[0].fID) { |
+ marker_string.append(this->fMarkerArray[0].fMarker); |
+ return marker_string; |
+ } |
+ |
+ for (int i = 0; i < numMarkers; ++i ) { |
+ GrGpuTraceMarker& currMarker = this->fMarkerArray[i]; |
+ const char* currCmd = currMarker.fMarker; |
+ if (currCmd != prevMarkerName) { |
+ if (counter != 0) { |
+ marker_string.append(") "); |
+ } |
+ marker_string.append(currCmd); |
+ marker_string.append("("); |
+ marker_string.appendS32(currMarker.fID); |
+ prevMarkerName = currCmd; |
+ } else if (currMarker.fID != prevMarkerID) { |
+ marker_string.append(", "); |
+ marker_string.appendS32(currMarker.fID); |
+ } |
+ prevMarkerID = currMarker.fID; |
+ ++counter; |
+ } |
+ if (counter > 0) { |
+ marker_string.append(")"); |
+ } |
+ return marker_string; |
+} |
+ |
+GrTraceMarkerSet::Iter GrTraceMarkerSet::begin() const { |
+ return Iter(this, 0); |
+} |
+ |
+GrTraceMarkerSet::Iter GrTraceMarkerSet::end() const { |
+ return Iter(this, this->fMarkerArray.count()); |
+} |
+ |