| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrBatchTest.h" | 9 #include "GrBatchTest.h" |
| 10 #include "GrColor.h" | 10 #include "GrColor.h" |
| (...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 return; | 487 return; |
| 488 } | 488 } |
| 489 | 489 |
| 490 SkASSERT(!strokeInfo.isDashed()); // this should've been devolved to a path
in SkGpuDevice | 490 SkASSERT(!strokeInfo.isDashed()); // this should've been devolved to a path
in SkGpuDevice |
| 491 | 491 |
| 492 AutoCheckFlush acf(fDrawingManager); | 492 AutoCheckFlush acf(fDrawingManager); |
| 493 | 493 |
| 494 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 494 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 495 GrColor color = paint.getColor(); | 495 GrColor color = paint.getColor(); |
| 496 | 496 |
| 497 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); | 497 if (should_apply_coverage_aa(paint, fRenderTarget)) { |
| 498 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(pipelineBui
lder, | 498 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
| 499 color, | 499 |
| 500 viewMatrix, | 500 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(color, |
| 501 paint.isAnt
iAlias(), | 501 viewMat
rix, |
| 502 rrect, | 502 rrect, |
| 503 strokeInfo, | 503 strokeI
nfo, |
| 504 shaderCaps)
); | 504 shaderC
aps)); |
| 505 if (batch) { | 505 if (batch) { |
| 506 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 506 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 507 } else { | 507 return; |
| 508 SkPath path; | 508 } |
| 509 path.setIsVolatile(true); | |
| 510 path.addRRect(rrect); | |
| 511 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, | |
| 512 paint.isAntiAlias(), path, strokeInfo); | |
| 513 } | 509 } |
| 510 |
| 511 SkPath path; |
| 512 path.setIsVolatile(true); |
| 513 path.addRRect(rrect); |
| 514 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
| 515 paint.isAntiAlias(), path, strokeInfo); |
| 514 } | 516 } |
| 515 | 517 |
| 516 /////////////////////////////////////////////////////////////////////////////// | 518 /////////////////////////////////////////////////////////////////////////////// |
| 517 | 519 |
| 518 void GrDrawContext::drawOval(const GrClip& clip, | 520 void GrDrawContext::drawOval(const GrClip& clip, |
| 519 const GrPaint& paint, | 521 const GrPaint& paint, |
| 520 const SkMatrix& viewMatrix, | 522 const SkMatrix& viewMatrix, |
| 521 const SkRect& oval, | 523 const SkRect& oval, |
| 522 const GrStrokeInfo& strokeInfo) { | 524 const GrStrokeInfo& strokeInfo) { |
| 523 ASSERT_SINGLE_OWNER | 525 ASSERT_SINGLE_OWNER |
| 524 RETURN_IF_ABANDONED | 526 RETURN_IF_ABANDONED |
| 525 SkDEBUGCODE(this->validate();) | 527 SkDEBUGCODE(this->validate();) |
| 526 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawOval"); | 528 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawOval"); |
| 527 | 529 |
| 528 if (oval.isEmpty()) { | 530 if (oval.isEmpty()) { |
| 529 return; | 531 return; |
| 530 } | 532 } |
| 531 | 533 |
| 532 SkASSERT(!strokeInfo.isDashed()); // this should've been devolved to a path
in SkGpuDevice | 534 SkASSERT(!strokeInfo.isDashed()); // this should've been devolved to a path
in SkGpuDevice |
| 533 | 535 |
| 534 AutoCheckFlush acf(fDrawingManager); | 536 AutoCheckFlush acf(fDrawingManager); |
| 535 | 537 |
| 536 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 538 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 537 GrColor color = paint.getColor(); | 539 GrColor color = paint.getColor(); |
| 540 |
| 541 if (should_apply_coverage_aa(paint, fRenderTarget)) { |
| 542 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
| 543 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(color, |
| 544 viewMatr
ix, |
| 545 oval, |
| 546 strokeIn
fo, |
| 547 shaderCa
ps)); |
| 548 if (batch) { |
| 549 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 550 return; |
| 551 } |
| 552 } |
| 538 | 553 |
| 539 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); | 554 SkPath path; |
| 540 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(pipelineBuil
der, | 555 path.setIsVolatile(true); |
| 541 color, | 556 path.addOval(oval); |
| 542 viewMatrix, | 557 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
| 543 paint.isAnti
Alias(), | 558 paint.isAntiAlias(), path, strokeInfo); |
| 544 oval, | |
| 545 strokeInfo, | |
| 546 shaderCaps))
; | |
| 547 if (batch) { | |
| 548 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | |
| 549 } else { | |
| 550 SkPath path; | |
| 551 path.setIsVolatile(true); | |
| 552 path.addOval(oval); | |
| 553 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, | |
| 554 paint.isAntiAlias(), path, strokeInfo); | |
| 555 } | |
| 556 } | 559 } |
| 557 | 560 |
| 558 void GrDrawContext::drawImageNine(const GrClip& clip, | 561 void GrDrawContext::drawImageNine(const GrClip& clip, |
| 559 const GrPaint& paint, | 562 const GrPaint& paint, |
| 560 const SkMatrix& viewMatrix, | 563 const SkMatrix& viewMatrix, |
| 561 int imageWidth, | 564 int imageWidth, |
| 562 int imageHeight, | 565 int imageHeight, |
| 563 const SkIRect& center, | 566 const SkIRect& center, |
| 564 const SkRect& dst) { | 567 const SkRect& dst) { |
| 565 ASSERT_SINGLE_OWNER | 568 ASSERT_SINGLE_OWNER |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 GrColor color = paint.getColor(); | 676 GrColor color = paint.getColor(); |
| 674 | 677 |
| 675 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. | 678 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. |
| 676 // Scratch textures can be recycled after they are returned to the texture | 679 // Scratch textures can be recycled after they are returned to the texture |
| 677 // cache. This presents a potential hazard for buffered drawing. However, | 680 // cache. This presents a potential hazard for buffered drawing. However, |
| 678 // the writePixels that uploads to the scratch will perform a flush so we're | 681 // the writePixels that uploads to the scratch will perform a flush so we're |
| 679 // OK. | 682 // OK. |
| 680 AutoCheckFlush acf(fDrawingManager); | 683 AutoCheckFlush acf(fDrawingManager); |
| 681 | 684 |
| 682 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 685 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 683 if (!strokeInfo.isDashed()) { | 686 if (should_apply_coverage_aa(paint, fRenderTarget) && !strokeInfo.isDashed()
) { |
| 684 bool useCoverageAA = should_apply_coverage_aa(paint, pipelineBuilder.get
RenderTarget()); | 687 if (strokeInfo.getWidth() < 0 && !path.isConvex()) { |
| 685 | |
| 686 if (useCoverageAA && strokeInfo.getWidth() < 0 && !path.isConvex()) { | |
| 687 // Concave AA paths are expensive - try to avoid them for special ca
ses | 688 // Concave AA paths are expensive - try to avoid them for special ca
ses |
| 688 SkRect rects[2]; | 689 SkRect rects[2]; |
| 689 | 690 |
| 690 if (is_nested_rects(viewMatrix, path, strokeInfo, rects)) { | 691 if (is_nested_rects(viewMatrix, path, strokeInfo, rects)) { |
| 691 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFill
NestedRects( | 692 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFill
NestedRects( |
| 692 color, viewMatrix, rects)); | 693 color, viewMatrix, rects)); |
| 693 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 694 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 694 return; | 695 return; |
| 695 } | 696 } |
| 696 } | 697 } |
| 697 SkRect ovalRect; | 698 SkRect ovalRect; |
| 698 bool isOval = path.isOval(&ovalRect); | 699 bool isOval = path.isOval(&ovalRect); |
| 699 | 700 |
| 700 if (isOval && !path.isInverseFillType()) { | 701 if (isOval && !path.isInverseFillType()) { |
| 701 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); | 702 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
| 702 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(pipe
lineBuilder, | 703 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(colo
r, |
| 703 colo
r, | |
| 704 view
Matrix, | 704 view
Matrix, |
| 705 pain
t.isAntiAlias(), | |
| 706 oval
Rect, | 705 oval
Rect, |
| 707 stro
keInfo, | 706 stro
keInfo, |
| 708 shad
erCaps)); | 707 shad
erCaps)); |
| 709 if (batch) { | 708 if (batch) { |
| 710 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 709 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 711 return; | 710 return; |
| 712 } | 711 } |
| 713 } | 712 } |
| 714 } | 713 } |
| 715 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, | 714 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 819 } | 818 } |
| 820 | 819 |
| 821 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 820 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
| 822 ASSERT_SINGLE_OWNER | 821 ASSERT_SINGLE_OWNER |
| 823 RETURN_IF_ABANDONED | 822 RETURN_IF_ABANDONED |
| 824 SkDEBUGCODE(this->validate();) | 823 SkDEBUGCODE(this->validate();) |
| 825 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 824 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
| 826 | 825 |
| 827 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 826 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
| 828 } | 827 } |
| OLD | NEW |