| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * Copyright 2011 Google Inc. |    2  * Copyright 2011 Google Inc. | 
|    3  * |    3  * | 
|    4  * Use of this source code is governed by a BSD-style license that can be |    4  * Use of this source code is governed by a BSD-style license that can be | 
|    5  * found in the LICENSE file. |    5  * found in the LICENSE file. | 
|    6  */ |    6  */ | 
|    7  |    7  | 
|    8 #include "GrInOrderDrawBuffer.h" |    8 #include "GrInOrderDrawBuffer.h" | 
|    9  |    9  | 
|   10 #include "GrDefaultGeoProcFactory.h" |   10 #include "GrDefaultGeoProcFactory.h" | 
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  107     kTraceCmdBit = 0x80, |  107     kTraceCmdBit = 0x80, | 
|  108     kCmdMask = 0x7f, |  108     kCmdMask = 0x7f, | 
|  109 }; |  109 }; | 
|  110  |  110  | 
|  111 static inline uint8_t add_trace_bit(uint8_t cmd) { return cmd | kTraceCmdBit; } |  111 static inline uint8_t add_trace_bit(uint8_t cmd) { return cmd | kTraceCmdBit; } | 
|  112  |  112  | 
|  113 static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; } |  113 static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; } | 
|  114  |  114  | 
|  115 static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTr
     aceCmdBit); } |  115 static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTr
     aceCmdBit); } | 
|  116  |  116  | 
|  117 void GrInOrderDrawBuffer::onDrawRect(GrDrawState* ds, |  117 void GrInOrderDrawBuffer::onDrawRect(GrPipelineBuilder* pipelineBuilder, | 
|  118                                      GrColor color, |  118                                      GrColor color, | 
|  119                                      const SkMatrix& viewMatrix, |  119                                      const SkMatrix& viewMatrix, | 
|  120                                      const SkRect& rect, |  120                                      const SkRect& rect, | 
|  121                                      const SkRect* localRect, |  121                                      const SkRect* localRect, | 
|  122                                      const SkMatrix* localMatrix) { |  122                                      const SkMatrix* localMatrix) { | 
|  123     GrDrawState::AutoRestoreEffects are(ds); |  123     GrPipelineBuilder::AutoRestoreEffects are(pipelineBuilder); | 
|  124  |  124  | 
|  125     // Go to device coords to allow batching across matrix changes |  125     // Go to device coords to allow batching across matrix changes | 
|  126     SkMatrix invert = SkMatrix::I(); |  126     SkMatrix invert = SkMatrix::I(); | 
|  127  |  127  | 
|  128     // if we have a local rect, then we apply the localMatrix directly to the lo
     calRect to generate |  128     // if we have a local rect, then we apply the localMatrix directly to the lo
     calRect to generate | 
|  129     // vertex local coords |  129     // vertex local coords | 
|  130     bool hasExplicitLocalCoords = SkToBool(localRect); |  130     bool hasExplicitLocalCoords = SkToBool(localRect); | 
|  131     if (!hasExplicitLocalCoords) { |  131     if (!hasExplicitLocalCoords) { | 
|  132         if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) { |  132         if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) { | 
|  133             SkDebugf("Could not invert\n"); |  133             SkDebugf("Could not invert\n"); | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  176     } |  176     } | 
|  177  |  177  | 
|  178     static const int kColorOffset = sizeof(SkPoint); |  178     static const int kColorOffset = sizeof(SkPoint); | 
|  179     GrColor* vertColor = GrTCast<GrColor*>(GrTCast<intptr_t>(geo.vertices()) + k
     ColorOffset); |  179     GrColor* vertColor = GrTCast<GrColor*>(GrTCast<intptr_t>(geo.vertices()) + k
     ColorOffset); | 
|  180     for (int i = 0; i < 4; ++i) { |  180     for (int i = 0; i < 4; ++i) { | 
|  181         *vertColor = color; |  181         *vertColor = color; | 
|  182         vertColor = (GrColor*) ((intptr_t) vertColor + vstride); |  182         vertColor = (GrColor*) ((intptr_t) vertColor + vstride); | 
|  183     } |  183     } | 
|  184  |  184  | 
|  185     this->setIndexSourceToBuffer(this->getContext()->getQuadIndexBuffer()); |  185     this->setIndexSourceToBuffer(this->getContext()->getQuadIndexBuffer()); | 
|  186     this->drawIndexedInstances(ds, gp, kTriangles_GrPrimitiveType, 1, 4, 6, &dev
     Bounds); |  186     this->drawIndexedInstances(pipelineBuilder, gp, kTriangles_GrPrimitiveType, 
     1, 4, 6, | 
 |  187                                &devBounds); | 
|  187 } |  188 } | 
|  188  |  189  | 
|  189 int GrInOrderDrawBuffer::concatInstancedDraw(const GrDrawState& ds, const DrawIn
     fo& info) { |  190 int GrInOrderDrawBuffer::concatInstancedDraw(const GrPipelineBuilder& pipelineBu
     ilder, | 
 |  191                                              const DrawInfo& info) { | 
|  190     SkASSERT(!fCmdBuffer.empty()); |  192     SkASSERT(!fCmdBuffer.empty()); | 
|  191     SkASSERT(info.isInstanced()); |  193     SkASSERT(info.isInstanced()); | 
|  192  |  194  | 
|  193     const GeometrySrcState& geomSrc = this->getGeomSrc(); |  195     const GeometrySrcState& geomSrc = this->getGeomSrc(); | 
|  194  |  196  | 
|  195     // we only attempt to concat the case when reserved verts are used with a cl
     ient-specified index |  197     // we only attempt to concat the case when reserved verts are used with a cl
     ient-specified index | 
|  196     // buffer. To make this work with client-specified VBs we'd need to know if 
     the VB was updated |  198     // buffer. To make this work with client-specified VBs we'd need to know if 
     the VB was updated | 
|  197     // between draws. |  199     // between draws. | 
|  198     if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || |  200     if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || | 
|  199         kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { |  201         kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  231             fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); |  233             fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); | 
|  232         } else { |  234         } else { | 
|  233             fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); |  235             fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); | 
|  234             draw->fType = add_trace_bit(draw->fType); |  236             draw->fType = add_trace_bit(draw->fType); | 
|  235         } |  237         } | 
|  236     } |  238     } | 
|  237  |  239  | 
|  238     return instancesToConcat; |  240     return instancesToConcat; | 
|  239 } |  241 } | 
|  240  |  242  | 
|  241 void GrInOrderDrawBuffer::onDraw(const GrDrawState& ds, |  243 void GrInOrderDrawBuffer::onDraw(const GrPipelineBuilder& pipelineBuilder, | 
|  242                                  const GrGeometryProcessor* gp, |  244                                  const GrGeometryProcessor* gp, | 
|  243                                  const DrawInfo& info, |  245                                  const DrawInfo& info, | 
|  244                                  const GrScissorState& scissorState, |  246                                  const GrScissorState& scissorState, | 
|  245                                  const GrDeviceCoordTexture* dstCopy) { |  247                                  const GrDeviceCoordTexture* dstCopy) { | 
|  246     SkASSERT(info.vertexBuffer() && (!info.isIndexed() || info.indexBuffer())); |  248     SkASSERT(info.vertexBuffer() && (!info.isIndexed() || info.indexBuffer())); | 
|  247  |  249  | 
|  248     if (!this->recordStateAndShouldDraw(ds, gp, scissorState, dstCopy)) { |  250     if (!this->recordStateAndShouldDraw(pipelineBuilder, gp, scissorState, dstCo
     py)) { | 
|  249         return; |  251         return; | 
|  250     } |  252     } | 
|  251  |  253  | 
|  252     Draw* draw; |  254     Draw* draw; | 
|  253     if (info.isInstanced()) { |  255     if (info.isInstanced()) { | 
|  254         int instancesConcated = this->concatInstancedDraw(ds, info); |  256         int instancesConcated = this->concatInstancedDraw(pipelineBuilder, info)
     ; | 
|  255         if (info.instanceCount() > instancesConcated) { |  257         if (info.instanceCount() > instancesConcated) { | 
|  256             draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); |  258             draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); | 
|  257             draw->fInfo.adjustInstanceCount(-instancesConcated); |  259             draw->fInfo.adjustInstanceCount(-instancesConcated); | 
|  258         } else { |  260         } else { | 
|  259             return; |  261             return; | 
|  260         } |  262         } | 
|  261     } else { |  263     } else { | 
|  262         draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); |  264         draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); | 
|  263     } |  265     } | 
|  264     this->recordTraceMarkersIfNecessary(); |  266     this->recordTraceMarkersIfNecessary(); | 
|  265 } |  267 } | 
|  266  |  268  | 
|  267 void GrInOrderDrawBuffer::onStencilPath(const GrDrawState& ds, |  269 void GrInOrderDrawBuffer::onStencilPath(const GrPipelineBuilder& pipelineBuilder
     , | 
|  268                                         const GrPathProcessor* pathProc, |  270                                         const GrPathProcessor* pathProc, | 
|  269                                         const GrPath* path, |  271                                         const GrPath* path, | 
|  270                                         const GrScissorState& scissorState, |  272                                         const GrScissorState& scissorState, | 
|  271                                         const GrStencilSettings& stencilSettings
     ) { |  273                                         const GrStencilSettings& stencilSettings
     ) { | 
|  272     StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, |  274     StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, | 
|  273                                                (path, ds.getRenderTarget())); |  275                                                (path, pipelineBuilder.getRenderT
     arget())); | 
|  274     sp->fScissor = scissorState; |  276     sp->fScissor = scissorState; | 
|  275     sp->fUseHWAA = ds.isHWAntialias(); |  277     sp->fUseHWAA = pipelineBuilder.isHWAntialias(); | 
|  276     sp->fViewMatrix = pathProc->viewMatrix(); |  278     sp->fViewMatrix = pathProc->viewMatrix(); | 
|  277     sp->fStencil = stencilSettings; |  279     sp->fStencil = stencilSettings; | 
|  278     this->recordTraceMarkersIfNecessary(); |  280     this->recordTraceMarkersIfNecessary(); | 
|  279 } |  281 } | 
|  280  |  282  | 
|  281 void GrInOrderDrawBuffer::onDrawPath(const GrDrawState& ds, |  283 void GrInOrderDrawBuffer::onDrawPath(const GrPipelineBuilder& pipelineBuilder, | 
|  282                                      const GrPathProcessor* pathProc, |  284                                      const GrPathProcessor* pathProc, | 
|  283                                      const GrPath* path, |  285                                      const GrPath* path, | 
|  284                                      const GrScissorState& scissorState, |  286                                      const GrScissorState& scissorState, | 
|  285                                      const GrStencilSettings& stencilSettings, |  287                                      const GrStencilSettings& stencilSettings, | 
|  286                                      const GrDeviceCoordTexture* dstCopy) { |  288                                      const GrDeviceCoordTexture* dstCopy) { | 
|  287     // TODO: Only compare the subset of GrDrawState relevant to path covering? |  289     // TODO: Only compare the subset of GrPipelineBuilder relevant to path cover
     ing? | 
|  288     if (!this->recordStateAndShouldDraw(ds, pathProc, scissorState, dstCopy)) { |  290     if (!this->recordStateAndShouldDraw(pipelineBuilder, pathProc, scissorState,
      dstCopy)) { | 
|  289         return; |  291         return; | 
|  290     } |  292     } | 
|  291     DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path)); |  293     DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path)); | 
|  292     dp->fStencilSettings = stencilSettings; |  294     dp->fStencilSettings = stencilSettings; | 
|  293     this->recordTraceMarkersIfNecessary(); |  295     this->recordTraceMarkersIfNecessary(); | 
|  294 } |  296 } | 
|  295  |  297  | 
|  296 void GrInOrderDrawBuffer::onDrawPaths(const GrDrawState& ds, |  298 void GrInOrderDrawBuffer::onDrawPaths(const GrPipelineBuilder& pipelineBuilder, | 
|  297                                       const GrPathProcessor* pathProc, |  299                                       const GrPathProcessor* pathProc, | 
|  298                                       const GrPathRange* pathRange, |  300                                       const GrPathRange* pathRange, | 
|  299                                       const void* indices, |  301                                       const void* indices, | 
|  300                                       PathIndexType indexType, |  302                                       PathIndexType indexType, | 
|  301                                       const float transformValues[], |  303                                       const float transformValues[], | 
|  302                                       PathTransformType transformType, |  304                                       PathTransformType transformType, | 
|  303                                       int count, |  305                                       int count, | 
|  304                                       const GrScissorState& scissorState, |  306                                       const GrScissorState& scissorState, | 
|  305                                       const GrStencilSettings& stencilSettings, |  307                                       const GrStencilSettings& stencilSettings, | 
|  306                                       const GrDeviceCoordTexture* dstCopy) { |  308                                       const GrDeviceCoordTexture* dstCopy) { | 
|  307     SkASSERT(pathRange); |  309     SkASSERT(pathRange); | 
|  308     SkASSERT(indices); |  310     SkASSERT(indices); | 
|  309     SkASSERT(transformValues); |  311     SkASSERT(transformValues); | 
|  310  |  312  | 
|  311     if (!this->recordStateAndShouldDraw(ds, pathProc, scissorState, dstCopy)) { |  313     if (!this->recordStateAndShouldDraw(pipelineBuilder, pathProc, scissorState,
      dstCopy)) { | 
|  312         return; |  314         return; | 
|  313     } |  315     } | 
|  314  |  316  | 
|  315     int indexBytes = GrPathRange::PathIndexSizeInBytes(indexType); |  317     int indexBytes = GrPathRange::PathIndexSizeInBytes(indexType); | 
|  316     if (int misalign = fPathIndexBuffer.count() % indexBytes) { |  318     if (int misalign = fPathIndexBuffer.count() % indexBytes) { | 
|  317         // Add padding to the index buffer so the indices are aligned properly. |  319         // Add padding to the index buffer so the indices are aligned properly. | 
|  318         fPathIndexBuffer.append(indexBytes - misalign); |  320         fPathIndexBuffer.append(indexBytes - misalign); | 
|  319     } |  321     } | 
|  320  |  322  | 
|  321     char* savedIndices = fPathIndexBuffer.append(count * indexBytes, |  323     char* savedIndices = fPathIndexBuffer.append(count * indexBytes, | 
|  322                                                  reinterpret_cast<const char*>(i
     ndices)); |  324                                                  reinterpret_cast<const char*>(i
     ndices)); | 
|  323     float* savedTransforms = fPathTransformBuffer.append( |  325     float* savedTransforms = fPathTransformBuffer.append( | 
|  324                                  count * GrPathRendering::PathTransformSize(tran
     sformType), |  326                                  count * GrPathRendering::PathTransformSize(tran
     sformType), | 
|  325                                  transformValues); |  327                                  transformValues); | 
|  326  |  328  | 
|  327     if (kDrawPaths_Cmd == strip_trace_bit(fCmdBuffer.back().fType)) { |  329     if (kDrawPaths_Cmd == strip_trace_bit(fCmdBuffer.back().fType)) { | 
|  328         // The previous command was also DrawPaths. Try to collapse this call in
     to the one |  330         // The previous command was also DrawPaths. Try to collapse this call in
     to the one | 
|  329         // before. Note that stenciling all the paths at once, then covering, ma
     y not be |  331         // before. Note that stenciling all the paths at once, then covering, ma
     y not be | 
|  330         // equivalent to two separate draw calls if there is overlap. Blending w
     on't work, |  332         // equivalent to two separate draw calls if there is overlap. Blending w
     on't work, | 
|  331         // and the combined calls may also cancel each other's winding numbers i
     n some |  333         // and the combined calls may also cancel each other's winding numbers i
     n some | 
|  332         // places. For now the winding numbers are only an issue if the fill is 
     even/odd, |  334         // places. For now the winding numbers are only an issue if the fill is 
     even/odd, | 
|  333         // because DrawPaths is currently only used for glyphs, and glyphs in th
     e same |  335         // because DrawPaths is currently only used for glyphs, and glyphs in th
     e same | 
|  334         // font tend to all wind in the same direction. |  336         // font tend to all wind in the same direction. | 
|  335         DrawPaths* previous = static_cast<DrawPaths*>(&fCmdBuffer.back()); |  337         DrawPaths* previous = static_cast<DrawPaths*>(&fCmdBuffer.back()); | 
|  336         if (pathRange == previous->pathRange() && |  338         if (pathRange == previous->pathRange() && | 
|  337             indexType == previous->fIndexType && |  339             indexType == previous->fIndexType && | 
|  338             transformType == previous->fTransformType && |  340             transformType == previous->fTransformType && | 
|  339             stencilSettings == previous->fStencilSettings && |  341             stencilSettings == previous->fStencilSettings && | 
|  340             path_fill_type_is_winding(stencilSettings) && |  342             path_fill_type_is_winding(stencilSettings) && | 
|  341             !ds.willBlendWithDst(pathProc)) { |  343             !pipelineBuilder.willBlendWithDst(pathProc)) { | 
|  342             // Fold this DrawPaths call into the one previous. |  344             // Fold this DrawPaths call into the one previous. | 
|  343             previous->fCount += count; |  345             previous->fCount += count; | 
|  344             return; |  346             return; | 
|  345         } |  347         } | 
|  346     } |  348     } | 
|  347  |  349  | 
|  348     DrawPaths* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPaths, (pathRange))
     ; |  350     DrawPaths* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPaths, (pathRange))
     ; | 
|  349     dp->fIndicesLocation = SkToU32(savedIndices - fPathIndexBuffer.begin()); |  351     dp->fIndicesLocation = SkToU32(savedIndices - fPathIndexBuffer.begin()); | 
|  350     dp->fIndexType = indexType; |  352     dp->fIndexType = indexType; | 
|  351     dp->fTransformsLocation = SkToU32(savedTransforms - fPathTransformBuffer.beg
     in()); |  353     dp->fTransformsLocation = SkToU32(savedTransforms - fPathTransformBuffer.beg
     in()); | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  423         if (cmd_has_trace_marker(iter->fType)) { |  425         if (cmd_has_trace_marker(iter->fType)) { | 
|  424             traceString = fGpuCmdMarkers[currCmdMarker].toString(); |  426             traceString = fGpuCmdMarkers[currCmdMarker].toString(); | 
|  425             newMarker.fMarker = traceString.c_str(); |  427             newMarker.fMarker = traceString.c_str(); | 
|  426             this->getGpu()->addGpuTraceMarker(&newMarker); |  428             this->getGpu()->addGpuTraceMarker(&newMarker); | 
|  427             ++currCmdMarker; |  429             ++currCmdMarker; | 
|  428         } |  430         } | 
|  429  |  431  | 
|  430         if (kSetState_Cmd == strip_trace_bit(iter->fType)) { |  432         if (kSetState_Cmd == strip_trace_bit(iter->fType)) { | 
|  431             SetState* ss = reinterpret_cast<SetState*>(iter.get()); |  433             SetState* ss = reinterpret_cast<SetState*>(iter.get()); | 
|  432  |  434  | 
|  433             this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcesso
     r, ss->fState, |  435             this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcesso
     r, ss->fPipeline, | 
|  434                                              ss->fState.descInfo(), ss->fBatchTr
     acker); |  436                                              ss->fPipeline.descInfo(), ss->fBatc
     hTracker); | 
|  435             currentState = ss; |  437             currentState = ss; | 
|  436  |  438  | 
|  437         } else { |  439         } else { | 
|  438             iter->execute(this, currentState); |  440             iter->execute(this, currentState); | 
|  439         } |  441         } | 
|  440  |  442  | 
|  441         if (cmd_has_trace_marker(iter->fType)) { |  443         if (cmd_has_trace_marker(iter->fType)) { | 
|  442             this->getGpu()->removeGpuTraceMarker(&newMarker); |  444             this->getGpu()->removeGpuTraceMarker(&newMarker); | 
|  443         } |  445         } | 
|  444     } |  446     } | 
|  445  |  447  | 
|  446     SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); |  448     SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); | 
|  447     ++fDrawID; |  449     ++fDrawID; | 
|  448 } |  450 } | 
|  449  |  451  | 
|  450 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState
     * state) { |  452 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState
     * state) { | 
|  451     SkASSERT(state); |  453     SkASSERT(state); | 
|  452     DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes
     c, |  454     DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->f
     Desc, | 
|  453                   &state->fBatchTracker); |  455                   &state->fBatchTracker); | 
|  454     buf->getGpu()->draw(args, fInfo); |  456     buf->getGpu()->draw(args, fInfo); | 
|  455 } |  457 } | 
|  456  |  458  | 
|  457 void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, const S
     etState*) { |  459 void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, const S
     etState*) { | 
|  458     GrGpu::StencilPathState state; |  460     GrGpu::StencilPathState state; | 
|  459     state.fRenderTarget = fRenderTarget.get(); |  461     state.fRenderTarget = fRenderTarget.get(); | 
|  460     state.fScissor = &fScissor; |  462     state.fScissor = &fScissor; | 
|  461     state.fStencil = &fStencil; |  463     state.fStencil = &fStencil; | 
|  462     state.fUseHWAA = fUseHWAA; |  464     state.fUseHWAA = fUseHWAA; | 
|  463     state.fViewMatrix = &fViewMatrix; |  465     state.fViewMatrix = &fViewMatrix; | 
|  464  |  466  | 
|  465     buf->getGpu()->stencilPath(this->path(), state); |  467     buf->getGpu()->stencilPath(this->path(), state); | 
|  466 } |  468 } | 
|  467  |  469  | 
|  468 void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, const SetS
     tate* state) { |  470 void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, const SetS
     tate* state) { | 
|  469     SkASSERT(state); |  471     SkASSERT(state); | 
|  470     DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes
     c, |  472     DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->f
     Desc, | 
|  471                   &state->fBatchTracker); |  473                   &state->fBatchTracker); | 
|  472     buf->getGpu()->drawPath(args, this->path(), fStencilSettings); |  474     buf->getGpu()->drawPath(args, this->path(), fStencilSettings); | 
|  473 } |  475 } | 
|  474  |  476  | 
|  475 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set
     State* state) { |  477 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set
     State* state) { | 
|  476     SkASSERT(state); |  478     SkASSERT(state); | 
|  477     DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes
     c, |  479     DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->f
     Desc, | 
|  478                   &state->fBatchTracker); |  480                   &state->fBatchTracker); | 
|  479     buf->getGpu()->drawPaths(args, this->pathRange(), |  481     buf->getGpu()->drawPaths(args, this->pathRange(), | 
|  480                             &buf->fPathIndexBuffer[fIndicesLocation], fIndexType
     , |  482                             &buf->fPathIndexBuffer[fIndicesLocation], fIndexType
     , | 
|  481                             &buf->fPathTransformBuffer[fTransformsLocation], fTr
     ansformType, |  483                             &buf->fPathTransformBuffer[fTransformsLocation], fTr
     ansformType, | 
|  482                             fCount, fStencilSettings); |  484                             fCount, fStencilSettings); | 
|  483 } |  485 } | 
|  484  |  486  | 
|  485 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState
     *) {} |  487 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState
     *) {} | 
|  486  |  488  | 
|  487 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetStat
     e*) { |  489 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetStat
     e*) { | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|  507     if (getGpu()->canCopySurface(dst, src, srcRect, dstPoint)) { |  509     if (getGpu()->canCopySurface(dst, src, srcRect, dstPoint)) { | 
|  508         CopySurface* cs = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, CopySurface, (dst
     , src)); |  510         CopySurface* cs = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, CopySurface, (dst
     , src)); | 
|  509         cs->fSrcRect = srcRect; |  511         cs->fSrcRect = srcRect; | 
|  510         cs->fDstPoint = dstPoint; |  512         cs->fDstPoint = dstPoint; | 
|  511         this->recordTraceMarkersIfNecessary(); |  513         this->recordTraceMarkersIfNecessary(); | 
|  512         return true; |  514         return true; | 
|  513     } |  515     } | 
|  514     return false; |  516     return false; | 
|  515 } |  517 } | 
|  516  |  518  | 
|  517 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrDrawState& ds, |  519 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrPipelineBuilder& pipe
     lineBuilder, | 
|  518                                                    const GrPrimitiveProcessor* p
     rimProc, |  520                                                    const GrPrimitiveProcessor* p
     rimProc, | 
|  519                                                    const GrScissorState& scissor
     , |  521                                                    const GrScissorState& scissor
     , | 
|  520                                                    const GrDeviceCoordTexture* d
     stCopy) { |  522                                                    const GrDeviceCoordTexture* d
     stCopy) { | 
|  521     SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, |  523     SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, | 
|  522                                             (ds, primProc, *this->getGpu()->caps
     (), scissor, |  524                                             (pipelineBuilder, primProc, *this->g
     etGpu()->caps(), | 
|  523                                              dstCopy)); |  525                                              scissor, dstCopy)); | 
|  524     if (ss->fState.mustSkip()) { |  526     if (ss->fPipeline.mustSkip()) { | 
|  525         fCmdBuffer.pop_back(); |  527         fCmdBuffer.pop_back(); | 
|  526         return false; |  528         return false; | 
|  527     } |  529     } | 
|  528  |  530  | 
|  529     ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker, |  531     ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker, | 
|  530                                               ss->fState.getInitBatchTracker()); |  532                                               ss->fPipeline.getInitBatchTracker(
     )); | 
|  531  |  533  | 
|  532     if (fPrevState && |  534     if (fPrevState && | 
|  533         fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker, |  535         fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker, | 
|  534                                                       *ss->fPrimitiveProcessor, |  536                                                       *ss->fPrimitiveProcessor, | 
|  535                                                       ss->fBatchTracker) && |  537                                                       ss->fBatchTracker) && | 
|  536         fPrevState->fState.isEqual(ss->fState)) { |  538         fPrevState->fPipeline.isEqual(ss->fPipeline)) { | 
|  537         fCmdBuffer.pop_back(); |  539         fCmdBuffer.pop_back(); | 
|  538     } else { |  540     } else { | 
|  539         fPrevState = ss; |  541         fPrevState = ss; | 
|  540         this->recordTraceMarkersIfNecessary(); |  542         this->recordTraceMarkersIfNecessary(); | 
|  541     } |  543     } | 
|  542     return true; |  544     return true; | 
|  543 } |  545 } | 
|  544  |  546  | 
|  545 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { |  547 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { | 
|  546     SkASSERT(!fCmdBuffer.empty()); |  548     SkASSERT(!fCmdBuffer.empty()); | 
|  547     SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); |  549     SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); | 
|  548     const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |  550     const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); | 
|  549     if (activeTraceMarkers.count() > 0) { |  551     if (activeTraceMarkers.count() > 0) { | 
|  550         fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); |  552         fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); | 
|  551         fGpuCmdMarkers.push_back(activeTraceMarkers); |  553         fGpuCmdMarkers.push_back(activeTraceMarkers); | 
|  552     } |  554     } | 
|  553 } |  555 } | 
| OLD | NEW |