Chromium Code Reviews| 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(); |
| } |