Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: src/gpu/GrDrawContext.cpp

Issue 2132073002: Pre-crop filled rects to avoid scissor (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/gpu/GrClipMaskManager.cpp ('K') | « src/gpu/GrClipMaskManager.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 } 267 }
268 return false; 268 return false;
269 } else { 269 } else {
270 if (useHWAA) { 270 if (useHWAA) {
271 *useHWAA = rt->isUnifiedMultisampled(); 271 *useHWAA = rt->isUnifiedMultisampled();
272 } 272 }
273 return !rt->isUnifiedMultisampled(); 273 return !rt->isUnifiedMultisampled();
274 } 274 }
275 } 275 }
276 276
277 GrDrawBatch* GrDrawContext::getFillRectBatch(const GrPaint& paint, 277 enum class TrimResult {
278 const SkMatrix& viewMatrix, 278 kSkipDraw,
279 const SkRect& rect, 279 kDidTrim,
280 bool* useHWAA) { 280 kDidNotTrim
281 };
282
283 static TrimResult trim_fill_rect(const GrClip& clip, const GrRenderTarget* rt,
284 const SkMatrix& viewMatrix, SkRect* rect) {
285 SkMatrix inverseVM;
286 if (viewMatrix.rectStaysRect() && viewMatrix.invert(&inverseVM)) {
287 SkASSERT(inverseVM.rectStaysRect());
288 SkIRect clipDevBounds;
289 clip.getConservativeBounds(rt->width(), rt->height(), &clipDevBounds);
290 SkRect clipUserSpaceBounds;
291 inverseVM.mapRect(&clipUserSpaceBounds, SkRect::Make(clipDevBounds));
292 if (!rect->intersect(clipUserSpaceBounds)) {
293 return TrimResult::kSkipDraw;
294 }
295 return TrimResult::kDidTrim;
296 }
297 return TrimResult::kDidNotTrim;
298 }
299
300 bool GrDrawContext::getFillRectBatch(const GrClip& clip,
301 const GrPaint& paint,
302 const SkMatrix& viewMatrix,
303 const SkRect& rect,
304 SkAutoTUnref<GrDrawBatch>* batch,
305 bool* useHWAA) {
306 SkRect trimRect = rect;
307 if (TrimResult::kSkipDraw == trim_fill_rect(clip, fRenderTarget.get(), viewM atrix, &trimRect)) {
308 return false;
309 }
310
281 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { 311 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) {
282 if (GrDrawBatch* batch = ir->recordRect(rect, viewMatrix, paint.getColor (), 312 batch->reset(ir->recordRect(trimRect, viewMatrix, paint.getColor(), pain t.isAntiAlias(),
283 paint.isAntiAlias(), fInstancedP ipelineInfo, 313 fInstancedPipelineInfo, useHWAA));
284 useHWAA)) { 314 if (batch) {
285 return batch; 315 return true;
286 } 316 }
287 } 317 }
288 318
289 if (should_apply_coverage_aa(paint, fRenderTarget.get(), useHWAA)) { 319 if (should_apply_coverage_aa(paint, fRenderTarget.get(), useHWAA)) {
290 // The fill path can handle rotation but not skew. 320 // The fill path can handle rotation but not skew.
291 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { 321 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
292 SkRect devBoundRect; 322 SkRect devBoundRect;
293 viewMatrix.mapRect(&devBoundRect, rect); 323 viewMatrix.mapRect(&devBoundRect, trimRect);
294 return GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatrix , 324 batch->reset(GrRectBatchFactory::CreateAAFill(paint.getColor(), view Matrix, trimRect,
295 rect, devBoundRect); 325 devBoundRect));
296 } 326 }
297 } else { 327 } else {
298 // filled BW rect 328 // filled BW rect
299 return GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect, 329 batch->reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewM atrix, trimRect,
300 nullptr, nullptr); 330 nullptr, nullptr));
301 } 331 }
302 332
303 return nullptr; 333 return true;
304 } 334 }
305 335
306 void GrDrawContext::drawRect(const GrClip& clip, 336 void GrDrawContext::drawRect(const GrClip& clip,
307 const GrPaint& paint, 337 const GrPaint& paint,
308 const SkMatrix& viewMatrix, 338 const SkMatrix& viewMatrix,
309 const SkRect& rect, 339 const SkRect& rect,
310 const GrStyle* style) { 340 const GrStyle* style) {
311 if (!style) { 341 if (!style) {
312 style = &GrStyle::SimpleFill(); 342 style = &GrStyle::SimpleFill();
313 } 343 }
(...skipping 30 matching lines...) Expand all
344 rect_contains_inclusive(rect, srcSpaceRTQuad[2]) && 374 rect_contains_inclusive(rect, srcSpaceRTQuad[2]) &&
345 rect_contains_inclusive(rect, srcSpaceRTQuad[3])) { 375 rect_contains_inclusive(rect, srcSpaceRTQuad[3])) {
346 // Will it blend? 376 // Will it blend?
347 GrColor clearColor; 377 GrColor clearColor;
348 if (paint.isConstantBlendedColor(&clearColor)) { 378 if (paint.isConstantBlendedColor(&clearColor)) {
349 this->getDrawTarget()->clear(nullptr, clearColor, true, this ); 379 this->getDrawTarget()->clear(nullptr, clearColor, true, this );
350 return; 380 return;
351 } 381 }
352 } 382 }
353 } 383 }
354 batch.reset(this->getFillRectBatch(paint, viewMatrix, rect, &useHWAA)); 384 if (!this->getFillRectBatch(clip, paint, viewMatrix, rect, &batch, &useH WAA)) {
385 return;
386 }
355 } else if (stroke.getStyle() == SkStrokeRec::kStroke_Style || 387 } else if (stroke.getStyle() == SkStrokeRec::kStroke_Style ||
356 stroke.getStyle() == SkStrokeRec::kHairline_Style) { 388 stroke.getStyle() == SkStrokeRec::kHairline_Style) {
357 if ((!rect.width() || !rect.height()) && 389 if ((!rect.width() || !rect.height()) &&
358 SkStrokeRec::kHairline_Style != stroke.getStyle()) { 390 SkStrokeRec::kHairline_Style != stroke.getStyle()) {
359 SkScalar r = stroke.getWidth() / 2; 391 SkScalar r = stroke.getWidth() / 2;
360 // TODO: Move these stroke->fill fallbacks to GrShape? 392 // TODO: Move these stroke->fill fallbacks to GrShape?
361 switch (stroke.getJoin()) { 393 switch (stroke.getJoin()) {
362 case SkPaint::kMiter_Join: 394 case SkPaint::kMiter_Join:
363 this->drawRect(clip, paint, viewMatrix, 395 this->drawRect(clip, paint, viewMatrix,
364 {rect.fLeft - r, rect.fTop - r, 396 {rect.fLeft - r, rect.fTop - r,
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 SkDEBUGCODE(fDrawContext->validate();) 511 SkDEBUGCODE(fDrawContext->validate();)
480 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawAnd StencilRect"); 512 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawAnd StencilRect");
481 513
482 AutoCheckFlush acf(fDrawContext->fDrawingManager); 514 AutoCheckFlush acf(fDrawContext->fDrawingManager);
483 515
484 GrPaint paint; 516 GrPaint paint;
485 paint.setAntiAlias(doAA); 517 paint.setAntiAlias(doAA);
486 paint.setCoverageSetOpXPFactory(op, invert); 518 paint.setCoverageSetOpXPFactory(op, invert);
487 519
488 bool useHWAA; 520 bool useHWAA;
489 SkAutoTUnref<GrDrawBatch> batch( 521 SkAutoTUnref<GrDrawBatch> batch;
490 fDrawContext->getFillRectBatch(paint, viewMatrix, rect, &useHWAA)); 522 if (!fDrawContext->getFillRectBatch(clip, paint, viewMatrix, rect, &batch, & useHWAA)) {
523 return true;
524 }
491 if (batch) { 525 if (batch) {
492 GrPipelineBuilder pipelineBuilder(paint, useHWAA); 526 GrPipelineBuilder pipelineBuilder(paint, useHWAA);
493 pipelineBuilder.setUserStencil(ss); 527 pipelineBuilder.setUserStencil(ss);
494 528
495 fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, fDrawContext, clip, batch); 529 fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, fDrawContext, clip, batch);
496 return true; 530 return true;
497 } 531 }
498 532
499 SkPath path; 533 SkPath path;
500 path.setIsVolatile(true); 534 path.setIsVolatile(true);
501 path.addRect(rect); 535 path.addRect(rect);
502 return this->drawAndStencilPath(clip, ss, op, invert, doAA, viewMatrix, path ); 536 return this->drawAndStencilPath(clip, ss, op, invert, doAA, viewMatrix, path );
503 } 537 }
504 538
505 void GrDrawContext::fillRectToRect(const GrClip& clip, 539 void GrDrawContext::fillRectToRect(const GrClip& clip,
506 const GrPaint& paint, 540 const GrPaint& paint,
507 const SkMatrix& viewMatrix, 541 const SkMatrix& viewMatrix,
508 const SkRect& rectToDraw, 542 const SkRect& rectToDraw,
509 const SkRect& localRect) { 543 const SkRect& localRect) {
510 ASSERT_SINGLE_OWNER 544 ASSERT_SINGLE_OWNER
511 RETURN_IF_ABANDONED 545 RETURN_IF_ABANDONED
512 SkDEBUGCODE(this->validate();) 546 SkDEBUGCODE(this->validate();)
513 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect"); 547 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect");
514 548
515 AutoCheckFlush acf(fDrawingManager); 549 AutoCheckFlush acf(fDrawingManager);
516 SkAutoTUnref<GrDrawBatch> batch; 550 SkAutoTUnref<GrDrawBatch> batch;
517 bool useHWAA; 551 bool useHWAA;
518 552
553 SkRect trimRect = rectToDraw;
554 TrimResult trimResult = trim_fill_rect(clip, fRenderTarget.get(), viewMatrix , &trimRect);
555 if (TrimResult::kSkipDraw == trimResult) {
556 return;
557 }
558 SkRect trimLocalRect = localRect;
559 if (TrimResult::kDidTrim == trimResult) {
560 SkScalar dx = localRect.width() / rectToDraw.width();
561 SkScalar dy = localRect.height() / rectToDraw.height();
562 trimLocalRect.fLeft += (trimRect.fLeft - rectToDraw.fLeft) * dx;
563 trimLocalRect.fTop += (trimRect.fTop - rectToDraw.fTop) * dy;
564 trimLocalRect.fRight -= (rectToDraw.fRight - trimRect.fRight) * dx;
565 trimLocalRect.fTop -= (rectToDraw.fTop - trimRect.fTop) * dy;
566 }
567
519 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { 568 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) {
520 batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), loc alRect, 569 batch.reset(ir->recordRect(trimRect, viewMatrix, paint.getColor(), trimL ocalRect,
521 paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA)); 570 paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA));
522 if (batch) { 571 if (batch) {
523 GrPipelineBuilder pipelineBuilder(paint, useHWAA); 572 GrPipelineBuilder pipelineBuilder(paint, useHWAA);
524 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ; 573 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ;
525 return; 574 return;
526 } 575 }
527 } 576 }
528 577
529 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && 578 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) &&
530 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { 579 view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
531 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie wMatrix, rectToDraw, 580 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie wMatrix, trimRect,
532 localRect)); 581 trimLocalRect));
533 } else { 582 } else {
534 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa trix, rectToDraw, 583 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa trix, trimRect,
535 &localRect, nullptr)); 584 &trimLocalRect, nullptr) );
536 } 585 }
537 586
538 if (batch) { 587 if (batch) {
539 GrPipelineBuilder pipelineBuilder(paint, useHWAA); 588 GrPipelineBuilder pipelineBuilder(paint, useHWAA);
540 this->drawBatch(pipelineBuilder, clip, batch); 589 this->drawBatch(pipelineBuilder, clip, batch);
541 } 590 }
542 } 591 }
543 592
544 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, 593 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip,
545 const GrPaint& paint, 594 const GrPaint& paint,
546 const SkMatrix& viewMatrix, 595 const SkMatrix& viewMatrix,
547 const SkRect& rectToDraw, 596 const SkRect& rectToDraw,
548 const SkMatrix& localMatrix) { 597 const SkMatrix& localMatrix) {
549 ASSERT_SINGLE_OWNER 598 ASSERT_SINGLE_OWNER
550 RETURN_IF_ABANDONED 599 RETURN_IF_ABANDONED
551 SkDEBUGCODE(this->validate();) 600 SkDEBUGCODE(this->validate();)
552 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatr ix"); 601 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatr ix");
553 602
554 AutoCheckFlush acf(fDrawingManager); 603 AutoCheckFlush acf(fDrawingManager);
555 SkAutoTUnref<GrDrawBatch> batch; 604 SkAutoTUnref<GrDrawBatch> batch;
556 bool useHWAA; 605 bool useHWAA;
557 606
607 SkRect trimRect = rectToDraw;
608 if (TrimResult::kSkipDraw == trim_fill_rect(clip, fRenderTarget.get(), viewM atrix, &trimRect)) {
609 return;
610 }
611
558 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { 612 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) {
559 batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), loc alMatrix, 613 batch.reset(ir->recordRect(trimRect, viewMatrix, paint.getColor(), local Matrix,
560 paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA)); 614 paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA));
561 if (batch) { 615 if (batch) {
562 GrPipelineBuilder pipelineBuilder(paint, useHWAA); 616 GrPipelineBuilder pipelineBuilder(paint, useHWAA);
563 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ; 617 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ;
564 return; 618 return;
565 } 619 }
566 } 620 }
567 621
568 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && 622 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) &&
569 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { 623 view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
570 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca lMatrix, 624 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca lMatrix, trimRect));
571 rectToDraw));
572 } else { 625 } else {
573 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa trix, rectToDraw, 626 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa trix, trimRect,
574 nullptr, &localMatrix)); 627 nullptr, &localMatrix));
575 } 628 }
576 629
577 GrPipelineBuilder pipelineBuilder(paint, useHWAA); 630 GrPipelineBuilder pipelineBuilder(paint, useHWAA);
578 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); 631 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch);
579 } 632 }
580 633
581 void GrDrawContext::drawVertices(const GrClip& clip, 634 void GrDrawContext::drawVertices(const GrClip& clip,
582 const GrPaint& paint, 635 const GrPaint& paint,
583 const SkMatrix& viewMatrix, 636 const SkMatrix& viewMatrix,
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 1171
1119 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr Clip& clip, 1172 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr Clip& clip,
1120 GrDrawBatch* batch) { 1173 GrDrawBatch* batch) {
1121 ASSERT_SINGLE_OWNER 1174 ASSERT_SINGLE_OWNER
1122 RETURN_IF_ABANDONED 1175 RETURN_IF_ABANDONED
1123 SkDEBUGCODE(this->validate();) 1176 SkDEBUGCODE(this->validate();)
1124 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); 1177 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch");
1125 1178
1126 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); 1179 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch);
1127 } 1180 }
OLDNEW
« src/gpu/GrClipMaskManager.cpp ('K') | « src/gpu/GrClipMaskManager.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698