Index: src/gpu/GrInOrderDrawBuffer.cpp |
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp |
index 44bf4edab7aa7aefdae0a1d282af4dc3370a533b..0ebb6f72417c81bca8106e296696e1c41b66f959 100644 |
--- a/src/gpu/GrInOrderDrawBuffer.cpp |
+++ b/src/gpu/GrInOrderDrawBuffer.cpp |
@@ -118,6 +118,25 @@ static void set_vertex_attributes(GrDrawState* drawState, |
}; |
+namespace { |
bsalomon
2014/03/20 16:32:53
why the namespace?
|
+enum { |
+ kTraceCmdBit = 0x80, |
+ kCmdMask = 0x7f, |
+}; |
+ |
+static uint8_t add_trace_bit(uint8_t cmd) { |
+ return cmd | kTraceCmdBit; |
+} |
+ |
+static uint8_t strip_trace_bit(uint8_t cmd) { |
+ return cmd & kCmdMask; |
+} |
+ |
+static bool cmd_has_trace_marker(uint8_t cmd) { |
+ return cmd & kTraceCmdBit; |
+} |
+} |
+ |
void GrInOrderDrawBuffer::onDrawRect(const SkRect& rect, |
const SkMatrix* matrix, |
const SkRect* localRect, |
@@ -256,7 +275,7 @@ int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info) { |
} |
// Check if there is a draw info that is compatible that uses the same VB from the pool and |
// the same IB |
- if (kDraw_Cmd != fCmds.back()) { |
+ if (kDraw_Cmd != strip_trace_bit(fCmds.back())) { |
return 0; |
} |
@@ -291,6 +310,17 @@ int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info) { |
poolState.fUsedPoolVertexBytes = GrMax(poolState.fUsedPoolVertexBytes, vertexBytes); |
draw->adjustInstanceCount(instancesToConcat); |
+ |
+ // update last fGpuCmdMarkers to include any additional trace markers that have been added |
+ if (this->getActiveTraceMarkers().count() > 0) { |
+ if (cmd_has_trace_marker(fCmds.back())) { |
+ fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); |
+ } else { |
+ fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); |
+ fCmds.back() = add_trace_bit(fCmds.back()); |
+ } |
+ } |
+ |
return instancesToConcat; |
} |
@@ -441,18 +471,6 @@ void GrInOrderDrawBuffer::clear(const SkIRect* rect, GrColor color, |
renderTarget->ref(); |
} |
-void GrInOrderDrawBuffer::onInstantGpuTraceEvent(const char* marker) { |
- // TODO: adds command to buffer |
-} |
- |
-void GrInOrderDrawBuffer::onPushGpuTraceEvent(const char* marker) { |
- // TODO: adds command to buffer |
-} |
- |
-void GrInOrderDrawBuffer::onPopGpuTraceEvent() { |
- // TODO: adds command to buffer |
-} |
- |
void GrInOrderDrawBuffer::reset() { |
SkASSERT(1 == fGeoPoolStateStack.count()); |
this->resetVertexSource(); |
@@ -475,6 +493,7 @@ void GrInOrderDrawBuffer::reset() { |
fClips.reset(); |
fClipOrigins.reset(); |
fCopySurfaces.reset(); |
+ fGpuCmdMarkers.reset(); |
fClipSet = true; |
} |
@@ -514,9 +533,17 @@ void GrInOrderDrawBuffer::flush() { |
int currStencilPath = 0; |
int currDrawPath = 0; |
int currCopySurface = 0; |
+ int currCmdMarker = 0; |
for (int c = 0; c < numCmds; ++c) { |
- switch (fCmds[c]) { |
+ GrGpuTraceMarker newMarker("", -1); |
+ if (cmd_has_trace_marker(fCmds[c])) { |
+ SkString traceString = fGpuCmdMarkers[currCmdMarker].toString(); |
+ newMarker.fMarker = traceString.c_str(); |
+ fDstGpu->addGpuTraceMarker(&newMarker); |
+ ++currCmdMarker; |
+ } |
+ switch (strip_trace_bit(fCmds[c])) { |
case kDraw_Cmd: { |
const DrawRecord& draw = fDraws[currDraw]; |
fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); |
@@ -524,7 +551,6 @@ void GrInOrderDrawBuffer::flush() { |
fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); |
} |
fDstGpu->executeDraw(draw); |
- |
++currDraw; |
break; |
} |
@@ -566,6 +592,9 @@ void GrInOrderDrawBuffer::flush() { |
++currCopySurface; |
break; |
} |
+ if (cmd_has_trace_marker(fCmds[c])) { |
+ fDstGpu->removeGpuTraceMarker(&newMarker); |
+ } |
} |
// we should have consumed all the states, clips, etc. |
SkASSERT(fStates.count() == currState); |
@@ -574,6 +603,7 @@ void GrInOrderDrawBuffer::flush() { |
SkASSERT(fClears.count() == currClear); |
SkASSERT(fDraws.count() == currDraw); |
SkASSERT(fCopySurfaces.count() == currCopySurface); |
+ SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); |
fDstGpu->setDrawState(prevDrawState); |
prevDrawState->unref(); |
@@ -829,40 +859,51 @@ bool GrInOrderDrawBuffer::needsNewClip() const { |
return false; |
} |
+void GrInOrderDrawBuffer::addToCmdBuffer(uint8_t cmd) { |
+ SkASSERT(!cmd_has_trace_marker(cmd)); |
+ const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
+ if (activeTraceMarkers.count() > 0) { |
+ fCmds.push_back(add_trace_bit(cmd)); |
+ fGpuCmdMarkers.push_back(activeTraceMarkers); |
+ } else { |
+ fCmds.push_back(cmd); |
+ } |
+} |
+ |
void GrInOrderDrawBuffer::recordClip() { |
- fClips.push_back() = *this->getClip()->fClipStack; |
+ fClips.push_back(*this->getClip()->fClipStack); |
fClipOrigins.push_back() = this->getClip()->fOrigin; |
fClipSet = false; |
- fCmds.push_back(kSetClip_Cmd); |
+ this->addToCmdBuffer(kSetClip_Cmd); |
} |
void GrInOrderDrawBuffer::recordState() { |
fStates.push_back().saveFrom(this->getDrawState()); |
- fCmds.push_back(kSetState_Cmd); |
+ this->addToCmdBuffer(kSetState_Cmd); |
} |
GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo& info) { |
- fCmds.push_back(kDraw_Cmd); |
+ this->addToCmdBuffer(kDraw_Cmd); |
return &fDraws.push_back(info); |
} |
GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { |
- fCmds.push_back(kStencilPath_Cmd); |
+ this->addToCmdBuffer(kStencilPath_Cmd); |
return &fStencilPaths.push_back(); |
} |
GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() { |
- fCmds.push_back(kDrawPath_Cmd); |
+ this->addToCmdBuffer(kDrawPath_Cmd); |
return &fDrawPaths.push_back(); |
} |
GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { |
- fCmds.push_back(kClear_Cmd); |
+ this->addToCmdBuffer(kClear_Cmd); |
return &fClears.push_back(); |
} |
GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { |
- fCmds.push_back(kCopySurface_Cmd); |
+ this->addToCmdBuffer(kCopySurface_Cmd); |
return &fCopySurfaces.push_back(); |
} |