| 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 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 default: | 378 default: |
| 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() : fStroke(SkStrokeRec::kFill_Ini
tStyle) {} | 387 GrInOrderDrawBuffer::StencilPath::StencilPath() : fStroke(SkStrokeRec::kFill_Ini
tStyle) {} |
| 388 GrInOrderDrawBuffer::FillPath::FillPath() : fStroke(SkStrokeRec::kFill_InitStyle
) {} |
| 388 | 389 |
| 389 void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, const SkStrokeRec& s
troke, | 390 void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, const SkStrokeRec& s
troke, |
| 390 SkPath::FillType fill) { | 391 SkPath::FillType fill) { |
| 391 if (this->needsNewClip()) { | 392 if (this->needsNewClip()) { |
| 392 this->recordClip(); | 393 this->recordClip(); |
| 393 } | 394 } |
| 394 // Only compare the subset of GrDrawState relevant to path stenciling? | 395 // Only compare the subset of GrDrawState relevant to path stenciling? |
| 395 if (this->needsNewState()) { | 396 if (this->needsNewState()) { |
| 396 this->recordState(); | 397 this->recordState(); |
| 397 } | 398 } |
| 398 StencilPath* sp = this->recordStencilPath(); | 399 StencilPath* sp = this->recordStencilPath(); |
| 399 sp->fPath.reset(path); | 400 sp->fPath.reset(path); |
| 400 path->ref(); | 401 path->ref(); |
| 401 sp->fFill = fill; | 402 sp->fFill = fill; |
| 402 sp->fStroke = stroke; | 403 sp->fStroke = stroke; |
| 403 } | 404 } |
| 404 | 405 |
| 406 void GrInOrderDrawBuffer::onFillPath(const GrPath* path, const SkStrokeRec& stro
ke, |
| 407 SkPath::FillType fill, const GrDeviceCoordT
exture*) { |
| 408 if (this->needsNewClip()) { |
| 409 this->recordClip(); |
| 410 } |
| 411 // TODO: Only compare the subset of GrDrawState relevant to path covering? |
| 412 if (this->needsNewState()) { |
| 413 this->recordState(); |
| 414 } |
| 415 FillPath* cp = this->recordFillPath(); |
| 416 cp->fPath.reset(path); |
| 417 path->ref(); |
| 418 cp->fFill = fill; |
| 419 cp->fStroke = stroke; |
| 420 } |
| 421 |
| 405 void GrInOrderDrawBuffer::clear(const SkIRect* rect, GrColor color, GrRenderTarg
et* renderTarget) { | 422 void GrInOrderDrawBuffer::clear(const SkIRect* rect, GrColor color, GrRenderTarg
et* renderTarget) { |
| 406 SkIRect r; | 423 SkIRect r; |
| 407 if (NULL == renderTarget) { | 424 if (NULL == renderTarget) { |
| 408 renderTarget = this->drawState()->getRenderTarget(); | 425 renderTarget = this->drawState()->getRenderTarget(); |
| 409 SkASSERT(NULL != renderTarget); | 426 SkASSERT(NULL != renderTarget); |
| 410 } | 427 } |
| 411 if (NULL == rect) { | 428 if (NULL == rect) { |
| 412 // We could do something smart and remove previous draws and clears to | 429 // We could do something smart and remove previous draws and clears to |
| 413 // the current render target. If we get that smart we have to make sure | 430 // the current render target. If we get that smart we have to make sure |
| 414 // those draws aren't read before this clear (render-to-texture). | 431 // those draws aren't read before this clear (render-to-texture). |
| (...skipping 14 matching lines...) Expand all Loading... |
| 429 int numDraws = fDraws.count(); | 446 int numDraws = fDraws.count(); |
| 430 for (int d = 0; d < numDraws; ++d) { | 447 for (int d = 0; d < numDraws; ++d) { |
| 431 // we always have a VB, but not always an IB | 448 // we always have a VB, but not always an IB |
| 432 SkASSERT(NULL != fDraws[d].fVertexBuffer); | 449 SkASSERT(NULL != fDraws[d].fVertexBuffer); |
| 433 fDraws[d].fVertexBuffer->unref(); | 450 fDraws[d].fVertexBuffer->unref(); |
| 434 SkSafeUnref(fDraws[d].fIndexBuffer); | 451 SkSafeUnref(fDraws[d].fIndexBuffer); |
| 435 } | 452 } |
| 436 fCmds.reset(); | 453 fCmds.reset(); |
| 437 fDraws.reset(); | 454 fDraws.reset(); |
| 438 fStencilPaths.reset(); | 455 fStencilPaths.reset(); |
| 456 fFillPaths.reset(); |
| 439 fStates.reset(); | 457 fStates.reset(); |
| 440 fClears.reset(); | 458 fClears.reset(); |
| 441 fVertexPool.reset(); | 459 fVertexPool.reset(); |
| 442 fIndexPool.reset(); | 460 fIndexPool.reset(); |
| 443 fClips.reset(); | 461 fClips.reset(); |
| 444 fClipOrigins.reset(); | 462 fClipOrigins.reset(); |
| 445 fCopySurfaces.reset(); | 463 fCopySurfaces.reset(); |
| 446 fClipSet = true; | 464 fClipSet = true; |
| 447 } | 465 } |
| 448 | 466 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 473 prevDrawState->ref(); | 491 prevDrawState->ref(); |
| 474 fDstGpu->setDrawState(&playbackState); | 492 fDstGpu->setDrawState(&playbackState); |
| 475 | 493 |
| 476 GrClipData clipData; | 494 GrClipData clipData; |
| 477 | 495 |
| 478 int currState = 0; | 496 int currState = 0; |
| 479 int currClip = 0; | 497 int currClip = 0; |
| 480 int currClear = 0; | 498 int currClear = 0; |
| 481 int currDraw = 0; | 499 int currDraw = 0; |
| 482 int currStencilPath = 0; | 500 int currStencilPath = 0; |
| 501 int currFillPath = 0; |
| 483 int currCopySurface = 0; | 502 int currCopySurface = 0; |
| 484 | 503 |
| 485 for (int c = 0; c < numCmds; ++c) { | 504 for (int c = 0; c < numCmds; ++c) { |
| 486 switch (fCmds[c]) { | 505 switch (fCmds[c]) { |
| 487 case kDraw_Cmd: { | 506 case kDraw_Cmd: { |
| 488 const DrawRecord& draw = fDraws[currDraw]; | 507 const DrawRecord& draw = fDraws[currDraw]; |
| 489 fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); | 508 fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); |
| 490 if (draw.isIndexed()) { | 509 if (draw.isIndexed()) { |
| 491 fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); | 510 fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); |
| 492 } | 511 } |
| 493 fDstGpu->executeDraw(draw); | 512 fDstGpu->executeDraw(draw); |
| 494 | 513 |
| 495 ++currDraw; | 514 ++currDraw; |
| 496 break; | 515 break; |
| 497 } | 516 } |
| 498 case kStencilPath_Cmd: { | 517 case kStencilPath_Cmd: { |
| 499 const StencilPath& sp = fStencilPaths[currStencilPath]; | 518 const StencilPath& sp = fStencilPaths[currStencilPath]; |
| 500 fDstGpu->stencilPath(sp.fPath.get(), sp.fStroke, sp.fFill); | 519 fDstGpu->stencilPath(sp.fPath.get(), sp.fStroke, sp.fFill); |
| 501 ++currStencilPath; | 520 ++currStencilPath; |
| 502 break; | 521 break; |
| 503 } | 522 } |
| 523 case kFillPath_Cmd: { |
| 524 const FillPath& cp = fFillPaths[currFillPath]; |
| 525 fDstGpu->fillPath(cp.fPath.get(), cp.fStroke, cp.fFill); |
| 526 ++currFillPath; |
| 527 break; |
| 528 } |
| 504 case kSetState_Cmd: | 529 case kSetState_Cmd: |
| 505 fStates[currState].restoreTo(&playbackState); | 530 fStates[currState].restoreTo(&playbackState); |
| 506 ++currState; | 531 ++currState; |
| 507 break; | 532 break; |
| 508 case kSetClip_Cmd: | 533 case kSetClip_Cmd: |
| 509 clipData.fClipStack = &fClips[currClip]; | 534 clipData.fClipStack = &fClips[currClip]; |
| 510 clipData.fOrigin = fClipOrigins[currClip]; | 535 clipData.fOrigin = fClipOrigins[currClip]; |
| 511 fDstGpu->setClip(&clipData); | 536 fDstGpu->setClip(&clipData); |
| 512 ++currClip; | 537 ++currClip; |
| 513 break; | 538 break; |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo&
info) { | 828 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo&
info) { |
| 804 fCmds.push_back(kDraw_Cmd); | 829 fCmds.push_back(kDraw_Cmd); |
| 805 return &fDraws.push_back(info); | 830 return &fDraws.push_back(info); |
| 806 } | 831 } |
| 807 | 832 |
| 808 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { | 833 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { |
| 809 fCmds.push_back(kStencilPath_Cmd); | 834 fCmds.push_back(kStencilPath_Cmd); |
| 810 return &fStencilPaths.push_back(); | 835 return &fStencilPaths.push_back(); |
| 811 } | 836 } |
| 812 | 837 |
| 838 GrInOrderDrawBuffer::FillPath* GrInOrderDrawBuffer::recordFillPath() { |
| 839 fCmds.push_back(kFillPath_Cmd); |
| 840 return &fFillPaths.push_back(); |
| 841 } |
| 842 |
| 813 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { | 843 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { |
| 814 fCmds.push_back(kClear_Cmd); | 844 fCmds.push_back(kClear_Cmd); |
| 815 return &fClears.push_back(); | 845 return &fClears.push_back(); |
| 816 } | 846 } |
| 817 | 847 |
| 818 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { | 848 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { |
| 819 fCmds.push_back(kCopySurface_Cmd); | 849 fCmds.push_back(kCopySurface_Cmd); |
| 820 return &fCopySurfaces.push_back(); | 850 return &fCopySurfaces.push_back(); |
| 821 } | 851 } |
| 822 | 852 |
| 823 | 853 |
| 824 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | 854 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
| 825 INHERITED::clipWillBeSet(newClipData); | 855 INHERITED::clipWillBeSet(newClipData); |
| 826 fClipSet = true; | 856 fClipSet = true; |
| 827 fClipProxyState = kUnknown_ClipProxyState; | 857 fClipProxyState = kUnknown_ClipProxyState; |
| 828 } | 858 } |
| OLD | NEW |