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

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

Issue 1161063003: Revert "Revert of Move copy-surface-as-draw fallback to GrGLGpu. (patchset #12 id:220001 of https:/… (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: update Created 5 years, 6 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
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/GrGpu.h » ('j') | 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 /* 2 /*
3 * Copyright 2010 Google Inc. 3 * Copyright 2010 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 "GrDrawTarget.h" 9 #include "GrDrawTarget.h"
10 10
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 desc.fHeight = copyRect.height(); 97 desc.fHeight = copyRect.height();
98 98
99 SkAutoTUnref<GrTexture> copy( 99 SkAutoTUnref<GrTexture> copy(
100 fResourceProvider->refScratchTexture(desc, GrTextureProvider::kApprox_Sc ratchTexMatch)); 100 fResourceProvider->refScratchTexture(desc, GrTextureProvider::kApprox_Sc ratchTexMatch));
101 101
102 if (!copy) { 102 if (!copy) {
103 SkDebugf("Failed to create temporary copy of destination texture.\n"); 103 SkDebugf("Failed to create temporary copy of destination texture.\n");
104 return false; 104 return false;
105 } 105 }
106 SkIPoint dstPoint = {0, 0}; 106 SkIPoint dstPoint = {0, 0};
107 if (this->copySurface(copy, rt, copyRect, dstPoint)) { 107 this->copySurface(copy, rt, copyRect, dstPoint);
108 dstTexture->setTexture(copy); 108 dstTexture->setTexture(copy);
109 dstTexture->setOffset(copyRect.fLeft, copyRect.fTop); 109 dstTexture->setOffset(copyRect.fLeft, copyRect.fTop);
110 return true; 110 return true;
111 } else {
112 return false;
113 }
114 } 111 }
115 112
116 void GrDrawTarget::flush() { 113 void GrDrawTarget::flush() {
117 if (fFlushing) { 114 if (fFlushing) {
118 return; 115 return;
119 } 116 }
120 fFlushing = true; 117 fFlushing = true;
121 118
122 this->getGpu()->saveActiveTraceMarkers(); 119 this->getGpu()->saveActiveTraceMarkers();
123 120
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 if (clippedDstPoint->fY + clippedSrcRect->height() > dst->height()) { 423 if (clippedDstPoint->fY + clippedSrcRect->height() > dst->height()) {
427 clippedSrcRect->fBottom = clippedSrcRect->fTop + dst->height() - clipped DstPoint->fY; 424 clippedSrcRect->fBottom = clippedSrcRect->fTop + dst->height() - clipped DstPoint->fY;
428 } 425 }
429 426
430 // The above clipping steps may have inverted the rect if it didn't intersec t either the src or 427 // The above clipping steps may have inverted the rect if it didn't intersec t either the src or
431 // dst bounds. 428 // dst bounds.
432 return !clippedSrcRect->isEmpty(); 429 return !clippedSrcRect->isEmpty();
433 } 430 }
434 } 431 }
435 432
436 bool GrDrawTarget::copySurface(GrSurface* dst, 433 void GrDrawTarget::copySurface(GrSurface* dst,
437 GrSurface* src, 434 GrSurface* src,
438 const SkIRect& srcRect, 435 const SkIRect& srcRect,
439 const SkIPoint& dstPoint) { 436 const SkIPoint& dstPoint) {
440 SkASSERT(dst); 437 SkASSERT(dst);
441 SkASSERT(src); 438 SkASSERT(src);
442 439
443 SkIRect clippedSrcRect; 440 SkIRect clippedSrcRect;
444 SkIPoint clippedDstPoint; 441 SkIPoint clippedDstPoint;
445 // If the rect is outside the src or dst then we've already succeeded. 442 // If the rect is outside the src or dst then we've already succeeded.
446 if (!clip_srcrect_and_dstpoint(dst, 443 if (!clip_srcrect_and_dstpoint(dst,
447 src, 444 src,
448 srcRect, 445 srcRect,
449 dstPoint, 446 dstPoint,
450 &clippedSrcRect, 447 &clippedSrcRect,
451 &clippedDstPoint)) { 448 &clippedDstPoint)) {
452 return true; 449 return;
453 } 450 }
454 451
455 if (this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPoint )) { 452 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint);
456 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint);
457 return true;
458 }
459
460 GrRenderTarget* rt = dst->asRenderTarget();
461 GrTexture* tex = src->asTexture();
462
463 if ((dst == src) || !rt || !tex) {
464 return false;
465 }
466
467 GrPipelineBuilder pipelineBuilder;
468 pipelineBuilder.setRenderTarget(rt);
469 SkMatrix matrix;
470 matrix.setTranslate(SkIntToScalar(clippedSrcRect.fLeft - clippedDstPoint.fX) ,
471 SkIntToScalar(clippedSrcRect.fTop - clippedDstPoint.fY)) ;
472 matrix.postIDiv(tex->width(), tex->height());
473 pipelineBuilder.addColorTextureProcessor(tex, matrix);
474 SkIRect dstRect = SkIRect::MakeXYWH(clippedDstPoint.fX,
475 clippedDstPoint.fY,
476 clippedSrcRect.width(),
477 clippedSrcRect.height());
478 this->drawSimpleRect(&pipelineBuilder, GrColor_WHITE, SkMatrix::I(), dstRect );
479 return true;
480 }
481
482 bool GrDrawTarget::canCopySurface(const GrSurface* dst,
483 const GrSurface* src,
484 const SkIRect& srcRect,
485 const SkIPoint& dstPoint) {
486 SkASSERT(dst);
487 SkASSERT(src);
488
489 SkIRect clippedSrcRect;
490 SkIPoint clippedDstPoint;
491 // If the rect is outside the src or dst then we're guaranteed success
492 if (!clip_srcrect_and_dstpoint(dst,
493 src,
494 srcRect,
495 dstPoint,
496 &clippedSrcRect,
497 &clippedDstPoint)) {
498 return true;
499 }
500 return ((dst != src) && dst->asRenderTarget() && src->asTexture()) ||
501 this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPo int);
502 } 453 }
503 454
504 void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, 455 void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo,
505 GrPipeline* pipeline) { 456 GrPipeline* pipeline) {
506 SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder, 457 SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder,
507 pipelineInfo.fColorPOI, 458 pipelineInfo.fColorPOI,
508 pipelineInfo.fCoveragePOI, 459 pipelineInfo.fCoveragePOI,
509 *this->caps(), 460 *this->caps(),
510 *pipelineInfo.fScissor, 461 *pipelineInfo.fScissor,
511 &pipelineInfo.fDstTexture)); 462 &pipelineInfo.fDstTexture));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 ars, 511 ars,
561 scissorState, 512 scissorState,
562 devBounds); 513 devBounds);
563 } 514 }
564 515
565 void GrClipTarget::purgeResources() { 516 void GrClipTarget::purgeResources() {
566 // The clip mask manager can rebuild all its clip masks so just 517 // The clip mask manager can rebuild all its clip masks so just
567 // get rid of them all. 518 // get rid of them all.
568 fClipMaskManager->purgeResources(); 519 fClipMaskManager->purgeResources();
569 }; 520 };
OLDNEW
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/GrGpu.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698