| OLD | NEW |
| 1 | |
| 2 /* | 1 /* |
| 3 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 4 * | 3 * |
| 5 * 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 |
| 6 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 7 */ | 6 */ |
| 8 | 7 |
| 9 #include "GrBatchTest.h" | 8 #include "GrBatchTest.h" |
| 10 #include "GrColor.h" | 9 #include "GrColor.h" |
| 11 #include "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 36 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fSingleOwner);) | 35 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fSingleOwner);) |
| 37 #define ASSERT_SINGLE_OWNER_PRIV \ | 36 #define ASSERT_SINGLE_OWNER_PRIV \ |
| 38 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fDrawContext->fSing
leOwner);) | 37 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fDrawContext->fSing
leOwner);) |
| 39 #define RETURN_IF_ABANDONED if (fDrawingManager->abandoned()) { return; } | 38 #define RETURN_IF_ABANDONED if (fDrawingManager->abandoned()) { return; } |
| 40 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->abandoned()) { return fa
lse; } | 39 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->abandoned()) { return fa
lse; } |
| 41 #define RETURN_FALSE_IF_ABANDONED_PRIV if (fDrawContext->fDrawingManager->aband
oned()) { return false; } | 40 #define RETURN_FALSE_IF_ABANDONED_PRIV if (fDrawContext->fDrawingManager->aband
oned()) { return false; } |
| 42 #define RETURN_NULL_IF_ABANDONED if (fDrawingManager->abandoned()) { return nu
llptr; } | 41 #define RETURN_NULL_IF_ABANDONED if (fDrawingManager->abandoned()) { return nu
llptr; } |
| 43 | 42 |
| 44 class AutoCheckFlush { | 43 class AutoCheckFlush { |
| 45 public: | 44 public: |
| 46 AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingMa
nager) { | 45 AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingMa
nager) { |
| 47 SkASSERT(fDrawingManager); | 46 SkASSERT(fDrawingManager); |
| 48 } | 47 } |
| 49 ~AutoCheckFlush() { fDrawingManager->getContext()->flushIfNecessary(); } | 48 ~AutoCheckFlush() { fDrawingManager->getContext()->flushIfNecessary(); } |
| 50 | 49 |
| 51 private: | 50 private: |
| 52 GrDrawingManager* fDrawingManager; | 51 GrDrawingManager* fDrawingManager; |
| 53 }; | 52 }; |
| 54 | 53 |
| 55 // In MDB mode the reffing of the 'getLastDrawTarget' call's result allows in-pr
ogress | 54 // In MDB mode the reffing of the 'getLastDrawTarget' call's result allows in-pr
ogress |
| 56 // drawTargets to be picked up and added to by drawContexts lower in the call | 55 // drawTargets to be picked up and added to by drawContexts lower in the call |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 // The fill path can handle rotation but not skew. | 262 // The fill path can handle rotation but not skew. |
| 264 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 263 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
| 265 SkRect devBoundRect; | 264 SkRect devBoundRect; |
| 266 viewMatrix.mapRect(&devBoundRect, rect); | 265 viewMatrix.mapRect(&devBoundRect, rect); |
| 267 batch = GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatri
x, | 266 batch = GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatri
x, |
| 268 rect, devBoundRect); | 267 rect, devBoundRect); |
| 269 } | 268 } |
| 270 } else { | 269 } else { |
| 271 // filled BW rect | 270 // filled BW rect |
| 272 batch = GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix
, rect, | 271 batch = GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix
, rect, |
| 273 nullptr, nullptr); | 272 nullptr, nullptr); |
| 274 } | 273 } |
| 275 | 274 |
| 276 return batch; | 275 return batch; |
| 277 } | 276 } |
| 278 | 277 |
| 279 void GrDrawContext::drawRect(const GrClip& clip, | 278 void GrDrawContext::drawRect(const GrClip& clip, |
| 280 const GrPaint& paint, | 279 const GrPaint& paint, |
| 281 const SkMatrix& viewMatrix, | 280 const SkMatrix& viewMatrix, |
| 282 const SkRect& rect, | 281 const SkRect& rect, |
| 283 const GrStrokeInfo* strokeInfo) { | 282 const GrStrokeInfo* strokeInfo) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 *strokeInfo)); | 340 *strokeInfo)); |
| 342 } | 341 } |
| 343 } else { | 342 } else { |
| 344 // Non-AA hairlines are snapped to pixel centers to make which pixel
s are hit | 343 // Non-AA hairlines are snapped to pixel centers to make which pixel
s are hit |
| 345 // deterministic | 344 // deterministic |
| 346 snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultisa
mpled()); | 345 snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultisa
mpled()); |
| 347 batch.reset(GrRectBatchFactory::CreateNonAAStroke(color, viewMatrix,
rect, | 346 batch.reset(GrRectBatchFactory::CreateNonAAStroke(color, viewMatrix,
rect, |
| 348 width, snapToPixel
Centers)); | 347 width, snapToPixel
Centers)); |
| 349 | 348 |
| 350 // Depending on sub-pixel coordinates and the particular GPU, we may
lose a corner of | 349 // Depending on sub-pixel coordinates and the particular GPU, we may
lose a corner of |
| 351 // hairline rects. We jam all the vertices to pixel centers to avoid
this, but not | 350 // hairline rects. We jam all the vertices to pixel centers to avoid
this, but not |
| 352 // when MSAA is enabled because it can cause ugly artifacts. | 351 // when MSAA is enabled because it can cause ugly artifacts. |
| 353 } | 352 } |
| 354 } | 353 } |
| 355 | 354 |
| 356 if (batch) { | 355 if (batch) { |
| 357 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 356 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 358 | 357 |
| 359 if (snapToPixelCenters) { | 358 if (snapToPixelCenters) { |
| 360 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCent
ers_Flag, | 359 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCent
ers_Flag, |
| 361 snapToPixelCenters); | 360 snapToPixelCenters); |
| 362 } | 361 } |
| 363 | 362 |
| 364 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 363 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 365 return; | 364 return; |
| 366 } | 365 } |
| 367 | 366 |
| 368 SkPath path; | 367 SkPath path; |
| 369 path.setIsVolatile(true); | 368 path.setIsVolatile(true); |
| 370 path.addRect(rect); | 369 path.addRect(rect); |
| 371 this->internalDrawPath(clip, paint, viewMatrix, path, | 370 this->internalDrawPath(clip, paint, viewMatrix, path, |
| 372 strokeInfo ? *strokeInfo : GrStrokeInfo::FillInfo()); | 371 strokeInfo ? *strokeInfo : GrStrokeInfo::FillInfo()); |
| 373 } | 372 } |
| 374 | 373 |
| 375 bool GrDrawContextPriv::drawAndStencilRect(const SkIRect* scissorRect, | 374 bool GrDrawContextPriv::drawAndStencilRect(const SkIRect* scissorRect, |
| 376 const GrStencilSettings& ss, | 375 const GrStencilSettings& ss, |
| 377 SkRegion::Op op, | 376 SkRegion::Op op, |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 int spriteCount, | 511 int spriteCount, |
| 513 const SkRSXform xform[], | 512 const SkRSXform xform[], |
| 514 const SkRect texRect[], | 513 const SkRect texRect[], |
| 515 const SkColor colors[]) { | 514 const SkColor colors[]) { |
| 516 ASSERT_SINGLE_OWNER | 515 ASSERT_SINGLE_OWNER |
| 517 RETURN_IF_ABANDONED | 516 RETURN_IF_ABANDONED |
| 518 SkDEBUGCODE(this->validate();) | 517 SkDEBUGCODE(this->validate();) |
| 519 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawAtlas"); | 518 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawAtlas"); |
| 520 | 519 |
| 521 AutoCheckFlush acf(fDrawingManager); | 520 AutoCheckFlush acf(fDrawingManager); |
| 522 | 521 |
| 523 GrDrawAtlasBatch::Geometry geometry; | 522 GrDrawAtlasBatch::Geometry geometry; |
| 524 geometry.fColor = paint.getColor(); | 523 geometry.fColor = paint.getColor(); |
| 525 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, | 524 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, |
| 526 xform, texRect, col
ors)); | 525 xform, texRect, col
ors)); |
| 527 | 526 |
| 528 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 527 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 529 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 528 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 530 } | 529 } |
| 531 | 530 |
| 532 /////////////////////////////////////////////////////////////////////////////// | 531 /////////////////////////////////////////////////////////////////////////////// |
| 533 | 532 |
| 534 void GrDrawContext::drawRRect(const GrClip& clip, | 533 void GrDrawContext::drawRRect(const GrClip& clip, |
| 535 const GrPaint& paint, | 534 const GrPaint& paint, |
| 536 const SkMatrix& viewMatrix, | 535 const SkMatrix& viewMatrix, |
| 537 const SkRRect& rrect, | 536 const SkRRect& rrect, |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 592 return false; | 591 return false; |
| 593 } | 592 } |
| 594 if (!origOuter.transform(viewMatrix, outer.writable())) { | 593 if (!origOuter.transform(viewMatrix, outer.writable())) { |
| 595 return false; | 594 return false; |
| 596 } | 595 } |
| 597 if (!viewMatrix.invert(&inverseVM)) { | 596 if (!viewMatrix.invert(&inverseVM)) { |
| 598 return false; | 597 return false; |
| 599 } | 598 } |
| 600 } else { | 599 } else { |
| 601 inverseVM.reset(); | 600 inverseVM.reset(); |
| 602 } | 601 } |
| 603 | 602 |
| 604 GrPaint grPaint(paintIn); | 603 GrPaint grPaint(paintIn); |
| 605 grPaint.setAntiAlias(false); | 604 grPaint.setAntiAlias(false); |
| 606 | 605 |
| 607 // TODO these need to be a geometry processors | 606 // TODO these need to be a geometry processors |
| 608 SkAutoTUnref<GrFragmentProcessor> innerEffect(GrRRectEffect::Create(innerEdg
eType, *inner)); | 607 SkAutoTUnref<GrFragmentProcessor> innerEffect(GrRRectEffect::Create(innerEdg
eType, *inner)); |
| 609 if (!innerEffect) { | 608 if (!innerEffect) { |
| 610 return false; | 609 return false; |
| 611 } | 610 } |
| 612 | 611 |
| 613 SkAutoTUnref<GrFragmentProcessor> outerEffect(GrRRectEffect::Create(outerEdg
eType, *outer)); | 612 SkAutoTUnref<GrFragmentProcessor> outerEffect(GrRRectEffect::Create(outerEdg
eType, *outer)); |
| 614 if (!outerEffect) { | 613 if (!outerEffect) { |
| 615 return false; | 614 return false; |
| 616 } | 615 } |
| 617 | 616 |
| 618 grPaint.addCoverageFragmentProcessor(innerEffect); | 617 grPaint.addCoverageFragmentProcessor(innerEffect); |
| 619 grPaint.addCoverageFragmentProcessor(outerEffect); | 618 grPaint.addCoverageFragmentProcessor(outerEffect); |
| 620 | 619 |
| 621 SkRect bounds = outer->getBounds(); | 620 SkRect bounds = outer->getBounds(); |
| 622 if (applyAA) { | 621 if (applyAA) { |
| 623 bounds.outset(SK_ScalarHalf, SK_ScalarHalf); | 622 bounds.outset(SK_ScalarHalf, SK_ScalarHalf); |
| 624 } | 623 } |
| 625 | 624 |
| 626 this->fillRectWithLocalMatrix(clip, grPaint, SkMatrix::I(), bounds, inverseV
M); | 625 this->fillRectWithLocalMatrix(clip, grPaint, SkMatrix::I(), bounds, inverseV
M); |
| 627 return true; | 626 return true; |
| 628 } | 627 } |
| 629 | 628 |
| 630 void GrDrawContext::drawDRRect(const GrClip& clip, | 629 void GrDrawContext::drawDRRect(const GrClip& clip, |
| 631 const GrPaint& paint, | 630 const GrPaint& paint, |
| 632 const SkMatrix& viewMatrix, | 631 const SkMatrix& viewMatrix, |
| 633 const SkRRect& outer, | 632 const SkRRect& outer, |
| 634 const SkRRect& inner) { | 633 const SkRRect& inner) { |
| 635 ASSERT_SINGLE_OWNER | 634 ASSERT_SINGLE_OWNER |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 bool invert, | 858 bool invert, |
| 860 bool doAA, | 859 bool doAA, |
| 861 const SkMatrix& viewMatrix, | 860 const SkMatrix& viewMatrix, |
| 862 const SkPath& path) { | 861 const SkPath& path) { |
| 863 ASSERT_SINGLE_OWNER_PRIV | 862 ASSERT_SINGLE_OWNER_PRIV |
| 864 RETURN_FALSE_IF_ABANDONED_PRIV | 863 RETURN_FALSE_IF_ABANDONED_PRIV |
| 865 SkDEBUGCODE(fDrawContext->validate();) | 864 SkDEBUGCODE(fDrawContext->validate();) |
| 866 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawPat
h"); | 865 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawPat
h"); |
| 867 | 866 |
| 868 if (path.isEmpty() && path.isInverseFillType()) { | 867 if (path.isEmpty() && path.isInverseFillType()) { |
| 869 this->drawAndStencilRect(scissorRect, ss, op, invert, false, SkMatrix::I
(), | 868 this->drawAndStencilRect(scissorRect, ss, op, invert, false, SkMatrix::I
(), |
| 870 SkRect::MakeIWH(fDrawContext->fRenderTarget->wi
dth(), | 869 SkRect::MakeIWH(fDrawContext->fRenderTarget->wi
dth(), |
| 871 fDrawContext->fRenderTarget->he
ight())); | 870 fDrawContext->fRenderTarget->he
ight())); |
| 872 return true; | 871 return true; |
| 873 } | 872 } |
| 874 | 873 |
| 875 AutoCheckFlush acf(fDrawContext->fDrawingManager); | 874 AutoCheckFlush acf(fDrawContext->fDrawingManager); |
| 876 | 875 |
| 877 // An Assumption here is that path renderer would use some form of tweaking | 876 // An Assumption here is that path renderer would use some form of tweaking |
| 878 // the src color (either the input alpha or in the frag shader) to implement | 877 // the src color (either the input alpha or in the frag shader) to implement |
| 879 // aa. If we have some future driver-mojo path AA that can do the right | 878 // aa. If we have some future driver-mojo path AA that can do the right |
| 880 // thing WRT to the blend then we'll need some query on the PR. | 879 // thing WRT to the blend then we'll need some query on the PR. |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1030 } | 1029 } |
| 1031 | 1030 |
| 1032 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 1031 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
| 1033 ASSERT_SINGLE_OWNER | 1032 ASSERT_SINGLE_OWNER |
| 1034 RETURN_IF_ABANDONED | 1033 RETURN_IF_ABANDONED |
| 1035 SkDEBUGCODE(this->validate();) | 1034 SkDEBUGCODE(this->validate();) |
| 1036 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 1035 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
| 1037 | 1036 |
| 1038 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 1037 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
| 1039 } | 1038 } |
| OLD | NEW |