| 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 "GrBufferAllocPool.h" | 10 #include "GrBufferAllocPool.h" |
| 11 #include "GrDrawTargetCaps.h" | 11 #include "GrDrawTargetCaps.h" |
| 12 #include "GrTextStrike.h" | 12 #include "GrTextStrike.h" |
| 13 #include "GrGpu.h" | 13 #include "GrGpu.h" |
| 14 #include "GrIndexBuffer.h" | |
| 15 #include "GrPath.h" | |
| 16 #include "GrPathRange.h" | |
| 17 #include "GrRenderTarget.h" | |
| 18 #include "GrTemplates.h" | 14 #include "GrTemplates.h" |
| 19 #include "GrTexture.h" | 15 #include "GrTexture.h" |
| 20 #include "GrVertexBuffer.h" | |
| 21 | 16 |
| 22 GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu, | 17 GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu, |
| 23 GrVertexBufferAllocPool* vertexPool, | 18 GrVertexBufferAllocPool* vertexPool, |
| 24 GrIndexBufferAllocPool* indexPool) | 19 GrIndexBufferAllocPool* indexPool) |
| 25 : GrDrawTarget(gpu->getContext()) | 20 : GrDrawTarget(gpu->getContext()) |
| 26 , fDstGpu(gpu) | 21 , fDstGpu(gpu) |
| 27 , fClipSet(true) | 22 , fClipSet(true) |
| 28 , fClipProxyState(kUnknown_ClipProxyState) | 23 , fClipProxyState(kUnknown_ClipProxyState) |
| 29 , fVertexPool(*vertexPool) | 24 , fVertexPool(*vertexPool) |
| 30 , fIndexPool(*indexPool) | 25 , fIndexPool(*indexPool) |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || | 227 if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || |
| 233 kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { | 228 kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { |
| 234 return 0; | 229 return 0; |
| 235 } | 230 } |
| 236 // Check if there is a draw info that is compatible that uses the same VB fr
om the pool and | 231 // Check if there is a draw info that is compatible that uses the same VB fr
om the pool and |
| 237 // the same IB | 232 // the same IB |
| 238 if (kDraw_Cmd != strip_trace_bit(fCmds.back())) { | 233 if (kDraw_Cmd != strip_trace_bit(fCmds.back())) { |
| 239 return 0; | 234 return 0; |
| 240 } | 235 } |
| 241 | 236 |
| 242 DrawRecord* draw = &fDraws.back(); | 237 Draw* draw = &fDraws.back(); |
| 243 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 238 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 244 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer; | 239 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer; |
| 245 | 240 |
| 246 if (!draw->isInstanced() || | 241 if (!draw->isInstanced() || |
| 247 draw->verticesPerInstance() != info.verticesPerInstance() || | 242 draw->verticesPerInstance() != info.verticesPerInstance() || |
| 248 draw->indicesPerInstance() != info.indicesPerInstance() || | 243 draw->indicesPerInstance() != info.indicesPerInstance() || |
| 249 draw->fVertexBuffer != vertexBuffer || | 244 draw->vertexBuffer() != vertexBuffer || |
| 250 draw->fIndexBuffer != geomSrc.fIndexBuffer) { | 245 draw->indexBuffer() != geomSrc.fIndexBuffer) { |
| 251 return 0; | 246 return 0; |
| 252 } | 247 } |
| 253 // info does not yet account for the offset from the start of the pool's VB
while the previous | 248 // info does not yet account for the offset from the start of the pool's VB
while the previous |
| 254 // draw record does. | 249 // draw record does. |
| 255 int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); | 250 int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); |
| 256 if (draw->startVertex() + draw->vertexCount() != adjustedStartVertex) { | 251 if (draw->startVertex() + draw->vertexCount() != adjustedStartVertex) { |
| 257 return 0; | 252 return 0; |
| 258 } | 253 } |
| 259 | 254 |
| 260 SkASSERT(poolState.fPoolStartVertex == draw->startVertex() + draw->vertexCou
nt()); | 255 SkASSERT(poolState.fPoolStartVertex == draw->startVertex() + draw->vertexCou
nt()); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 info.getDevBounds() && | 307 info.getDevBounds() && |
| 313 this->quickInsideClip(*info.getDevBounds())) { | 308 this->quickInsideClip(*info.getDevBounds())) { |
| 314 acr.set(this->drawState()); | 309 acr.set(this->drawState()); |
| 315 } | 310 } |
| 316 | 311 |
| 317 if (this->needsNewClip()) { | 312 if (this->needsNewClip()) { |
| 318 this->recordClip(); | 313 this->recordClip(); |
| 319 } | 314 } |
| 320 this->recordStateIfNecessary(); | 315 this->recordStateIfNecessary(); |
| 321 | 316 |
| 322 DrawRecord* draw; | 317 const GrVertexBuffer* vb; |
| 318 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) { |
| 319 vb = this->getGeomSrc().fVertexBuffer; |
| 320 } else { |
| 321 vb = poolState.fPoolVertexBuffer; |
| 322 } |
| 323 |
| 324 const GrIndexBuffer* ib = NULL; |
| 325 if (info.isIndexed()) { |
| 326 if (kBuffer_GeometrySrcType == this->getGeomSrc().fIndexSrc) { |
| 327 ib = this->getGeomSrc().fIndexBuffer; |
| 328 } else { |
| 329 ib = poolState.fPoolIndexBuffer; |
| 330 } |
| 331 } |
| 332 |
| 333 Draw* draw; |
| 323 if (info.isInstanced()) { | 334 if (info.isInstanced()) { |
| 324 int instancesConcated = this->concatInstancedDraw(info); | 335 int instancesConcated = this->concatInstancedDraw(info); |
| 325 if (info.instanceCount() > instancesConcated) { | 336 if (info.instanceCount() > instancesConcated) { |
| 326 draw = this->recordDraw(info); | 337 draw = this->recordDraw(info, vb, ib); |
| 327 draw->adjustInstanceCount(-instancesConcated); | 338 draw->adjustInstanceCount(-instancesConcated); |
| 328 } else { | 339 } else { |
| 329 return; | 340 return; |
| 330 } | 341 } |
| 331 } else { | 342 } else { |
| 332 draw = this->recordDraw(info); | 343 draw = this->recordDraw(info, vb, ib); |
| 333 } | 344 } |
| 334 | 345 |
| 335 switch (this->getGeomSrc().fVertexSrc) { | 346 // Adjust the starting vertex and index when we are using reserved or array
sources to |
| 336 case kBuffer_GeometrySrcType: | 347 // compensate for the fact that the data was inserted into a larger vb/ib ow
ned by the pool. |
| 337 draw->fVertexBuffer = this->getGeomSrc().fVertexBuffer; | 348 if (kBuffer_GeometrySrcType != this->getGeomSrc().fVertexSrc) { |
| 338 break; | 349 size_t bytes = (info.vertexCount() + info.startVertex()) * drawState.get
VertexStride(); |
| 339 case kReserved_GeometrySrcType: // fallthrough | 350 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes,
bytes); |
| 340 case kArray_GeometrySrcType: { | 351 draw->adjustStartVertex(poolState.fPoolStartVertex); |
| 341 size_t vertexBytes = (info.vertexCount() + info.startVertex()) * | |
| 342 drawState.getVertexStride(); | |
| 343 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexByt
es, vertexBytes); | |
| 344 draw->fVertexBuffer = poolState.fPoolVertexBuffer; | |
| 345 draw->adjustStartVertex(poolState.fPoolStartVertex); | |
| 346 break; | |
| 347 } | |
| 348 default: | |
| 349 SkFAIL("unknown geom src type"); | |
| 350 } | 352 } |
| 351 draw->fVertexBuffer->ref(); | 353 |
| 352 | 354 if (info.isIndexed() && kBuffer_GeometrySrcType != this->getGeomSrc().fIndex
Src) { |
| 353 if (info.isIndexed()) { | 355 size_t bytes = (info.indexCount() + info.startIndex()) * sizeof(uint16_t
); |
| 354 switch (this->getGeomSrc().fIndexSrc) { | 356 poolState.fUsedPoolIndexBytes = SkTMax(poolState.fUsedPoolIndexBytes, by
tes); |
| 355 case kBuffer_GeometrySrcType: | 357 draw->adjustStartIndex(poolState.fPoolStartIndex); |
| 356 draw->fIndexBuffer = this->getGeomSrc().fIndexBuffer; | |
| 357 break; | |
| 358 case kReserved_GeometrySrcType: // fallthrough | |
| 359 case kArray_GeometrySrcType: { | |
| 360 size_t indexBytes = (info.indexCount() + info.startIndex()) * si
zeof(uint16_t); | |
| 361 poolState.fUsedPoolIndexBytes = SkTMax(poolState.fUsedPoolIndexB
ytes, indexBytes); | |
| 362 draw->fIndexBuffer = poolState.fPoolIndexBuffer; | |
| 363 draw->adjustStartIndex(poolState.fPoolStartIndex); | |
| 364 break; | |
| 365 } | |
| 366 default: | |
| 367 SkFAIL("unknown geom src type"); | |
| 368 } | |
| 369 draw->fIndexBuffer->ref(); | |
| 370 } else { | |
| 371 draw->fIndexBuffer = NULL; | |
| 372 } | 358 } |
| 373 } | 359 } |
| 374 | 360 |
| 375 GrInOrderDrawBuffer::StencilPath::StencilPath() {} | |
| 376 GrInOrderDrawBuffer::DrawPath::DrawPath() {} | |
| 377 GrInOrderDrawBuffer::DrawPaths::DrawPaths() {} | |
| 378 GrInOrderDrawBuffer::DrawPaths::~DrawPaths() { | |
| 379 if (fTransforms) { | |
| 380 SkDELETE_ARRAY(fTransforms); | |
| 381 } | |
| 382 if (fIndices) { | |
| 383 SkDELETE_ARRAY(fIndices); | |
| 384 } | |
| 385 } | |
| 386 | |
| 387 void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, SkPath::FillType fil
l) { | 361 void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, SkPath::FillType fil
l) { |
| 388 if (this->needsNewClip()) { | 362 if (this->needsNewClip()) { |
| 389 this->recordClip(); | 363 this->recordClip(); |
| 390 } | 364 } |
| 391 // Only compare the subset of GrDrawState relevant to path stenciling? | 365 // Only compare the subset of GrDrawState relevant to path stenciling? |
| 392 this->recordStateIfNecessary(); | 366 this->recordStateIfNecessary(); |
| 393 StencilPath* sp = this->recordStencilPath(); | 367 StencilPath* sp = this->recordStencilPath(path); |
| 394 sp->fPath.reset(path); | |
| 395 path->ref(); | |
| 396 sp->fFill = fill; | 368 sp->fFill = fill; |
| 397 } | 369 } |
| 398 | 370 |
| 399 void GrInOrderDrawBuffer::onDrawPath(const GrPath* path, | 371 void GrInOrderDrawBuffer::onDrawPath(const GrPath* path, |
| 400 SkPath::FillType fill, const GrDeviceCoordT
exture* dstCopy) { | 372 SkPath::FillType fill, const GrDeviceCoordT
exture* dstCopy) { |
| 401 if (this->needsNewClip()) { | 373 if (this->needsNewClip()) { |
| 402 this->recordClip(); | 374 this->recordClip(); |
| 403 } | 375 } |
| 404 // TODO: Only compare the subset of GrDrawState relevant to path covering? | 376 // TODO: Only compare the subset of GrDrawState relevant to path covering? |
| 405 this->recordStateIfNecessary(); | 377 this->recordStateIfNecessary(); |
| 406 DrawPath* cp = this->recordDrawPath(); | 378 DrawPath* cp = this->recordDrawPath(path); |
| 407 cp->fPath.reset(path); | |
| 408 path->ref(); | |
| 409 cp->fFill = fill; | 379 cp->fFill = fill; |
| 410 if (dstCopy) { | 380 if (dstCopy) { |
| 411 cp->fDstCopy = *dstCopy; | 381 cp->fDstCopy = *dstCopy; |
| 412 } | 382 } |
| 413 } | 383 } |
| 414 | 384 |
| 415 void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, | 385 void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, |
| 416 const uint32_t indices[], int count, | 386 const uint32_t indices[], int count, |
| 417 const float transforms[], PathTransformTyp
e transformsType, | 387 const float transforms[], PathTransformTyp
e transformsType, |
| 418 SkPath::FillType fill, const GrDeviceCoord
Texture* dstCopy) { | 388 SkPath::FillType fill, const GrDeviceCoord
Texture* dstCopy) { |
| 419 SkASSERT(pathRange); | 389 SkASSERT(pathRange); |
| 420 SkASSERT(indices); | 390 SkASSERT(indices); |
| 421 SkASSERT(transforms); | 391 SkASSERT(transforms); |
| 422 | 392 |
| 423 if (this->needsNewClip()) { | 393 if (this->needsNewClip()) { |
| 424 this->recordClip(); | 394 this->recordClip(); |
| 425 } | 395 } |
| 426 this->recordStateIfNecessary(); | 396 this->recordStateIfNecessary(); |
| 427 DrawPaths* dp = this->recordDrawPaths(); | 397 DrawPaths* dp = this->recordDrawPaths(pathRange); |
| 428 dp->fPathRange.reset(SkRef(pathRange)); | |
| 429 dp->fIndices = SkNEW_ARRAY(uint32_t, count); // TODO: Accomplish this withou
t a malloc | 398 dp->fIndices = SkNEW_ARRAY(uint32_t, count); // TODO: Accomplish this withou
t a malloc |
| 430 memcpy(dp->fIndices, indices, sizeof(uint32_t) * count); | 399 memcpy(dp->fIndices, indices, sizeof(uint32_t) * count); |
| 431 dp->fCount = count; | 400 dp->fCount = count; |
| 432 | 401 |
| 433 const int transformsLength = GrPathRendering::PathTransformSize(transformsTy
pe) * count; | 402 const int transformsLength = GrPathRendering::PathTransformSize(transformsTy
pe) * count; |
| 434 dp->fTransforms = SkNEW_ARRAY(float, transformsLength); | 403 dp->fTransforms = SkNEW_ARRAY(float, transformsLength); |
| 435 memcpy(dp->fTransforms, transforms, sizeof(float) * transformsLength); | 404 memcpy(dp->fTransforms, transforms, sizeof(float) * transformsLength); |
| 436 dp->fTransformsType = transformsType; | 405 dp->fTransformsType = transformsType; |
| 437 | 406 |
| 438 dp->fFill = fill; | 407 dp->fFill = fill; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 449 renderTarget = this->drawState()->getRenderTarget(); | 418 renderTarget = this->drawState()->getRenderTarget(); |
| 450 SkASSERT(renderTarget); | 419 SkASSERT(renderTarget); |
| 451 } | 420 } |
| 452 if (NULL == rect) { | 421 if (NULL == rect) { |
| 453 // We could do something smart and remove previous draws and clears to | 422 // We could do something smart and remove previous draws and clears to |
| 454 // the current render target. If we get that smart we have to make sure | 423 // the current render target. If we get that smart we have to make sure |
| 455 // those draws aren't read before this clear (render-to-texture). | 424 // those draws aren't read before this clear (render-to-texture). |
| 456 r.setLTRB(0, 0, renderTarget->width(), renderTarget->height()); | 425 r.setLTRB(0, 0, renderTarget->width(), renderTarget->height()); |
| 457 rect = &r; | 426 rect = &r; |
| 458 } | 427 } |
| 459 Clear* clr = this->recordClear(); | 428 Clear* clr = this->recordClear(renderTarget); |
| 460 GrColorIsPMAssert(color); | 429 GrColorIsPMAssert(color); |
| 461 clr->fColor = color; | 430 clr->fColor = color; |
| 462 clr->fRect = *rect; | 431 clr->fRect = *rect; |
| 463 clr->fCanIgnoreRect = canIgnoreRect; | 432 clr->fCanIgnoreRect = canIgnoreRect; |
| 464 clr->fRenderTarget = renderTarget; | |
| 465 renderTarget->ref(); | |
| 466 } | 433 } |
| 467 | 434 |
| 468 void GrInOrderDrawBuffer::discard(GrRenderTarget* renderTarget) { | 435 void GrInOrderDrawBuffer::discard(GrRenderTarget* renderTarget) { |
| 469 if (!this->caps()->discardRenderTargetSupport()) { | 436 if (!this->caps()->discardRenderTargetSupport()) { |
| 470 return; | 437 return; |
| 471 } | 438 } |
| 472 if (NULL == renderTarget) { | 439 if (NULL == renderTarget) { |
| 473 renderTarget = this->drawState()->getRenderTarget(); | 440 renderTarget = this->drawState()->getRenderTarget(); |
| 474 SkASSERT(renderTarget); | 441 SkASSERT(renderTarget); |
| 475 } | 442 } |
| 476 Clear* clr = this->recordClear(); | 443 Clear* clr = this->recordClear(renderTarget); |
| 477 clr->fColor = GrColor_ILLEGAL; | 444 clr->fColor = GrColor_ILLEGAL; |
| 478 clr->fRenderTarget = renderTarget; | |
| 479 renderTarget->ref(); | |
| 480 } | 445 } |
| 481 | 446 |
| 482 void GrInOrderDrawBuffer::reset() { | 447 void GrInOrderDrawBuffer::reset() { |
| 483 SkASSERT(1 == fGeoPoolStateStack.count()); | 448 SkASSERT(1 == fGeoPoolStateStack.count()); |
| 484 this->resetVertexSource(); | 449 this->resetVertexSource(); |
| 485 this->resetIndexSource(); | 450 this->resetIndexSource(); |
| 486 | 451 |
| 487 DrawAllocator::Iter drawIter(&fDraws); | |
| 488 while (drawIter.next()) { | |
| 489 // we always have a VB, but not always an IB | |
| 490 SkASSERT(drawIter->fVertexBuffer); | |
| 491 drawIter->fVertexBuffer->unref(); | |
| 492 SkSafeUnref(drawIter->fIndexBuffer); | |
| 493 } | |
| 494 fCmds.reset(); | 452 fCmds.reset(); |
| 495 fDraws.reset(); | 453 fDraws.reset(); |
| 496 fStencilPaths.reset(); | 454 fStencilPaths.reset(); |
| 497 fDrawPath.reset(); | 455 fDrawPath.reset(); |
| 498 fDrawPaths.reset(); | 456 fDrawPaths.reset(); |
| 499 fStates.reset(); | 457 fStates.reset(); |
| 500 fClears.reset(); | 458 fClears.reset(); |
| 501 fVertexPool.reset(); | 459 fVertexPool.reset(); |
| 502 fIndexPool.reset(); | 460 fIndexPool.reset(); |
| 503 fClips.reset(); | 461 fClips.reset(); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 if (cmd_has_trace_marker(fCmds[c])) { | 510 if (cmd_has_trace_marker(fCmds[c])) { |
| 553 traceString = fGpuCmdMarkers[currCmdMarker].toString(); | 511 traceString = fGpuCmdMarkers[currCmdMarker].toString(); |
| 554 newMarker.fMarker = traceString.c_str(); | 512 newMarker.fMarker = traceString.c_str(); |
| 555 fDstGpu->addGpuTraceMarker(&newMarker); | 513 fDstGpu->addGpuTraceMarker(&newMarker); |
| 556 ++currCmdMarker; | 514 ++currCmdMarker; |
| 557 } | 515 } |
| 558 switch (strip_trace_bit(fCmds[c])) { | 516 switch (strip_trace_bit(fCmds[c])) { |
| 559 case kDraw_Cmd: { | 517 case kDraw_Cmd: { |
| 560 SkASSERT(fDstGpu->drawState() != prevDrawState); | 518 SkASSERT(fDstGpu->drawState() != prevDrawState); |
| 561 SkAssertResult(drawIter.next()); | 519 SkAssertResult(drawIter.next()); |
| 562 fDstGpu->setVertexSourceToBuffer(drawIter->fVertexBuffer); | 520 fDstGpu->setVertexSourceToBuffer(drawIter->vertexBuffer()); |
| 563 if (drawIter->isIndexed()) { | 521 if (drawIter->isIndexed()) { |
| 564 fDstGpu->setIndexSourceToBuffer(drawIter->fIndexBuffer); | 522 fDstGpu->setIndexSourceToBuffer(drawIter->indexBuffer()); |
| 565 } | 523 } |
| 566 fDstGpu->executeDraw(*drawIter); | 524 fDstGpu->executeDraw(*drawIter); |
| 567 break; | 525 break; |
| 568 } | 526 } |
| 569 case kStencilPath_Cmd: { | 527 case kStencilPath_Cmd: { |
| 570 SkASSERT(fDstGpu->drawState() != prevDrawState); | 528 SkASSERT(fDstGpu->drawState() != prevDrawState); |
| 571 SkAssertResult(stencilPathIter.next()); | 529 SkAssertResult(stencilPathIter.next()); |
| 572 fDstGpu->stencilPath(stencilPathIter->fPath.get(), stencilPathIt
er->fFill); | 530 fDstGpu->stencilPath(stencilPathIter->path(), stencilPathIter->f
Fill); |
| 573 break; | 531 break; |
| 574 } | 532 } |
| 575 case kDrawPath_Cmd: { | 533 case kDrawPath_Cmd: { |
| 576 SkASSERT(fDstGpu->drawState() != prevDrawState); | 534 SkASSERT(fDstGpu->drawState() != prevDrawState); |
| 577 SkAssertResult(drawPathIter.next()); | 535 SkAssertResult(drawPathIter.next()); |
| 578 fDstGpu->executeDrawPath(drawPathIter->fPath.get(), drawPathIter
->fFill, | 536 fDstGpu->executeDrawPath(drawPathIter->path(), drawPathIter->fFi
ll, |
| 579 drawPathIter->fDstCopy.texture() ? | 537 drawPathIter->fDstCopy.texture() ? |
| 580 &drawPathIter->fDstCopy : | 538 &drawPathIter->fDstCopy : |
| 581 NULL); | 539 NULL); |
| 582 break; | 540 break; |
| 583 } | 541 } |
| 584 case kDrawPaths_Cmd: { | 542 case kDrawPaths_Cmd: { |
| 585 SkASSERT(fDstGpu->drawState() != prevDrawState); | 543 SkASSERT(fDstGpu->drawState() != prevDrawState); |
| 586 SkAssertResult(drawPathsIter.next()); | 544 SkAssertResult(drawPathsIter.next()); |
| 587 const GrDeviceCoordTexture* dstCopy = | 545 const GrDeviceCoordTexture* dstCopy = |
| 588 drawPathsIter->fDstCopy.texture() ? &drawPathsIter->fDstCopy
: NULL; | 546 drawPathsIter->fDstCopy.texture() ? &drawPathsIter->fDstCopy
: NULL; |
| 589 fDstGpu->executeDrawPaths(drawPathsIter->fPathRange.get(), | 547 fDstGpu->executeDrawPaths(drawPathsIter->pathRange(), |
| 590 drawPathsIter->fIndices, | 548 drawPathsIter->fIndices, |
| 591 drawPathsIter->fCount, | 549 drawPathsIter->fCount, |
| 592 drawPathsIter->fTransforms, | 550 drawPathsIter->fTransforms, |
| 593 drawPathsIter->fTransformsType, | 551 drawPathsIter->fTransformsType, |
| 594 drawPathsIter->fFill, | 552 drawPathsIter->fFill, |
| 595 dstCopy); | 553 dstCopy); |
| 596 break; | 554 break; |
| 597 } | 555 } |
| 598 case kSetState_Cmd: | 556 case kSetState_Cmd: |
| 599 SkAssertResult(stateIter.next()); | 557 SkAssertResult(stateIter.next()); |
| 600 fDstGpu->setDrawState(stateIter.get()); | 558 fDstGpu->setDrawState(stateIter.get()); |
| 601 break; | 559 break; |
| 602 case kSetClip_Cmd: | 560 case kSetClip_Cmd: |
| 603 SkAssertResult(clipIter.next()); | 561 SkAssertResult(clipIter.next()); |
| 604 clipData.fClipStack = &clipIter->fStack; | 562 clipData.fClipStack = &clipIter->fStack; |
| 605 clipData.fOrigin = clipIter->fOrigin; | 563 clipData.fOrigin = clipIter->fOrigin; |
| 606 fDstGpu->setClip(&clipData); | 564 fDstGpu->setClip(&clipData); |
| 607 break; | 565 break; |
| 608 case kClear_Cmd: | 566 case kClear_Cmd: |
| 609 SkAssertResult(clearIter.next()); | 567 SkAssertResult(clearIter.next()); |
| 610 if (GrColor_ILLEGAL == clearIter->fColor) { | 568 if (GrColor_ILLEGAL == clearIter->fColor) { |
| 611 fDstGpu->discard(clearIter->fRenderTarget); | 569 fDstGpu->discard(clearIter->renderTarget()); |
| 612 } else { | 570 } else { |
| 613 fDstGpu->clear(&clearIter->fRect, | 571 fDstGpu->clear(&clearIter->fRect, |
| 614 clearIter->fColor, | 572 clearIter->fColor, |
| 615 clearIter->fCanIgnoreRect, | 573 clearIter->fCanIgnoreRect, |
| 616 clearIter->fRenderTarget); | 574 clearIter->renderTarget()); |
| 617 } | 575 } |
| 618 break; | 576 break; |
| 619 case kCopySurface_Cmd: | 577 case kCopySurface_Cmd: |
| 620 SkAssertResult(copySurfaceIter.next()); | 578 SkAssertResult(copySurfaceIter.next()); |
| 621 fDstGpu->copySurface(copySurfaceIter->fDst.get(), | 579 fDstGpu->copySurface(copySurfaceIter->dst(), |
| 622 copySurfaceIter->fSrc.get(), | 580 copySurfaceIter->src(), |
| 623 copySurfaceIter->fSrcRect, | 581 copySurfaceIter->fSrcRect, |
| 624 copySurfaceIter->fDstPoint); | 582 copySurfaceIter->fDstPoint); |
| 625 break; | 583 break; |
| 626 } | 584 } |
| 627 if (cmd_has_trace_marker(fCmds[c])) { | 585 if (cmd_has_trace_marker(fCmds[c])) { |
| 628 fDstGpu->removeGpuTraceMarker(&newMarker); | 586 fDstGpu->removeGpuTraceMarker(&newMarker); |
| 629 } | 587 } |
| 630 } | 588 } |
| 631 fDstGpu->restoreActiveTraceMarkers(); | 589 fDstGpu->restoreActiveTraceMarkers(); |
| 632 // we should have consumed all the states, clips, etc. | 590 // we should have consumed all the states, clips, etc. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 645 prevDrawState->unref(); | 603 prevDrawState->unref(); |
| 646 this->reset(); | 604 this->reset(); |
| 647 ++fDrawID; | 605 ++fDrawID; |
| 648 } | 606 } |
| 649 | 607 |
| 650 bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, | 608 bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, |
| 651 GrSurface* src, | 609 GrSurface* src, |
| 652 const SkIRect& srcRect, | 610 const SkIRect& srcRect, |
| 653 const SkIPoint& dstPoint) { | 611 const SkIPoint& dstPoint) { |
| 654 if (fDstGpu->canCopySurface(dst, src, srcRect, dstPoint)) { | 612 if (fDstGpu->canCopySurface(dst, src, srcRect, dstPoint)) { |
| 655 CopySurface* cs = this->recordCopySurface(); | 613 CopySurface* cs = this->recordCopySurface(dst, src); |
| 656 cs->fDst.reset(SkRef(dst)); | |
| 657 cs->fSrc.reset(SkRef(src)); | |
| 658 cs->fSrcRect = srcRect; | 614 cs->fSrcRect = srcRect; |
| 659 cs->fDstPoint = dstPoint; | 615 cs->fDstPoint = dstPoint; |
| 660 return true; | 616 return true; |
| 661 } else { | 617 } else { |
| 662 return false; | 618 return false; |
| 663 } | 619 } |
| 664 } | 620 } |
| 665 | 621 |
| 666 bool GrInOrderDrawBuffer::onCanCopySurface(GrSurface* dst, | 622 bool GrInOrderDrawBuffer::onCanCopySurface(GrSurface* dst, |
| 667 GrSurface* src, | 623 GrSurface* src, |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 798 | 754 |
| 799 // Similar to releaseReservedVertexSpace we return any unused portion at | 755 // Similar to releaseReservedVertexSpace we return any unused portion at |
| 800 // the tail | 756 // the tail |
| 801 size_t reservedIndexBytes = sizeof(uint16_t) * geoSrc.fIndexCount; | 757 size_t reservedIndexBytes = sizeof(uint16_t) * geoSrc.fIndexCount; |
| 802 fIndexPool.putBack(reservedIndexBytes - poolState.fUsedPoolIndexBytes); | 758 fIndexPool.putBack(reservedIndexBytes - poolState.fUsedPoolIndexBytes); |
| 803 poolState.fUsedPoolIndexBytes = 0; | 759 poolState.fUsedPoolIndexBytes = 0; |
| 804 poolState.fPoolIndexBuffer = NULL; | 760 poolState.fPoolIndexBuffer = NULL; |
| 805 poolState.fPoolStartIndex = 0; | 761 poolState.fPoolStartIndex = 0; |
| 806 } | 762 } |
| 807 | 763 |
| 808 void GrInOrderDrawBuffer::onSetVertexSourceToArray(const void* vertexArray, | 764 void GrInOrderDrawBuffer::onSetVertexSourceToArray(const void* vertexArray, int
vertexCount) { |
| 809 int vertexCount) { | |
| 810 | |
| 811 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 765 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 812 SkASSERT(0 == poolState.fUsedPoolVertexBytes); | 766 SkASSERT(0 == poolState.fUsedPoolVertexBytes); |
| 813 #ifdef SK_DEBUG | 767 #ifdef SK_DEBUG |
| 814 bool success = | 768 bool success = |
| 815 #endif | 769 #endif |
| 816 fVertexPool.appendVertices(this->getVertexSize(), | 770 fVertexPool.appendVertices(this->getVertexSize(), |
| 817 vertexCount, | 771 vertexCount, |
| 818 vertexArray, | 772 vertexArray, |
| 819 &poolState.fPoolVertexBuffer, | 773 &poolState.fPoolVertexBuffer, |
| 820 &poolState.fPoolStartVertex); | 774 &poolState.fPoolStartVertex); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 852 poolState.fUsedPoolVertexBytes = 0; | 806 poolState.fUsedPoolVertexBytes = 0; |
| 853 poolState.fUsedPoolIndexBytes = 0; | 807 poolState.fUsedPoolIndexBytes = 0; |
| 854 #ifdef SK_DEBUG | 808 #ifdef SK_DEBUG |
| 855 poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0; | 809 poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0; |
| 856 poolState.fPoolStartVertex = ~0; | 810 poolState.fPoolStartVertex = ~0; |
| 857 poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0; | 811 poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0; |
| 858 poolState.fPoolStartIndex = ~0; | 812 poolState.fPoolStartIndex = ~0; |
| 859 #endif | 813 #endif |
| 860 } | 814 } |
| 861 | 815 |
| 862 void GrInOrderDrawBuffer::geometrySourceWillPop( | 816 void GrInOrderDrawBuffer::geometrySourceWillPop(const GeometrySrcState& restored
State) { |
| 863 const GeometrySrcState& restoredState) { | |
| 864 SkASSERT(fGeoPoolStateStack.count() > 1); | 817 SkASSERT(fGeoPoolStateStack.count() > 1); |
| 865 fGeoPoolStateStack.pop_back(); | 818 fGeoPoolStateStack.pop_back(); |
| 866 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 819 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 867 // we have to assume that any slack we had in our vertex/index data | 820 // we have to assume that any slack we had in our vertex/index data |
| 868 // is now unreleasable because data may have been appended later in the | 821 // is now unreleasable because data may have been appended later in the |
| 869 // pool. | 822 // pool. |
| 870 if (kReserved_GeometrySrcType == restoredState.fVertexSrc || | 823 if (kReserved_GeometrySrcType == restoredState.fVertexSrc || |
| 871 kArray_GeometrySrcType == restoredState.fVertexSrc) { | 824 kArray_GeometrySrcType == restoredState.fVertexSrc) { |
| 872 poolState.fUsedPoolVertexBytes = restoredState.fVertexSize * restoredSta
te.fVertexCount; | 825 poolState.fUsedPoolVertexBytes = restoredState.fVertexSize * restoredSta
te.fVertexCount; |
| 873 } | 826 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 927 } | 880 } |
| 928 } | 881 } |
| 929 | 882 |
| 930 void GrInOrderDrawBuffer::recordClip() { | 883 void GrInOrderDrawBuffer::recordClip() { |
| 931 fClips.push_back().fStack = *this->getClip()->fClipStack; | 884 fClips.push_back().fStack = *this->getClip()->fClipStack; |
| 932 fClips.back().fOrigin = this->getClip()->fOrigin; | 885 fClips.back().fOrigin = this->getClip()->fOrigin; |
| 933 fClipSet = false; | 886 fClipSet = false; |
| 934 this->addToCmdBuffer(kSetClip_Cmd); | 887 this->addToCmdBuffer(kSetClip_Cmd); |
| 935 } | 888 } |
| 936 | 889 |
| 937 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo&
info) { | 890 GrInOrderDrawBuffer::Draw* GrInOrderDrawBuffer::recordDraw(const DrawInfo& info, |
| 891 const GrVertexBuffer*
vb, |
| 892 const GrIndexBuffer*
ib) { |
| 938 this->addToCmdBuffer(kDraw_Cmd); | 893 this->addToCmdBuffer(kDraw_Cmd); |
| 939 return &fDraws.push_back(info); | 894 return GrNEW_APPEND_TO_ALLOCATOR(&fDraws, Draw, (info, vb, ib)); |
| 940 } | 895 } |
| 941 | 896 |
| 942 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { | 897 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath(const G
rPath* path) { |
| 943 this->addToCmdBuffer(kStencilPath_Cmd); | 898 this->addToCmdBuffer(kStencilPath_Cmd); |
| 944 return &fStencilPaths.push_back(); | 899 return GrNEW_APPEND_TO_ALLOCATOR(&fStencilPaths, StencilPath, (path)); |
| 945 } | 900 } |
| 946 | 901 |
| 947 GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() { | 902 GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath(const GrPath*
path) { |
| 948 this->addToCmdBuffer(kDrawPath_Cmd); | 903 this->addToCmdBuffer(kDrawPath_Cmd); |
| 949 return &fDrawPath.push_back(); | 904 return GrNEW_APPEND_TO_ALLOCATOR(&fDrawPath, DrawPath, (path)); |
| 950 } | 905 } |
| 951 | 906 |
| 952 GrInOrderDrawBuffer::DrawPaths* GrInOrderDrawBuffer::recordDrawPaths() { | 907 GrInOrderDrawBuffer::DrawPaths* GrInOrderDrawBuffer::recordDrawPaths(const GrPat
hRange* pathRange) { |
| 953 this->addToCmdBuffer(kDrawPaths_Cmd); | 908 this->addToCmdBuffer(kDrawPaths_Cmd); |
| 954 return &fDrawPaths.push_back(); | 909 return GrNEW_APPEND_TO_ALLOCATOR(&fDrawPaths, DrawPaths, (pathRange)); |
| 955 } | 910 } |
| 956 | 911 |
| 957 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { | 912 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear(GrRenderTarget* rt)
{ |
| 958 this->addToCmdBuffer(kClear_Cmd); | 913 this->addToCmdBuffer(kClear_Cmd); |
| 959 return &fClears.push_back(); | 914 return GrNEW_APPEND_TO_ALLOCATOR(&fClears, Clear, (rt)); |
| 960 } | 915 } |
| 961 | 916 |
| 962 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { | 917 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface(GrSurfa
ce* dst, |
| 918 GrSurfa
ce* src) { |
| 963 this->addToCmdBuffer(kCopySurface_Cmd); | 919 this->addToCmdBuffer(kCopySurface_Cmd); |
| 964 return &fCopySurfaces.push_back(); | 920 return GrNEW_APPEND_TO_ALLOCATOR(&fCopySurfaces, CopySurface, (dst, src)); |
| 965 } | 921 } |
| 966 | 922 |
| 967 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | 923 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
| 968 INHERITED::clipWillBeSet(newClipData); | 924 INHERITED::clipWillBeSet(newClipData); |
| 969 fClipSet = true; | 925 fClipSet = true; |
| 970 fClipProxyState = kUnknown_ClipProxyState; | 926 fClipProxyState = kUnknown_ClipProxyState; |
| 971 } | 927 } |
| OLD | NEW |