OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "GrBatchTest.h" | 8 #include "GrBatchTest.h" |
9 #include "GrColor.h" | 9 #include "GrColor.h" |
10 #include "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
11 #include "GrDrawContextPriv.h" | 11 #include "GrDrawContextPriv.h" |
12 #include "GrDrawingManager.h" | 12 #include "GrDrawingManager.h" |
13 #include "GrOvalRenderer.h" | 13 #include "GrOvalRenderer.h" |
14 #include "GrPathRenderer.h" | 14 #include "GrPathRenderer.h" |
15 #include "GrRenderTarget.h" | 15 #include "GrRenderTarget.h" |
16 #include "GrRenderTargetPriv.h" | 16 #include "GrRenderTargetPriv.h" |
17 #include "GrResourceProvider.h" | 17 #include "GrResourceProvider.h" |
18 #include "SkSurfacePriv.h" | 18 #include "SkSurfacePriv.h" |
19 | 19 |
20 #include "batches/GrBatch.h" | 20 #include "batches/GrBatch.h" |
21 #include "batches/GrDrawAtlasBatch.h" | 21 #include "batches/GrDrawAtlasBatch.h" |
22 #include "batches/GrDrawVerticesBatch.h" | 22 #include "batches/GrDrawVerticesBatch.h" |
23 #include "batches/GrRectBatchFactory.h" | 23 #include "batches/GrRectBatchFactory.h" |
24 #include "batches/GrNinePatch.h" // TODO Factory | 24 #include "batches/GrNinePatch.h" // TODO Factory |
25 | 25 |
26 #include "effects/GrRRectEffect.h" | 26 #include "effects/GrRRectEffect.h" |
27 | 27 |
| 28 #include "instanced/InstancedRendering.h" |
| 29 |
28 #include "text/GrAtlasTextContext.h" | 30 #include "text/GrAtlasTextContext.h" |
29 #include "text/GrStencilAndCoverTextContext.h" | 31 #include "text/GrStencilAndCoverTextContext.h" |
30 | 32 |
31 #include "../private/GrAuditTrail.h" | 33 #include "../private/GrAuditTrail.h" |
32 | 34 |
33 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fDrawingM
anager->getContext()) | 35 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fDrawingM
anager->getContext()) |
34 #define ASSERT_SINGLE_OWNER \ | 36 #define ASSERT_SINGLE_OWNER \ |
35 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fSingleOwner);) | 37 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fSingleOwner);) |
36 #define ASSERT_SINGLE_OWNER_PRIV \ | 38 #define ASSERT_SINGLE_OWNER_PRIV \ |
37 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fDrawContext->fSing
leOwner);) | 39 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fDrawContext->fSing
leOwner);) |
38 #define RETURN_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return
; } | 40 #define RETURN_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return
; } |
39 #define RETURN_IF_ABANDONED_PRIV if (fDrawContext->fDrawingManager->wasAbandon
ed()) { return; } | 41 #define RETURN_IF_ABANDONED_PRIV if (fDrawContext->fDrawingManager->wasAbandon
ed()) { return; } |
40 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return
false; } | 42 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return
false; } |
41 #define RETURN_FALSE_IF_ABANDONED_PRIV if (fDrawContext->fDrawingManager->wasAb
andoned()) { return false; } | 43 #define RETURN_FALSE_IF_ABANDONED_PRIV if (fDrawContext->fDrawingManager->wasAb
andoned()) { return false; } |
42 #define RETURN_NULL_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return
nullptr; } | 44 #define RETURN_NULL_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return
nullptr; } |
43 | 45 |
| 46 using gr_instanced::InstancedRendering; |
| 47 |
44 class AutoCheckFlush { | 48 class AutoCheckFlush { |
45 public: | 49 public: |
46 AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingMa
nager) { | 50 AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingMa
nager) { |
47 SkASSERT(fDrawingManager); | 51 SkASSERT(fDrawingManager); |
48 } | 52 } |
49 ~AutoCheckFlush() { fDrawingManager->getContext()->flushIfNecessary(); } | 53 ~AutoCheckFlush() { fDrawingManager->getContext()->flushIfNecessary(); } |
50 | 54 |
51 private: | 55 private: |
52 GrDrawingManager* fDrawingManager; | 56 GrDrawingManager* fDrawingManager; |
53 }; | 57 }; |
54 | 58 |
55 bool GrDrawContext::wasAbandoned() const { | 59 bool GrDrawContext::wasAbandoned() const { |
56 return fDrawingManager->wasAbandoned(); | 60 return fDrawingManager->wasAbandoned(); |
57 } | 61 } |
58 | 62 |
59 // In MDB mode the reffing of the 'getLastDrawTarget' call's result allows in-pr
ogress | 63 // In MDB mode the reffing of the 'getLastDrawTarget' call's result allows in-pr
ogress |
60 // drawTargets to be picked up and added to by drawContexts lower in the call | 64 // drawTargets to be picked up and added to by drawContexts lower in the call |
61 // stack. When this occurs with a closed drawTarget, a new one will be allocated | 65 // stack. When this occurs with a closed drawTarget, a new one will be allocated |
62 // when the drawContext attempts to use it (via getDrawTarget). | 66 // when the drawContext attempts to use it (via getDrawTarget). |
63 GrDrawContext::GrDrawContext(GrContext* context, | 67 GrDrawContext::GrDrawContext(GrContext* context, |
64 GrDrawingManager* drawingMgr, | 68 GrDrawingManager* drawingMgr, |
65 sk_sp<GrRenderTarget> rt, | 69 sk_sp<GrRenderTarget> rt, |
66 const SkSurfaceProps* surfaceProps, | 70 const SkSurfaceProps* surfaceProps, |
67 GrAuditTrail* auditTrail, | 71 GrAuditTrail* auditTrail, |
68 GrSingleOwner* singleOwner) | 72 GrSingleOwner* singleOwner) |
69 : fDrawingManager(drawingMgr) | 73 : fDrawingManager(drawingMgr) |
70 , fRenderTarget(std::move(rt)) | 74 , fRenderTarget(std::move(rt)) |
71 , fDrawTarget(SkSafeRef(fRenderTarget->getLastDrawTarget())) | 75 , fDrawTarget(SkSafeRef(fRenderTarget->getLastDrawTarget())) |
72 , fContext(context) | 76 , fContext(context) |
| 77 , fInstancedPipelineInfo(fRenderTarget.get()) |
73 , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) | 78 , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) |
74 , fAuditTrail(auditTrail) | 79 , fAuditTrail(auditTrail) |
75 #ifdef SK_DEBUG | 80 #ifdef SK_DEBUG |
76 , fSingleOwner(singleOwner) | 81 , fSingleOwner(singleOwner) |
77 #endif | 82 #endif |
78 { | 83 { |
79 SkDEBUGCODE(this->validate();) | 84 SkDEBUGCODE(this->validate();) |
80 } | 85 } |
81 | 86 |
82 #ifdef SK_DEBUG | 87 #ifdef SK_DEBUG |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 *useHWAA = rt->isUnifiedMultisampled(); | 271 *useHWAA = rt->isUnifiedMultisampled(); |
267 } | 272 } |
268 return !rt->isUnifiedMultisampled(); | 273 return !rt->isUnifiedMultisampled(); |
269 } | 274 } |
270 } | 275 } |
271 | 276 |
272 GrDrawBatch* GrDrawContext::getFillRectBatch(const GrPaint& paint, | 277 GrDrawBatch* GrDrawContext::getFillRectBatch(const GrPaint& paint, |
273 const SkMatrix& viewMatrix, | 278 const SkMatrix& viewMatrix, |
274 const SkRect& rect, | 279 const SkRect& rect, |
275 bool* useHWAA) { | 280 bool* useHWAA) { |
| 281 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
| 282 if (GrDrawBatch* batch = ir->recordRect(rect, viewMatrix, paint.getColor
(), |
| 283 paint.isAntiAlias(), fInstancedP
ipelineInfo, |
| 284 useHWAA)) { |
| 285 return batch; |
| 286 } |
| 287 } |
276 | 288 |
277 GrDrawBatch* batch = nullptr; | |
278 if (should_apply_coverage_aa(paint, fRenderTarget.get(), useHWAA)) { | 289 if (should_apply_coverage_aa(paint, fRenderTarget.get(), useHWAA)) { |
279 // The fill path can handle rotation but not skew. | 290 // The fill path can handle rotation but not skew. |
280 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 291 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
281 SkRect devBoundRect; | 292 SkRect devBoundRect; |
282 viewMatrix.mapRect(&devBoundRect, rect); | 293 viewMatrix.mapRect(&devBoundRect, rect); |
283 batch = GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatri
x, | 294 return GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatrix
, |
284 rect, devBoundRect); | 295 rect, devBoundRect); |
285 } | 296 } |
286 } else { | 297 } else { |
287 // filled BW rect | 298 // filled BW rect |
288 batch = GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix
, rect, | 299 return GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix,
rect, |
289 nullptr, nullptr); | 300 nullptr, nullptr); |
290 } | 301 } |
291 | 302 |
292 return batch; | 303 return nullptr; |
293 } | 304 } |
294 | 305 |
295 void GrDrawContext::drawRect(const GrClip& clip, | 306 void GrDrawContext::drawRect(const GrClip& clip, |
296 const GrPaint& paint, | 307 const GrPaint& paint, |
297 const SkMatrix& viewMatrix, | 308 const SkMatrix& viewMatrix, |
298 const SkRect& rect, | 309 const SkRect& rect, |
299 const GrStyle* style) { | 310 const GrStyle* style) { |
300 if (!style) { | 311 if (!style) { |
301 style = &GrStyle::SimpleFill(); | 312 style = &GrStyle::SimpleFill(); |
302 } | 313 } |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 const GrPaint& paint, | 483 const GrPaint& paint, |
473 const SkMatrix& viewMatrix, | 484 const SkMatrix& viewMatrix, |
474 const SkRect& rectToDraw, | 485 const SkRect& rectToDraw, |
475 const SkRect& localRect) { | 486 const SkRect& localRect) { |
476 ASSERT_SINGLE_OWNER | 487 ASSERT_SINGLE_OWNER |
477 RETURN_IF_ABANDONED | 488 RETURN_IF_ABANDONED |
478 SkDEBUGCODE(this->validate();) | 489 SkDEBUGCODE(this->validate();) |
479 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect"); | 490 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect"); |
480 | 491 |
481 AutoCheckFlush acf(fDrawingManager); | 492 AutoCheckFlush acf(fDrawingManager); |
| 493 SkAutoTUnref<GrDrawBatch> batch; |
| 494 bool useHWAA; |
482 | 495 |
483 bool useHWAA; | 496 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
484 SkAutoTUnref<GrDrawBatch> batch; | 497 batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), loc
alRect, |
| 498 paint.isAntiAlias(), fInstancedPipelineInfo,
&useHWAA)); |
| 499 if (batch) { |
| 500 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
| 501 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; |
| 502 return; |
| 503 } |
| 504 } |
| 505 |
485 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && | 506 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && |
486 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 507 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
487 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie
wMatrix, rectToDraw, | 508 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie
wMatrix, rectToDraw, |
488 localRect)); | 509 localRect)); |
489 } else { | 510 } else { |
490 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, | 511 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, |
491 &localRect, nullptr)); | 512 &localRect, nullptr)); |
492 } | 513 } |
493 | 514 |
494 if (batch) { | 515 if (batch) { |
495 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 516 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
496 this->drawBatch(pipelineBuilder, clip, batch); | 517 this->drawBatch(pipelineBuilder, clip, batch); |
497 } | 518 } |
498 } | 519 } |
499 | 520 |
500 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, | 521 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
501 const GrPaint& paint, | 522 const GrPaint& paint, |
502 const SkMatrix& viewMatrix, | 523 const SkMatrix& viewMatrix, |
503 const SkRect& rectToDraw, | 524 const SkRect& rectToDraw, |
504 const SkMatrix& localMatrix) { | 525 const SkMatrix& localMatrix) { |
505 ASSERT_SINGLE_OWNER | 526 ASSERT_SINGLE_OWNER |
506 RETURN_IF_ABANDONED | 527 RETURN_IF_ABANDONED |
507 SkDEBUGCODE(this->validate();) | 528 SkDEBUGCODE(this->validate();) |
508 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatr
ix"); | 529 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatr
ix"); |
509 | 530 |
510 AutoCheckFlush acf(fDrawingManager); | 531 AutoCheckFlush acf(fDrawingManager); |
| 532 SkAutoTUnref<GrDrawBatch> batch; |
| 533 bool useHWAA; |
511 | 534 |
512 bool useHWAA; | 535 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
513 SkAutoTUnref<GrDrawBatch> batch; | 536 batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), loc
alMatrix, |
| 537 paint.isAntiAlias(), fInstancedPipelineInfo,
&useHWAA)); |
| 538 if (batch) { |
| 539 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
| 540 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; |
| 541 return; |
| 542 } |
| 543 } |
| 544 |
514 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && | 545 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && |
515 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 546 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
516 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca
lMatrix, | 547 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca
lMatrix, |
517 rectToDraw)); | 548 rectToDraw)); |
518 } else { | 549 } else { |
519 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, | 550 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, |
520 nullptr, &localMatrix)); | 551 nullptr, &localMatrix)); |
521 } | 552 } |
522 | 553 |
523 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 554 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 ASSERT_SINGLE_OWNER | 635 ASSERT_SINGLE_OWNER |
605 RETURN_IF_ABANDONED | 636 RETURN_IF_ABANDONED |
606 SkDEBUGCODE(this->validate();) | 637 SkDEBUGCODE(this->validate();) |
607 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawRRect"); | 638 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawRRect"); |
608 | 639 |
609 if (rrect.isEmpty()) { | 640 if (rrect.isEmpty()) { |
610 return; | 641 return; |
611 } | 642 } |
612 | 643 |
613 SkASSERT(!style.pathEffect()); // this should've been devolved to a path in
SkGpuDevice | 644 SkASSERT(!style.pathEffect()); // this should've been devolved to a path in
SkGpuDevice |
| 645 |
| 646 AutoCheckFlush acf(fDrawingManager); |
614 const SkStrokeRec stroke = style.strokeRec(); | 647 const SkStrokeRec stroke = style.strokeRec(); |
615 AutoCheckFlush acf(fDrawingManager); | 648 bool useHWAA; |
616 | 649 |
617 bool useHWAA; | 650 if (this->getDrawTarget()->instancedRendering() && stroke.isFillStyle()) { |
| 651 InstancedRendering* ir = this->getDrawTarget()->instancedRendering(); |
| 652 SkAutoTUnref<GrDrawBatch> batch(ir->recordRRect(rrect, viewMatrix, paint
.getColor(), |
| 653 paint.isAntiAlias(), fIn
stancedPipelineInfo, |
| 654 &useHWAA)); |
| 655 if (batch) { |
| 656 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
| 657 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; |
| 658 return; |
| 659 } |
| 660 } |
| 661 |
618 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) { | 662 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) { |
619 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); | 663 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
620 | |
621 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(paint.g
etColor(), | 664 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(paint.g
etColor(), |
622 viewMat
rix, | 665 viewMat
rix, |
623 rrect, | 666 rrect, |
624 stroke, | 667 stroke, |
625 shaderC
aps)); | 668 shaderC
aps)); |
626 if (batch) { | 669 if (batch) { |
627 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 670 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
628 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; | 671 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; |
629 return; | 672 return; |
630 } | 673 } |
631 } | 674 } |
632 | 675 |
633 SkPath path; | 676 SkPath path; |
634 path.setIsVolatile(true); | 677 path.setIsVolatile(true); |
635 path.addRRect(rrect); | 678 path.addRRect(rrect); |
636 this->internalDrawPath(clip, paint, viewMatrix, path, style); | 679 this->internalDrawPath(clip, paint, viewMatrix, path, style); |
637 } | 680 } |
638 | 681 |
639 bool GrDrawContext::drawFilledDRRect(const GrClip& clip, | 682 bool GrDrawContext::drawFilledDRRect(const GrClip& clip, |
640 const GrPaint& paintIn, | 683 const GrPaint& paintIn, |
641 const SkMatrix& viewMatrix, | 684 const SkMatrix& viewMatrix, |
642 const SkRRect& origOuter, | 685 const SkRRect& origOuter, |
643 const SkRRect& origInner) { | 686 const SkRRect& origInner) { |
644 SkASSERT(!origInner.isEmpty()); | 687 SkASSERT(!origInner.isEmpty()); |
645 SkASSERT(!origOuter.isEmpty()); | 688 SkASSERT(!origOuter.isEmpty()); |
646 | 689 |
| 690 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
| 691 bool useHWAA; |
| 692 SkAutoTUnref<GrDrawBatch> batch(ir->recordDRRect(origOuter, origInner, v
iewMatrix, |
| 693 paintIn.getColor(), pai
ntIn.isAntiAlias(), |
| 694 fInstancedPipelineInfo,
&useHWAA)); |
| 695 if (batch) { |
| 696 GrPipelineBuilder pipelineBuilder(paintIn, useHWAA); |
| 697 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; |
| 698 return true; |
| 699 } |
| 700 } |
| 701 |
647 bool applyAA = paintIn.isAntiAlias() && !fRenderTarget->isUnifiedMultisample
d(); | 702 bool applyAA = paintIn.isAntiAlias() && !fRenderTarget->isUnifiedMultisample
d(); |
648 | 703 |
649 GrPrimitiveEdgeType innerEdgeType = applyAA ? kInverseFillAA_GrProcessorEdge
Type : | 704 GrPrimitiveEdgeType innerEdgeType = applyAA ? kInverseFillAA_GrProcessorEdge
Type : |
650 kInverseFillBW_GrProcessorEdge
Type; | 705 kInverseFillBW_GrProcessorEdge
Type; |
651 GrPrimitiveEdgeType outerEdgeType = applyAA ? kFillAA_GrProcessorEdgeType : | 706 GrPrimitiveEdgeType outerEdgeType = applyAA ? kFillAA_GrProcessorEdgeType : |
652 kFillBW_GrProcessorEdgeType; | 707 kFillBW_GrProcessorEdgeType; |
653 | 708 |
654 SkTCopyOnFirstWrite<SkRRect> inner(origInner), outer(origOuter); | 709 SkTCopyOnFirstWrite<SkRRect> inner(origInner), outer(origOuter); |
655 SkMatrix inverseVM; | 710 SkMatrix inverseVM; |
656 if (!viewMatrix.isIdentity()) { | 711 if (!viewMatrix.isIdentity()) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 | 790 |
736 if (oval.isEmpty()) { | 791 if (oval.isEmpty()) { |
737 return; | 792 return; |
738 } | 793 } |
739 | 794 |
740 SkASSERT(!style.pathEffect()); // this should've been devolved to a path in
SkGpuDevice | 795 SkASSERT(!style.pathEffect()); // this should've been devolved to a path in
SkGpuDevice |
741 | 796 |
742 AutoCheckFlush acf(fDrawingManager); | 797 AutoCheckFlush acf(fDrawingManager); |
743 const SkStrokeRec& stroke = style.strokeRec(); | 798 const SkStrokeRec& stroke = style.strokeRec(); |
744 bool useHWAA; | 799 bool useHWAA; |
| 800 |
| 801 if (this->getDrawTarget()->instancedRendering() && stroke.isFillStyle()) { |
| 802 InstancedRendering* ir = this->getDrawTarget()->instancedRendering(); |
| 803 SkAutoTUnref<GrDrawBatch> batch(ir->recordOval(oval, viewMatrix, paint.g
etColor(), |
| 804 paint.isAntiAlias(), fIns
tancedPipelineInfo, |
| 805 &useHWAA)); |
| 806 if (batch) { |
| 807 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
| 808 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; |
| 809 return; |
| 810 } |
| 811 } |
| 812 |
745 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) { | 813 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) { |
746 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); | 814 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
747 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.ge
tColor(), | 815 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.ge
tColor(), |
748 viewMatr
ix, | 816 viewMatr
ix, |
749 oval, | 817 oval, |
750 stroke, | 818 stroke, |
751 shaderCa
ps)); | 819 shaderCa
ps)); |
752 if (batch) { | 820 if (batch) { |
753 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 821 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
754 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; | 822 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch)
; |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1064 | 1132 |
1065 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr
Clip& clip, | 1133 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr
Clip& clip, |
1066 GrDrawBatch* batch) { | 1134 GrDrawBatch* batch) { |
1067 ASSERT_SINGLE_OWNER | 1135 ASSERT_SINGLE_OWNER |
1068 RETURN_IF_ABANDONED | 1136 RETURN_IF_ABANDONED |
1069 SkDEBUGCODE(this->validate();) | 1137 SkDEBUGCODE(this->validate();) |
1070 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 1138 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
1071 | 1139 |
1072 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); | 1140 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
1073 } | 1141 } |
OLD | NEW |