| 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" |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 GrCrash("unknown geom src type"); | 379 GrCrash("unknown geom src type"); |
| 380 } | 380 } |
| 381 draw->fIndexBuffer->ref(); | 381 draw->fIndexBuffer->ref(); |
| 382 } else { | 382 } else { |
| 383 draw->fIndexBuffer = NULL; | 383 draw->fIndexBuffer = NULL; |
| 384 } | 384 } |
| 385 } | 385 } |
| 386 | 386 |
| 387 GrInOrderDrawBuffer::StencilPath::StencilPath() {} | 387 GrInOrderDrawBuffer::StencilPath::StencilPath() {} |
| 388 GrInOrderDrawBuffer::DrawPath::DrawPath() {} | 388 GrInOrderDrawBuffer::DrawPath::DrawPath() {} |
| 389 GrInOrderDrawBuffer::DrawPaths::DrawPaths() {} |
| 390 GrInOrderDrawBuffer::DrawPaths::~DrawPaths() { |
| 391 if (fTransforms) { |
| 392 SkDELETE_ARRAY(fTransforms); |
| 393 } |
| 394 for (size_t i = 0; i < fPathCount; ++i) { |
| 395 fPaths[i]->unref(); |
| 396 } |
| 397 SkDELETE_ARRAY(fPaths); |
| 398 } |
| 389 | 399 |
| 390 void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, SkPath::FillType fil
l) { | 400 void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, SkPath::FillType fil
l) { |
| 391 if (this->needsNewClip()) { | 401 if (this->needsNewClip()) { |
| 392 this->recordClip(); | 402 this->recordClip(); |
| 393 } | 403 } |
| 394 // Only compare the subset of GrDrawState relevant to path stenciling? | 404 // Only compare the subset of GrDrawState relevant to path stenciling? |
| 395 if (this->needsNewState()) { | 405 if (this->needsNewState()) { |
| 396 this->recordState(); | 406 this->recordState(); |
| 397 } | 407 } |
| 398 StencilPath* sp = this->recordStencilPath(); | 408 StencilPath* sp = this->recordStencilPath(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 412 } | 422 } |
| 413 DrawPath* cp = this->recordDrawPath(); | 423 DrawPath* cp = this->recordDrawPath(); |
| 414 cp->fPath.reset(path); | 424 cp->fPath.reset(path); |
| 415 path->ref(); | 425 path->ref(); |
| 416 cp->fFill = fill; | 426 cp->fFill = fill; |
| 417 if (NULL != dstCopy) { | 427 if (NULL != dstCopy) { |
| 418 cp->fDstCopy = *dstCopy; | 428 cp->fDstCopy = *dstCopy; |
| 419 } | 429 } |
| 420 } | 430 } |
| 421 | 431 |
| 432 void GrInOrderDrawBuffer::onDrawPaths(size_t pathCount, const GrPath** paths, |
| 433 const SkMatrix* transforms, |
| 434 SkPath::FillType fill, |
| 435 SkStrokeRec::Style stroke, |
| 436 const GrDeviceCoordTexture* dstCopy) { |
| 437 SkASSERT(pathCount); |
| 438 |
| 439 if (this->needsNewClip()) { |
| 440 this->recordClip(); |
| 441 } |
| 442 if (this->needsNewState()) { |
| 443 this->recordState(); |
| 444 } |
| 445 DrawPaths* dp = this->recordDrawPaths(); |
| 446 dp->fPathCount = pathCount; |
| 447 dp->fPaths = SkNEW_ARRAY(const GrPath*, pathCount); |
| 448 memcpy(dp->fPaths, paths, sizeof(GrPath*) * pathCount); |
| 449 for (size_t i = 0; i < pathCount; ++i) { |
| 450 dp->fPaths[i]->ref(); |
| 451 } |
| 452 |
| 453 dp->fTransforms = SkNEW_ARRAY(SkMatrix, pathCount); |
| 454 memcpy(dp->fTransforms, transforms, sizeof(SkMatrix) * pathCount); |
| 455 |
| 456 dp->fFill = fill; |
| 457 dp->fStroke = stroke; |
| 458 |
| 459 if (NULL != dstCopy) { |
| 460 dp->fDstCopy = *dstCopy; |
| 461 } |
| 462 } |
| 463 |
| 422 void GrInOrderDrawBuffer::clear(const SkIRect* rect, GrColor color, | 464 void GrInOrderDrawBuffer::clear(const SkIRect* rect, GrColor color, |
| 423 bool canIgnoreRect, GrRenderTarget* renderTarget
) { | 465 bool canIgnoreRect, GrRenderTarget* renderTarget
) { |
| 424 SkIRect r; | 466 SkIRect r; |
| 425 if (NULL == renderTarget) { | 467 if (NULL == renderTarget) { |
| 426 renderTarget = this->drawState()->getRenderTarget(); | 468 renderTarget = this->drawState()->getRenderTarget(); |
| 427 SkASSERT(NULL != renderTarget); | 469 SkASSERT(NULL != renderTarget); |
| 428 } | 470 } |
| 429 if (NULL == rect) { | 471 if (NULL == rect) { |
| 430 // We could do something smart and remove previous draws and clears to | 472 // We could do something smart and remove previous draws and clears to |
| 431 // the current render target. If we get that smart we have to make sure | 473 // the current render target. If we get that smart we have to make sure |
| (...skipping 28 matching lines...) Expand all Loading... |
| 460 int numDraws = fDraws.count(); | 502 int numDraws = fDraws.count(); |
| 461 for (int d = 0; d < numDraws; ++d) { | 503 for (int d = 0; d < numDraws; ++d) { |
| 462 // we always have a VB, but not always an IB | 504 // we always have a VB, but not always an IB |
| 463 SkASSERT(NULL != fDraws[d].fVertexBuffer); | 505 SkASSERT(NULL != fDraws[d].fVertexBuffer); |
| 464 fDraws[d].fVertexBuffer->unref(); | 506 fDraws[d].fVertexBuffer->unref(); |
| 465 SkSafeUnref(fDraws[d].fIndexBuffer); | 507 SkSafeUnref(fDraws[d].fIndexBuffer); |
| 466 } | 508 } |
| 467 fCmds.reset(); | 509 fCmds.reset(); |
| 468 fDraws.reset(); | 510 fDraws.reset(); |
| 469 fStencilPaths.reset(); | 511 fStencilPaths.reset(); |
| 512 fDrawPath.reset(); |
| 470 fDrawPaths.reset(); | 513 fDrawPaths.reset(); |
| 471 fStates.reset(); | 514 fStates.reset(); |
| 472 fClears.reset(); | 515 fClears.reset(); |
| 473 fVertexPool.reset(); | 516 fVertexPool.reset(); |
| 474 fIndexPool.reset(); | 517 fIndexPool.reset(); |
| 475 fClips.reset(); | 518 fClips.reset(); |
| 476 fClipOrigins.reset(); | 519 fClipOrigins.reset(); |
| 477 fCopySurfaces.reset(); | 520 fCopySurfaces.reset(); |
| 478 fClipSet = true; | 521 fClipSet = true; |
| 479 } | 522 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 506 fDstGpu->setDrawState(&playbackState); | 549 fDstGpu->setDrawState(&playbackState); |
| 507 | 550 |
| 508 GrClipData clipData; | 551 GrClipData clipData; |
| 509 | 552 |
| 510 int currState = 0; | 553 int currState = 0; |
| 511 int currClip = 0; | 554 int currClip = 0; |
| 512 int currClear = 0; | 555 int currClear = 0; |
| 513 int currDraw = 0; | 556 int currDraw = 0; |
| 514 int currStencilPath = 0; | 557 int currStencilPath = 0; |
| 515 int currDrawPath = 0; | 558 int currDrawPath = 0; |
| 559 int currDrawPaths = 0; |
| 516 int currCopySurface = 0; | 560 int currCopySurface = 0; |
| 517 | 561 |
| 518 for (int c = 0; c < numCmds; ++c) { | 562 for (int c = 0; c < numCmds; ++c) { |
| 519 switch (fCmds[c]) { | 563 switch (fCmds[c]) { |
| 520 case kDraw_Cmd: { | 564 case kDraw_Cmd: { |
| 521 const DrawRecord& draw = fDraws[currDraw]; | 565 const DrawRecord& draw = fDraws[currDraw]; |
| 522 fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); | 566 fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); |
| 523 if (draw.isIndexed()) { | 567 if (draw.isIndexed()) { |
| 524 fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); | 568 fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); |
| 525 } | 569 } |
| 526 fDstGpu->executeDraw(draw); | 570 fDstGpu->executeDraw(draw); |
| 527 | 571 |
| 528 ++currDraw; | 572 ++currDraw; |
| 529 break; | 573 break; |
| 530 } | 574 } |
| 531 case kStencilPath_Cmd: { | 575 case kStencilPath_Cmd: { |
| 532 const StencilPath& sp = fStencilPaths[currStencilPath]; | 576 const StencilPath& sp = fStencilPaths[currStencilPath]; |
| 533 fDstGpu->stencilPath(sp.fPath.get(), sp.fFill); | 577 fDstGpu->stencilPath(sp.fPath.get(), sp.fFill); |
| 534 ++currStencilPath; | 578 ++currStencilPath; |
| 535 break; | 579 break; |
| 536 } | 580 } |
| 537 case kDrawPath_Cmd: { | 581 case kDrawPath_Cmd: { |
| 538 const DrawPath& cp = fDrawPaths[currDrawPath]; | 582 const DrawPath& cp = fDrawPath[currDrawPath]; |
| 539 fDstGpu->executeDrawPath(cp.fPath.get(), cp.fFill, | 583 fDstGpu->executeDrawPath(cp.fPath.get(), cp.fFill, |
| 540 NULL != cp.fDstCopy.texture() ? &cp.fDs
tCopy : NULL); | 584 NULL != cp.fDstCopy.texture() ? &cp.fDs
tCopy : NULL); |
| 541 ++currDrawPath; | 585 ++currDrawPath; |
| 542 break; | 586 break; |
| 543 } | 587 } |
| 588 case kDrawPaths_Cmd: { |
| 589 DrawPaths& dp = fDrawPaths[currDrawPaths]; |
| 590 const GrDeviceCoordTexture* dstCopy = |
| 591 NULL != dp.fDstCopy.texture() ? &dp.fDstCopy : NULL; |
| 592 fDstGpu->executeDrawPaths(dp.fPathCount, dp.fPaths, |
| 593 dp.fTransforms, dp.fFill, dp.fStroke, |
| 594 dstCopy); |
| 595 ++currDrawPaths; |
| 596 break; |
| 597 } |
| 544 case kSetState_Cmd: | 598 case kSetState_Cmd: |
| 545 fStates[currState].restoreTo(&playbackState); | 599 fStates[currState].restoreTo(&playbackState); |
| 546 ++currState; | 600 ++currState; |
| 547 break; | 601 break; |
| 548 case kSetClip_Cmd: | 602 case kSetClip_Cmd: |
| 549 clipData.fClipStack = &fClips[currClip]; | 603 clipData.fClipStack = &fClips[currClip]; |
| 550 clipData.fOrigin = fClipOrigins[currClip]; | 604 clipData.fOrigin = fClipOrigins[currClip]; |
| 551 fDstGpu->setClip(&clipData); | 605 fDstGpu->setClip(&clipData); |
| 552 ++currClip; | 606 ++currClip; |
| 553 break; | 607 break; |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 return &fDraws.push_back(info); | 900 return &fDraws.push_back(info); |
| 847 } | 901 } |
| 848 | 902 |
| 849 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { | 903 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { |
| 850 fCmds.push_back(kStencilPath_Cmd); | 904 fCmds.push_back(kStencilPath_Cmd); |
| 851 return &fStencilPaths.push_back(); | 905 return &fStencilPaths.push_back(); |
| 852 } | 906 } |
| 853 | 907 |
| 854 GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() { | 908 GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() { |
| 855 fCmds.push_back(kDrawPath_Cmd); | 909 fCmds.push_back(kDrawPath_Cmd); |
| 910 return &fDrawPath.push_back(); |
| 911 } |
| 912 |
| 913 GrInOrderDrawBuffer::DrawPaths* GrInOrderDrawBuffer::recordDrawPaths() { |
| 914 fCmds.push_back(kDrawPaths_Cmd); |
| 856 return &fDrawPaths.push_back(); | 915 return &fDrawPaths.push_back(); |
| 857 } | 916 } |
| 858 | 917 |
| 859 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { | 918 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { |
| 860 fCmds.push_back(kClear_Cmd); | 919 fCmds.push_back(kClear_Cmd); |
| 861 return &fClears.push_back(); | 920 return &fClears.push_back(); |
| 862 } | 921 } |
| 863 | 922 |
| 864 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { | 923 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { |
| 865 fCmds.push_back(kCopySurface_Cmd); | 924 fCmds.push_back(kCopySurface_Cmd); |
| 866 return &fCopySurfaces.push_back(); | 925 return &fCopySurfaces.push_back(); |
| 867 } | 926 } |
| 868 | 927 |
| 869 | 928 |
| 870 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | 929 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
| 871 INHERITED::clipWillBeSet(newClipData); | 930 INHERITED::clipWillBeSet(newClipData); |
| 872 fClipSet = true; | 931 fClipSet = true; |
| 873 fClipProxyState = kUnknown_ClipProxyState; | 932 fClipProxyState = kUnknown_ClipProxyState; |
| 874 } | 933 } |
| OLD | NEW |