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

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

Issue 1142003003: Revert of Move copy-surface-as-draw fallback to GrGLGpu. (Closed) Base URL: https://skia.googlesource.com/skia.git@vares
Patch Set: Created 5 years, 7 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 desc.fHeight = copyRect.height(); 93 desc.fHeight = copyRect.height();
94 94
95 SkAutoTUnref<GrTexture> copy(fContext->textureProvider()->refScratchTexture( desc, 95 SkAutoTUnref<GrTexture> copy(fContext->textureProvider()->refScratchTexture( desc,
96 GrTextureProvider::kApprox_ScratchTexMatch)); 96 GrTextureProvider::kApprox_ScratchTexMatch));
97 97
98 if (!copy) { 98 if (!copy) {
99 SkDebugf("Failed to create temporary copy of destination texture.\n"); 99 SkDebugf("Failed to create temporary copy of destination texture.\n");
100 return false; 100 return false;
101 } 101 }
102 SkIPoint dstPoint = {0, 0}; 102 SkIPoint dstPoint = {0, 0};
103 this->copySurface(copy, rt, copyRect, dstPoint); 103 if (this->copySurface(copy, rt, copyRect, dstPoint)) {
104 dstCopy->setTexture(copy); 104 dstCopy->setTexture(copy);
105 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); 105 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop);
106 return true; 106 return true;
107 } else {
108 return false;
109 }
107 } 110 }
108 111
109 void GrDrawTarget::flush() { 112 void GrDrawTarget::flush() {
110 if (fFlushing) { 113 if (fFlushing) {
111 return; 114 return;
112 } 115 }
113 fFlushing = true; 116 fFlushing = true;
114 117
115 this->getGpu()->saveActiveTraceMarkers(); 118 this->getGpu()->saveActiveTraceMarkers();
116 119
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 if (clippedDstPoint->fY + clippedSrcRect->height() > dst->height()) { 414 if (clippedDstPoint->fY + clippedSrcRect->height() > dst->height()) {
412 clippedSrcRect->fBottom = clippedSrcRect->fTop + dst->height() - clipped DstPoint->fY; 415 clippedSrcRect->fBottom = clippedSrcRect->fTop + dst->height() - clipped DstPoint->fY;
413 } 416 }
414 417
415 // The above clipping steps may have inverted the rect if it didn't intersec t either the src or 418 // The above clipping steps may have inverted the rect if it didn't intersec t either the src or
416 // dst bounds. 419 // dst bounds.
417 return !clippedSrcRect->isEmpty(); 420 return !clippedSrcRect->isEmpty();
418 } 421 }
419 } 422 }
420 423
421 void GrDrawTarget::copySurface(GrSurface* dst, 424 bool GrDrawTarget::copySurface(GrSurface* dst,
422 GrSurface* src, 425 GrSurface* src,
423 const SkIRect& srcRect, 426 const SkIRect& srcRect,
424 const SkIPoint& dstPoint) { 427 const SkIPoint& dstPoint) {
425 SkASSERT(dst); 428 SkASSERT(dst);
426 SkASSERT(src); 429 SkASSERT(src);
427 430
428 SkIRect clippedSrcRect; 431 SkIRect clippedSrcRect;
429 SkIPoint clippedDstPoint; 432 SkIPoint clippedDstPoint;
430 // If the rect is outside the src or dst then we've already succeeded. 433 // If the rect is outside the src or dst then we've already succeeded.
431 if (!clip_srcrect_and_dstpoint(dst, 434 if (!clip_srcrect_and_dstpoint(dst,
432 src, 435 src,
433 srcRect, 436 srcRect,
434 dstPoint, 437 dstPoint,
435 &clippedSrcRect, 438 &clippedSrcRect,
436 &clippedDstPoint)) { 439 &clippedDstPoint)) {
437 return; 440 return true;
438 } 441 }
439 442
440 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint); 443 if (this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPoint )) {
444 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint);
445 return true;
446 }
447
448 GrRenderTarget* rt = dst->asRenderTarget();
449 GrTexture* tex = src->asTexture();
450
451 if ((dst == src) || !rt || !tex) {
452 return false;
453 }
454
455 GrPipelineBuilder pipelineBuilder;
456 pipelineBuilder.setRenderTarget(rt);
457 SkMatrix matrix;
458 matrix.setTranslate(SkIntToScalar(clippedSrcRect.fLeft - clippedDstPoint.fX) ,
459 SkIntToScalar(clippedSrcRect.fTop - clippedDstPoint.fY)) ;
460 matrix.postIDiv(tex->width(), tex->height());
461 pipelineBuilder.addColorTextureProcessor(tex, matrix);
462 SkIRect dstRect = SkIRect::MakeXYWH(clippedDstPoint.fX,
463 clippedDstPoint.fY,
464 clippedSrcRect.width(),
465 clippedSrcRect.height());
466 this->drawSimpleRect(&pipelineBuilder, GrColor_WHITE, SkMatrix::I(), dstRect );
467 return true;
468 }
469
470 bool GrDrawTarget::canCopySurface(const GrSurface* dst,
471 const GrSurface* src,
472 const SkIRect& srcRect,
473 const SkIPoint& dstPoint) {
474 SkASSERT(dst);
475 SkASSERT(src);
476
477 SkIRect clippedSrcRect;
478 SkIPoint clippedDstPoint;
479 // If the rect is outside the src or dst then we're guaranteed success
480 if (!clip_srcrect_and_dstpoint(dst,
481 src,
482 srcRect,
483 dstPoint,
484 &clippedSrcRect,
485 &clippedDstPoint)) {
486 return true;
487 }
488 return ((dst != src) && dst->asRenderTarget() && src->asTexture()) ||
489 this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPo int);
441 } 490 }
442 491
443 void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, 492 void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo,
444 GrPipeline* pipeline) { 493 GrPipeline* pipeline) {
445 SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder, 494 SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder,
446 pipelineInfo.fColorPOI, 495 pipelineInfo.fColorPOI,
447 pipelineInfo.fCoveragePOI, 496 pipelineInfo.fCoveragePOI,
448 *this->caps(), 497 *this->caps(),
449 *pipelineInfo.fScissor, 498 *pipelineInfo.fScissor,
450 &pipelineInfo.fDstCopy)); 499 &pipelineInfo.fDstCopy));
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 GrPipelineBuilder::AutoRestoreFragmentProcessors* a rfp, 778 GrPipelineBuilder::AutoRestoreFragmentProcessors* a rfp,
730 GrPipelineBuilder::AutoRestoreStencil* ars, 779 GrPipelineBuilder::AutoRestoreStencil* ars,
731 GrScissorState* scissorState, 780 GrScissorState* scissorState,
732 const SkRect* devBounds) { 781 const SkRect* devBounds) {
733 return fClipMaskManager.setupClipping(pipelineBuilder, 782 return fClipMaskManager.setupClipping(pipelineBuilder,
734 arfp, 783 arfp,
735 ars, 784 ars,
736 scissorState, 785 scissorState,
737 devBounds); 786 devBounds);
738 } 787 }
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