Index: src/gpu/GrInOrderDrawBuffer.cpp |
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp |
index 44bf4edab7aa7aefdae0a1d282af4dc3370a533b..bec2fbf91504bfe3e487ab0c7d81a1342dcaed53 100644 |
--- a/src/gpu/GrInOrderDrawBuffer.cpp |
+++ b/src/gpu/GrInOrderDrawBuffer.cpp |
@@ -256,7 +256,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 != stripTraceBit(fCmds.back())) { |
return 0; |
} |
@@ -291,6 +291,20 @@ 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 (fCmds.back() & 0x08) { |
bsalomon
2014/03/17 17:50:38
use enum value
|
+ fNumMarkersPerCmd.top() += this->getActiveTraceMarkers()->count(); |
+ } else { |
+ fNumMarkersPerCmd.push(this->getActiveTraceMarkers()->count()); |
+ fCmds.back() = addTraceBit(fCmds.back()); |
+ } |
+ for (int i = 0; i < this->getActiveTraceMarkers()->count(); ++i) { |
+ fGpuCmdMarkers.push(this->getActiveTraceMarkers()->getAt(i)); |
+ } |
+ } |
+ |
return instancesToConcat; |
} |
@@ -335,6 +349,7 @@ void GrInOrderDrawBuffer::onDraw(const DrawInfo& info) { |
if (info.isInstanced()) { |
int instancesConcated = this->concatInstancedDraw(info); |
if (info.instanceCount() > instancesConcated) { |
+ // grab cmd lock |
draw = this->recordDraw(info); |
draw->adjustInstanceCount(-instancesConcated); |
} else { |
@@ -441,18 +456,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 +478,8 @@ void GrInOrderDrawBuffer::reset() { |
fClips.reset(); |
fClipOrigins.reset(); |
fCopySurfaces.reset(); |
+ fGpuCmdMarkers.reset(); |
+ fNumMarkersPerCmd.reset(); |
fClipSet = true; |
} |
@@ -507,16 +512,27 @@ void GrInOrderDrawBuffer::flush() { |
GrClipData clipData; |
- int currState = 0; |
- int currClip = 0; |
- int currClear = 0; |
- int currDraw = 0; |
- int currStencilPath = 0; |
- int currDrawPath = 0; |
- int currCopySurface = 0; |
+ int currState = 0; |
+ int currClip = 0; |
+ int currClear = 0; |
+ int currDraw = 0; |
+ int currStencilPath = 0; |
+ int currDrawPath = 0; |
+ int currCopySurface = 0; |
+ int currCmdMarker = 0; |
+ int currCmdMarkerIndex = 0; |
for (int c = 0; c < numCmds; ++c) { |
- switch (fCmds[c]) { |
+ GpuTraceMarker newMarker("", -1); |
+ if (fCmds[c] & 0x08) { |
bsalomon
2014/03/17 17:50:38
use enum, or perhaps better add a function CmdHasT
|
+ SkString traceString = getTraceString(&fGpuCmdMarkers, currCmdMarkerIndex, |
+ fNumMarkersPerCmd[currCmdMarker]); |
+ newMarker.fMarker = traceString.c_str(); |
+ fDstGpu->addGpuTraceMarker(&newMarker); |
+ currCmdMarkerIndex += fNumMarkersPerCmd[currCmdMarker]; |
+ ++currCmdMarker; |
+ } |
+ switch (stripTraceBit(fCmds[c])) { |
bsalomon
2014/03/17 17:50:38
this-> but really the functions should probably be
|
case kDraw_Cmd: { |
const DrawRecord& draw = fDraws[currDraw]; |
fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); |
@@ -524,7 +540,6 @@ void GrInOrderDrawBuffer::flush() { |
fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); |
} |
fDstGpu->executeDraw(draw); |
- |
++currDraw; |
break; |
} |
@@ -566,6 +581,9 @@ void GrInOrderDrawBuffer::flush() { |
++currCopySurface; |
break; |
} |
+ if (fCmds[c] & 0x08) { |
bsalomon
2014/03/17 17:50:38
enum/function
|
+ fDstGpu->removeGpuTraceMarker(&newMarker); |
+ } |
} |
// we should have consumed all the states, clips, etc. |
SkASSERT(fStates.count() == currState); |
@@ -574,6 +592,8 @@ void GrInOrderDrawBuffer::flush() { |
SkASSERT(fClears.count() == currClear); |
SkASSERT(fDraws.count() == currDraw); |
SkASSERT(fCopySurfaces.count() == currCopySurface); |
+ SkASSERT(fGpuCmdMarkers.count() == currCmdMarkerIndex); |
+ SkASSERT(fNumMarkersPerCmd.count() == currCmdMarker); |
fDstGpu->setDrawState(prevDrawState); |
prevDrawState->unref(); |
@@ -829,44 +849,56 @@ bool GrInOrderDrawBuffer::needsNewClip() const { |
return false; |
} |
+void GrInOrderDrawBuffer::addToCmdBuffer(uint8_t cmd) { |
+ SkTDArray<GpuTraceMarker>* activeTraceMarkers = this->getActiveTraceMarkers(); |
+ if (activeTraceMarkers->count() > 0) { |
+ fCmds.push_back(addTraceBit(cmd)); |
+ for (int i = 0; i < activeTraceMarkers->count(); ++i) { |
+ fGpuCmdMarkers.push(activeTraceMarkers->getAt(i)); |
+ } |
+ fNumMarkersPerCmd.push(activeTraceMarkers->count()); |
+ } 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); |
+ addToCmdBuffer(kSetClip_Cmd); |
bsalomon
2014/03/17 17:50:38
this->
here and below
|
} |
void GrInOrderDrawBuffer::recordState() { |
fStates.push_back().saveFrom(this->getDrawState()); |
- fCmds.push_back(kSetState_Cmd); |
+ addToCmdBuffer(kSetState_Cmd); |
} |
GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo& info) { |
- fCmds.push_back(kDraw_Cmd); |
+ addToCmdBuffer(kDraw_Cmd); |
return &fDraws.push_back(info); |
} |
GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { |
- fCmds.push_back(kStencilPath_Cmd); |
+ addToCmdBuffer(kStencilPath_Cmd); |
return &fStencilPaths.push_back(); |
} |
GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() { |
- fCmds.push_back(kDrawPath_Cmd); |
+ addToCmdBuffer(kDrawPath_Cmd); |
return &fDrawPaths.push_back(); |
} |
GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { |
- fCmds.push_back(kClear_Cmd); |
+ addToCmdBuffer(kClear_Cmd); |
return &fClears.push_back(); |
} |
GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { |
- fCmds.push_back(kCopySurface_Cmd); |
+ addToCmdBuffer(kCopySurface_Cmd); |
return &fCopySurfaces.push_back(); |
} |
- |
void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
INHERITED::clipWillBeSet(newClipData); |
fClipSet = true; |