Chromium Code Reviews| Index: src/gpu/GrTracing.cpp |
| diff --git a/src/gpu/GrTracing.cpp b/src/gpu/GrTracing.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a65e64b08cb148008fb5ea7ab92d8d778818ce5b |
| --- /dev/null |
| +++ b/src/gpu/GrTracing.cpp |
| @@ -0,0 +1,134 @@ |
| + |
| +/* |
| + * 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 "GrDrawTarget.h" |
| +#include "GrTracing.h" |
| +#include "SkString.h" |
| +#include "SkTDArray.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; |
| + explicit Iter(const GrTraceMarkerSet* markers, int index) |
|
bsalomon
2014/03/20 16:32:53
don't need explicit with 2 args, right?
|
| + : 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()); |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| + |
| +GrGpuTraceMarkerGenerator::GrGpuTraceMarkerGenerator(const char* marker_str, int* marker_counter, |
| + GrDrawTarget* target) |
| + : fTarget(target), fTraceMarker(marker_str, *marker_counter) { |
| + if (fTarget->isGpuTracingEnabled()) { |
| + fTarget->addGpuTraceMarker(&fTraceMarker); |
| + } |
| +} |
| + |
| +GrGpuTraceMarkerGenerator::~GrGpuTraceMarkerGenerator() { |
| + if (fTarget->isGpuTracingEnabled()) { |
| + fTarget->removeGpuTraceMarker(&fTraceMarker); |
| + } |
| +} |
| + |