Index: src/gpu/GrDrawTarget.h |
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h |
index 19ce16f64a68818512f0d32b7192c90a06dd6b4e..143562f63da89531b49f2379fe00c1da651815a6 100644 |
--- a/src/gpu/GrDrawTarget.h |
+++ b/src/gpu/GrDrawTarget.h |
@@ -22,10 +22,27 @@ |
class GrClipData; |
class GrDrawTargetCaps; |
+// class GrDrawTarget; |
bsalomon
2014/03/17 17:50:38
?
egdaniel
2014/03/17 19:49:12
Woops. Left over from some old test iteration. Rem
|
class GrPath; |
class GrVertexBuffer; |
class SkStrokeRec; |
+class GpuTraceMarker { |
+public: |
+ GpuTraceMarker(const char* marker, int idCounter) : fMarker(marker), fID(idCounter) {} |
+ |
+ bool operator<(const GpuTraceMarker& rhs) const { |
+ return this->fMarker < rhs.fMarker || (this->fMarker == rhs.fMarker && this->fID < rhs.fID); |
+ } |
+ |
+ bool operator==(const GpuTraceMarker& rhs) const { |
+ return (this->fID == rhs.fID && this->fMarker == rhs.fMarker); |
+ } |
+ |
+ const char* fMarker; |
+ int fID; |
+}; |
+ |
class GrDrawTarget : public SkRefCnt { |
protected: |
class DrawInfo; |
@@ -423,18 +440,19 @@ public: |
GrRenderTarget* renderTarget = NULL) = 0; |
/** |
- * instantGpuTraceEvent places a single "sign post" type marker into command stream. The |
- * argument marker will be the name of the annotation that is added. |
- */ |
- void instantGpuTraceEvent(const char* marker); |
- /** |
- * The following two functions are used for marking groups of commands. Use pushGpuTraceEvent |
- * to set the beginning of a command set, and popGpuTraceEvent is be called at end of the |
- * command set. The argument marker is the name for the annotation that is added. The push and |
- * pops can be used hierarchically, but every push must have a match pop. |
+ * Called at start and end of gpu trace marking |
+ * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start |
+ * and end of a code block respectively |
*/ |
- void pushGpuTraceEvent(const char* marker); |
- void popGpuTraceEvent(); |
+ void addGpuTraceMarker(GpuTraceMarker* marker); |
+ void removeGpuTraceMarker(GpuTraceMarker* marker); |
+ |
+ bool gpuTracingEnabled() const; |
bsalomon
2014/03/17 17:50:38
I wonder if we really need enable/disable control
egdaniel
2014/03/17 19:49:12
This function is for controlling whether or not it
bsalomon
2014/03/19 13:28:44
sgtm
|
+ |
+ SkTDArray<GpuTraceMarker>* getActiveTraceMarkers() { return &fActiveTraceMarkers; } |
bsalomon
2014/03/17 17:50:38
const &?
egdaniel
2014/03/17 19:49:12
in gl/GrGpuGl.cpp I call getActiveTraceMarkers(),
|
+ |
+ static SkString getTraceString(SkTDArray<GpuTraceMarker>* markerArray, |
bsalomon
2014/03/17 17:50:38
Def. const & for markerArray. Also static function
egdaniel
2014/03/17 19:49:12
markerArray ends up getting sorted in the function
bsalomon
2014/03/19 13:28:44
Ok that makes sense. It'd be nice to hide this som
egdaniel
2014/03/19 14:27:03
So the function has already been moved to protecte
bsalomon
2014/03/19 14:43:43
It just seems to me like sorting-and-stringifying
egdaniel
2014/03/19 15:16:30
Okay so here is my proposal (GpuTM is our trace ma
bsalomon
2014/03/19 15:27:01
How about getActiveMarkersTraceString()?
egdaniel
2014/03/19 15:33:53
So internally I have a single array that stores th
bsalomon
2014/03/19 15:50:39
Got it. Do you think you get a lot of value out of
|
+ int startIdx, int numMarkers); |
/** |
* Copies a pixel rectangle from one surface to another. This call may finalize |
@@ -868,9 +886,8 @@ private: |
virtual void onDrawPath(const GrPath*, SkPath::FillType, |
const GrDeviceCoordTexture* dstCopy) = 0; |
- virtual void onInstantGpuTraceEvent(const char* marker) = 0; |
- virtual void onPushGpuTraceEvent(const char* marker) = 0; |
- virtual void onPopGpuTraceEvent() = 0; |
+ virtual void onAddGpuTraceMarker() = 0; |
bsalomon
2014/03/17 17:50:38
It's unclear from the header why we have all three
egdaniel
2014/03/17 19:49:12
So the basic structure here is: addGpuTraceMarker
bsalomon
2014/03/19 13:28:44
Ok so addTraceMarkerActiveSet is just a helper/imp
|
+ virtual void onRemoveGpuTraceMarker() = 0; |
// helpers for reserving vertex and index space. |
bool reserveVertexSpace(size_t vertexSize, |
@@ -897,6 +914,12 @@ private: |
// Check to see if this set of draw commands has been sent out |
virtual bool isIssued(uint32_t drawID) { return true; } |
+ // Add new marker to our current active set |
+ void addTraceMarkerActiveSet(GpuTraceMarker* marker); |
+ |
+ // Remove marker from our current active set |
+ void removeTraceMarkerActiveSet(GpuTraceMarker* marker); |
+ |
enum { |
kPreallocGeoSrcStateStackCnt = 4, |
}; |
@@ -906,10 +929,46 @@ private: |
GrDrawState fDefaultDrawState; |
// The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget. |
GrContext* fContext; |
- // To keep track that we always have at least as many debug marker pushes as pops |
- int fPushGpuTraceCount; |
+ // To keep track that we always have at least as many debug marker adds as removes |
+ int fGpuTraceMarkerCount; |
+ SkTDArray<GpuTraceMarker> fActiveTraceMarkers; |
typedef SkRefCnt INHERITED; |
}; |
+/** |
+ * Marker generation class used for adding and removing markers around code blocks |
+ */ |
+class TraceMarkerGenerator : public ::SkNoncopyable { |
+public: |
+ TraceMarkerGenerator(const char* marker_str, int* marker_counter, GrDrawTarget* target) |
+ : fTarget(target), fTraceMarker(marker_str, *marker_counter) { |
+ if (fTarget->gpuTracingEnabled()) { |
+ sk_atomic_inc(marker_counter); |
+ fTarget->addGpuTraceMarker(&fTraceMarker); |
+ } |
+ } |
+ ~TraceMarkerGenerator() { |
+ if (fTarget->gpuTracingEnabled()) { |
+ fTarget->removeGpuTraceMarker(&fTraceMarker); |
+ } |
+ } |
+private: |
+ GrDrawTarget* fTarget; |
+ GpuTraceMarker fTraceMarker; |
+}; |
+ |
+////////// macros to place around the internal draw calls ////////////////// |
+// marker is of type const char* and target is of type GrDrawTarget* |
+ |
+#define GR_CREATE_GPU_TRACE_MARKER(marker_str, target) \ |
+ static const char* static_str = marker_str; \ |
+ static int marker_counter = 0; \ |
+ TraceMarkerGenerator SK_MACRO_APPEND_LINE(TMG)(static_str, \ |
+ &marker_counter, \ |
+ target); \ |
+ |
+//////////////////////////////////////////////////////////////////////////// |
+ |
+ |
#endif |