| 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 |